Upgrade to Pro — share decks privately, control downloads, hide ads and more …

#1 はじめてのIT勉強会 in 札幌(2024) - リーダブルコードを読んでみよう①

#1 はじめてのIT勉強会 in 札幌(2024) - リーダブルコードを読んでみよう①

Tweet

More Decks by はじめてのIT勉強会

Other Decks in Programming

Transcript

  1. Q1. どちらが「読みやすい」と感じますか A はじめてのIT勉強会は毎週第4木曜日に定 期開催する初心者を応援する勉強会です。 はじめてのことに気軽に挑戦できる場所と して2017年4月に仙台で初開催、7年を経 て、2024年4月から札幌での開催に繋がり ました。仙台では第4水曜日に開催してい ますので遊びに来てください。札幌開催

    も、みなさま応援よろしくおねがいしま す。 B はじめてのIT勉強会は毎週第4木曜日に定 期開催する初心者を応援する勉強会です。 はじめてのことに気軽に挑戦できる場所と して2017年4月に仙台で初開催、7年を経 て、2024年4月から札幌での開催に繋がり ました。 仙台では第4水曜日に開催していますので 遊びにきてください。 札幌開催も、みなさま応援よろしくお願い します。
  2. リーダブルコードを読んでみよう • 1章 理解しやすいコード • 2章 名前に情報を詰め込む • 3章 誤解されない名前

    • 4章 美しさ • 5章 コメントすべきことを知る • 6章 コメントは正確で簡潔に • 7章 制御フローを読みやすくする
  3. リーダブルコードを読んでみよう • 8章 巨大な式を分割する • 9章 変数と読みやすさ • 10章 無関係の下位問題を抽出する

    • 11章 一度に1つのことを • 12章 コードに思いを込める • 13章 短いコードを書く • 14章 テストと読みやすさ • 15章 「分/時間カウンタ」を    設計・実装する
  4. リーダブルコードを読んでみよう • 1章 理解しやすいコード • 2章 名前に情報を詰め込む • 3章 誤解されない名前

    • 4章 美しさ • 5章 コメントすべきことを知る • 6章 コメントは正確で簡潔に • 7章 制御フローを読みやすくする
  5. 価値のあるコードを書くための手法 • テスト駆動開発(TDD) • アジャイル開発 ◦ スクラム ◦ XP •

    デザインパターン • 継続的インテグレーション(CI/CD) • 構造化プログラミング • オブジェクト指向 • etc...
  6. 価値のあるコードを書くための手法 • テスト駆動開発(TDD) • アジャイル開発 ◦ スクラム ◦ XP •

    デザインパターン • 継続的インテグレーション(CI/CD) • 構造化プログラミング • オブジェクト指向 • etc... 超優秀な先人たちの叡智
  7. 汎用的な名前は避けましょう get, set, str, text, list, map, result, buf, temp,

    obj1, obj2, size, date, hoge, foo 意 味 を 明 確 に
  8. 汎用的な名前は避けましょう get, set, str, text, list, map, result, buf, temp,

    obj1, obj2, size, date, hoge, foo 意 味 を 明 確 に
  9. /** タイマークラス */ class Timer { void stop(); } /**

    タイマークラス(改善案) */ class Timer { void kill(); void pause(); // resume() で処理を再開 } 終了するか、一時停止するか、 少しだけ『機能』の意図がより明確に 伝わるように書き換えてみました
  10. スコープ(範囲)を意識する 短 い 名 前 に は 注 意 //

    左右の値を入れ替える if( right < left ) { int tmp = right; right = left; left = tmp; }
  11. スコープ(範囲)を意識する 短 い 名 前 に は 注 意 //

    左右の値を入れ替える if( right < left ) { int tmp = right; right = left; left = tmp; } tmp は生存期間が短い 一時的な変数であることが 伝わるのでok
  12. スコープ(範囲)を意識する 短 い 名 前 に は 注 意 //

    ユーザー情報の文字列化 String tmp = user.name(); tmp += “ “ + user.email(); … … … template.put(“user_info”, tmp); template.put(“server_info”, tmp);
  13. スコープ(範囲)を意識する 短 い 名 前 に は 注 意 //

    ユーザー情報の文字列化 String tmp = user.name(); tmp += “ “ + user.email(); … … … template.put(“user_info”, tmp); template.put(“server_info”, tmp); 実装者が意図していない可能性のあるプログラムコードを 見つけてください(もしかしたらバグかも、という箇所です)
  14. スコープ(範囲)を意識する 短 い 名 前 に は 注 意 //

    ユーザー情報の文字列化 String tmp = user.name(); tmp += “ “ + user.email(); … … … template.put(“user_info”, tmp); template.put(“server_info”, tmp); tmp は「ユーザー情報の文字列」なので、 server_info と関連付けることは違和感が....
  15. スコープ(範囲)を意識する 短 い 名 前 に は 注 意 //

    ユーザー情報の文字列化 String tmp = user.name(); tmp += “ “ + user.email(); … … … template.put(“user_info”, tmp); template.put(“server_info”, tmp); tmp の生存期間が長い コードが長くなればなるほど、 後半では、tmp の存在が希薄になる
  16. スコープ(範囲)を意識する 短 い 名 前 に は 注 意 //

    ユーザー情報の文字列化 String user_info = user.name(); tmp += “ “ + user.email(); … … … template.put(“user_info”, user_info); template.put(“server_info”, tmp);
  17. スコープ(範囲)を意識する 短 い 名 前 に は 注 意 //

    ユーザー情報の文字列化 String user_info = user.name(); tmp += “ “ + user.email(); … … … template.put(“user_info”, user_info); template.put(“server_info”, tmp); 『変数』の意図がより明確に 伝わるように書き換えると Good!
  18. ループインデックスについても考える 短 い 名 前 に は 注 意 for(int

    i = 0; i < clubs.size(); i++){ for(int j = 0; j < clubs[i].members.size(); j++){ for(int k = 0; k < users.size(); k++){ if(clubs[i].members[k] == users[j]) System.out.plintln(“user[” + j + ... } } }
  19. ループインデックスについても考える 短 い 名 前 に は 注 意 for(int

    i = 0; i < clubs.size(); i++){ for(int j = 0; j < clubs[i].members.size(); j++){ for(int k = 0; k < users.size(); k++){ if(clubs[i].members[k] == users[j]) System.out.plintln(“user[” + j + ... } } } users のインデックスは 本来、”k” であるが、取り違いが発生
  20. 拡張for文で書き換えてみると.. 短 い 名 前 に は 注 意 for(Club

    club : clubs){ for(User member : club.members){ for(User user : users){ if(member == user) System.out.plintln(“user[” + user + ... } } }
  21. let endPointUrl = ‘hoge.com’; let replaceUrl = ‘fuga.com’; function replaceURL()

    { newURL = endPointUrl.toReplace(replaceUrl); } Q.雰囲気でコードの説明をしてみてください
  22. let endPointUrl = ‘hoge.com’; let replaceUrl = ‘fuga.com’; function replaceURL()

    { newURL = endPointUrl.toReplace(replaceUrl); } let endPointUrl = ‘hoge.com’; let accessibleUrl = ‘fuga.com’; function replaceURL() { newURL = endPointUrl.toReplace(accessibleUrl); } 処理に引っ張られた命名となっている 目的を加味した命名となっている
  23. 伝わりやすいコードを書くための指針(その他) 名前に単位を付与する startMs, elapsedMs, etc.. 名前に属性を付与する hasedPassword, plaintextPassword, etc.. 長過ぎる名前を避ける

    newNavigationControllerWrappingView ControllerForDataSourceOfClass() コーディングスタイルを 守る コーディング規約を読み、守る
  24. チームがルールを守ると読みやすくなる みんなが知っている ルールがあることで読みやすくなる • 段落を分ける • 句読点をつける • 行間を詰めすぎない •

    字下げをする • etc… B はじめてのIT勉強会は毎週第4木曜日に定 期開催する初心者を応援する勉強会です。 はじめてのことに気軽に挑戦できる場所と して2017年4月に仙台で初開催、7年を経 て、2024年4月から札幌での開催に繋がり ました。 仙台では第4水曜日に開催していますので 遊びにきてください。 札幌開催も、みなさま応援よろしくお願い します。