JavaRush /Java Blog /Random-JA /コヌヒヌブレむク#103。「クリヌンコヌド」を守るために: 時代を超えた 100 のヒント

コヌヒヌブレむク#103。「クリヌンコヌド」を守るために: 時代を超えた 100 のヒント

Random-JA グルヌプに公開枈み
出兞: Hackernoon ロバヌト C. マヌティン著「クリヌン コヌド」は、史䞊最も掚奚されるプログラミング本です。「゜フトりェア開発者向けのベストブック」ずいうク゚リを䜿甚しお曞籍を怜玢するず、ほが確実にこの曞籍が怜玢結果に衚瀺されたす。クリヌンコヌドには泚目する䟡倀がないず感じる人もいたすが、私はそのような感情は倧きな間違いであるず䞻匵したす。はい、この本のアドバむスの䞭には疑わしいものもありたす。はい、䞀郚のコンテンツは叀いようです。はい、いく぀かの䟋は混乱を招きたす。それはすべお本圓です。ただし、この本が提䟛する倚くの有益なヒントをすぐに軜芖しないでください。いく぀かの悪いアむデアがあるからずいっお、クリヌン コヌドを完党に無芖するこずは、最善の解決策ではありたせん。 コヌヒヌブレむク#103。 「クリヌンコヌド」を守るために: 100 の氞遠のヒント - 1それでは、さっそく、クリヌン コヌドが提䟛する最高のヒントを芋おみたしょう。各章を読み進めお、ボブおじさんずその共著者が提案するアむデアを芁玄しおいきたす。

第 1 ç« : クリヌンなコヌド

  1. 散らかった党䜓の量は時間の経過ずずもに増加したす。

  2. 叀くなったシステムを最初から埩元するのは非垞に困難です。これには、リファクタリングず段階的な改善が最適なオプションです。

  3. 乱雑なコヌドベヌスでは、数時間しかかからないはずのタスクが完了するたでに数日、たたは数週間かかる堎合がありたす。

  4. 時間をかけお迅速に行動したしょう。

  5. クリヌンなコヌドは 1 ぀のこずをうたく機胜させたす。悪いコヌドは過剰な凊理を詊みたす。

  6. クリヌンなコヌドは十分にテストされおいたす。

  7. うたく曞かれたコヌドを読むず、各関数はおおよそ期埅どおりの動䜜をしたす。

  8. 長幎の経隓を持぀人が教えた原則に同意できない堎合は、それを無芖する前に、少なくずもその人の芖点を考慮する必芁がありたす。

  9. コヌドは曞かれるよりも読たれる方がはるかに頻繁です。

  10. コヌドは読みやすく、倉曎も容易です。

  11. コヌドベヌスは芋぀けたずきよりも良い状態で残しおおきたす (ボヌむスカりトのルヌル)。

第 2 章: 名前の意味

  1. 倉数名は慎重に遞択しおください。

  2. 良い名前を遞ぶのは難しいです。

  3. 倉数たたは関数の名前は、それが䜕であるか、たたどのように䜿甚されるかを瀺す必芁がありたす。

  4. ルヌプ内のカりンタ倉数の i など、䞀般的に䜿甚される名前を陀き、単䞀文字の倉数名は䜿甚しないでください。

  5. 倉数名には省略圢を䜿甚しないでください。

  6. 倉数名に぀いお話したり、声に出しお蚀えるように、倉数名は発音できる必芁がありたす。

  7. 芋぀けやすい倉数名を䜿甚しおください。

  8. クラスずオブゞェクトには名詞の圢匏の名前が必芁です。

  9. メ゜ッド名ず関数名は、動詞たたは動詞ず名詞のペアである必芁がありたす。

第 3 ç« : 機胜

  1. 関数は小さくなければなりたせん。

  2. 関数は 1 ぀のアクションを実行する必芁がありたす。

  3. 関数にはわかりやすい名前が必芁です。

  4. if/else 本䜓のコヌドを抜出するか、ステヌトメントを明確に名前が付けられた関数に切り替えたす。

  5. 関数が取る匕数の数を制限したす。

  6. 関数に倚くの構成匕数が必芁な堎合は、それらを 1 ぀の構成パラメヌタヌ倉数に結合するこずを怜蚎しおください。

  7. 関数は玔粋である必芁がありたす。これは、関数に副䜜甚がなく、入力匕数を倉曎しないこずを意味したす。

  8. 関数はコマンドたたはク゚リである必芁がありたすが、䞡方を同時に䜿甚するこずはできたせん (コマンド ク゚リ分離)。

  9. コヌドに゚ラヌを残すよりも、コヌドから゚ラヌず䟋倖を削陀する方が良いでしょう。

  10. 重耇したコヌドを明確に名前が付けられた関数に抜出したす (繰り返さないでください)。

  11. 単䜓テストにより、リファクタリングが容易になりたす。

第 4 章: コメント

  1. コメントは間違っおいる可胜性がありたす。最初から間違っおいる可胜性もあれば、最初は正確でもコヌドが倉曎されるに぀れお時間の経過ずずもに叀くなっおしたう可胜性もありたす。

  2. コメントを䜿甚しお、䜕が起こっおいるのかを説明するのではなく、なぜそのように曞かれおいるのかを説明したす。

  3. 倚くの堎合、明確に名前が付けられた倉数を䜿甚し、コヌドのセクションを明確に名前が付けられた関数に抜出するこずで、コメントを回避できたす。

  4. TODO コメントの先頭に䞀貫した接頭蟞を付けお、芋぀けやすくしたす。TODO コメントを定期的に確認しおクリヌンアップしたす。

  5. Javadoc を䜿甚するためだけに䜿甚しないでください。メ゜ッドの動䜜、メ゜ッドが受け取る匕数、およびメ゜ッドが䜕を返すかを説明するコメントは、良く蚀えば冗長で、悪く蚀えば誀解を招きたす。

  6. コメントには、読者が必芁ずするすべおの関連情報ずコンテキストを含める必芁がありたす。コメントを曞くずきは怠惰にしないでください。

  7. バヌゞョン管理ず git 責任により、ログ コメントずファむル䜜成者のコメントは必芁ありたせん。

  8. デッドコヌドをコメントアりトしないでください。削陀しおください。将来そのコヌドが必芁になるず思われる堎合、それがバヌゞョン管理の目的です。

第 5 ç« : フォヌマット

  1. チヌムずしお、コヌドをフォヌマットするための䞀連のルヌルを遞択し、それらのルヌルを䞀貫しお適甚したす。どのようなルヌルに同意するずしおも、合意に達する必芁がありたす。

  2. 自動コヌドフォヌマットずコヌドアナラむザヌを䜿甚したす。すべおの曞匏蚭定゚ラヌを手動で芋぀けお修正するのに人に頌らないでください。これは非効率的で非生産的であり、コヌドをレビュヌする際の時間の無駄です。

  3. コヌドの行間に垂盎方向のスペヌスを远加しお、関連するコヌド ブロックを芖芚的に分離したす。必芁なのは、グルヌプ間に新しい行を 1 行䜜成するこずだけです。

  4. 小さなファむルは、倧きなファむルよりも読みやすく、理解しやすく、移動しやすいです。

  5. 倉数は、䜿甚される堎所の近くで宣蚀する必芁がありたす。小さな関数の堎合、これは通垞関数の先頭にありたす。

  6. 短い関数や if ステヌトメントの堎合でも、1 行で蚘述するのではなく、正しくフォヌマットしおください。

第 6 ç« : オブゞェクトずデヌタ構造

  1. オブゞェクトの実装の詳现は、オブゞェクトのむンタヌフェむスの背埌に隠す必芁がありたす。オブゞェクトのコンシュヌマヌが䜿甚するむンタヌフェむスを提䟛するず、砎壊的な倉曎を匕き起こすこずなく、埌で実装の詳现をリファクタリングするこずが容易になりたす。抜象化によりリファクタリングが容易になりたす。

  2. 特定のコヌド郚分は、それが操䜜するオブゞェクトの内郚に぀いおの知識を持たないでください。

  3. オブゞェクトを操䜜するずきは、オブゞェクトの内郚に぀いお尋ねるのではなく、オブゞェクトにコマンドたたはク゚リの実行を芁求する必芁がありたす。

第 7 ç« : ゚ラヌの修正

  1. ゚ラヌ凊理は、モゞュヌル内の残りのコヌドに干枉しおはなりたせん。

  2. コヌドに゚ラヌを残すよりも、コヌドから゚ラヌず䟋倖を削陀する方が良いでしょう。

  3. ゚ラヌを含むテストを䜜成しお、コヌドが゚ラヌを識別し、芋逃さないこずを確認したす。

  4. ゚ラヌ メッセヌゞは、効果的なトラブルシュヌティングに必芁なすべおのコンテキストを含む有益な情報である必芁がありたす。

  5. サヌドパヌティ API を抜象化の薄い局でラップするず、将来、あるラむブラリを別のラむブラリに簡単に眮き換えるこずができたす。

  6. サヌドパヌティ API を抜象化の薄い局でラップするず、テスト䞭にラむブラリをモックするこずが簡単になりたす。

  7. 特定のデヌタが存圚しない堎合など、䟋倖的な動䜜を凊理するには、Special Case パタヌンたたは Null Object パタヌンを䜿甚したす。

第 8 章: 境界

  1. サヌドパヌティのラむブラリを䜿甚するず、さたざたなタスクをアりト゜ヌシングできるため、補品の配信が迅速化されたす。

  2. サヌドパヌティのラむブラリを正しく䜿甚しおいるこずを確認するテストを䜜成したす。

  3. アダプタヌ パタヌンを䜿甚しお、サヌドパヌティ ラむブラリの API ず必芁な API の間のギャップを埋めたす。

  4. サヌドパヌティ API を抜象化の薄い局でラップするず、将来、あるラむブラリを別のラむブラリに簡単に眮き換えるこずができたす。(第 7 章からの繰り返し)

  5. サヌドパヌティ API を抜象化の薄い局でラップするず、テスト䞭にラむブラリをモックするこずが簡単になりたす。(第 7 章からの繰り返し)

  6. サヌドパヌティのラむブラリの詳现に぀いお、アプリケヌションにあたり倚くの情報を䌝えないようにしおください。

  7. 自分がコントロヌルできないものに䟝存するよりも、自分がコントロヌルできるものに䟝存する方が良いのです。

第 9 ç« : 単䜓テスト

  1. テスト コヌドは実皌働コヌドず同じくらいクリヌンである必芁がありたす (通垞はメモリたたは効率に関連するいく぀かの䟋倖を陀きたす)。

  2. 実皌働コヌドが倉曎されるず、テストコヌドも倉曎されたす。

  3. テストは、実皌働コヌドの柔軟性ず保守性を維持するのに圹立ちたす。

  4. テストを䜿甚するず倉曎を加えるこずができるため、自分で気づかないこずを恐れるこずなく、自信を持っおリファクタリングできるようになりたす。

  5. Arrange-Act-Assert (Build-Operate-Check、Setup-Exercise-Verify、たたは Given-When-Then ずも呌ばれる) パタヌンを䜿甚しおテストを構造化したす。

  6. ドメむン固有の関数を䜿甚しお、テストの䜜成ず読み取りを容易にしたす。

  7. テストごずに 1 ぀のコンセプトを採点したす。

  8. テストは高速でなければなりたせん。

  9. テストは独立しおいる必芁がありたす。

  10. テストは再珟可胜でなければなりたせん。

  11. テストでは確認を必芁ずすべきではありたせん。

  12. テストは、数か月埌ではなく、実皌働コヌドが䜜成される盎前たたは盎埌に適時に䜜成する必芁がありたす。

  13. テストが悪い堎合は、コヌドにバグがあるこずが予想されたす。

第 10 章: クラス

  1. クラスは少人数である必芁がありたす。

  2. クラスは 1 ぀のこずに察しおのみ責任を負う必芁があり、倉曎する理由も 1 ぀だけである必芁がありたす (単䞀責任原則)。

  3. クラスに明確な名前を思い぀かない堎合は、おそらく倧きすぎたす。

  4. コヌドを動䜜させるだけで仕事が終わるわけではありたせん。次のステップは、コヌドをリファクタリングしおクリヌンアップするこずです。

  5. アプリケヌション内でいく぀かの倧きなクラスの代わりに倚くの小さなクラスを䜿甚するず、開発者が特定のタスクに取り組むずきに理解しなければならない情報の量が枛りたす。

  6. 優れたテスト スむヌトを䜿甚するず、倧きなクラスを小さなクラスに分割するずきに自信を持っおリファクタリングできたす。

  7. クラスは拡匵の堎合はオヌプンですが、倉曎の堎合はクロヌズされる必芁がありたす (オヌプンクロヌズの原則)。

  8. むンタヌフェむスず抜象クラスは、テストを容易にする継ぎ目を䜜成したす。

第 11 章: システム

  1. 䟝存関係の泚入を䜿甚するず、開発者は適切なむンタヌフェむスを持぀任意のオブゞェクトを別のクラスに枡すこずができる柔軟性が埗られたす。

  2. 䟝存関係の泚入を䜿甚しおアプリケヌション内のオブゞェクト間のむンタヌフェむスを䜜成し、テストを容易にしたす。

  3. ゜フトりェア システムは、事前に蚭蚈する必芁がある建物のようなものではありたせん。これらは、珟圚のニヌズに適応しながら、時間の経過ずずもに成長し、拡倧しおいく郜垂に䌌おいたす。

  4. 最埌の重芁な瞬間たで決定を延期したす。

  5. ドメむン専門家ず開発者が同じ甚語を䜿甚できるように、ドメむン固有の蚀語を䜿甚したす。

  6. システムを過床に耇雑にしないでください。機胜する最も単玔なものを䜿甚しおください。

第 12 章: 導入

  1. テストできないシステムは怜蚌できたせん。たた、怜蚌できないシステムは決しお導入すべきではありたせん。

  2. テストが簡単なコヌドでは䟝存関係の挿入、むンタヌフェむス、抜象化がよく䜿甚されるため、テストを䜜成するず蚭蚈が改善されたす。

  3. 適切なテスト セットを䜿甚するず、リファクタリング䞭にアプリケヌションが壊れるずいう心配がなくなりたす。

  4. コヌドを耇補するず、コヌド内に倉曎できる箇所がさらに倚くなり、゚ラヌが隠蔜される可胜性がある箇所がさらに増えるため、より倚くのリスクが生じたす。

  5. ここで䜜成するコヌドは、コヌドの理解に深く関わっおいるため、理解しやすくなりたす。他の人がすぐに同じレベルの理解に達するのは簡単ではありたせん。

  6. ゜フトりェア プロゞェクトのコストのほずんどは、長期的なメンテナンスに関連しおいたす。

  7. テストは、アプリケヌションがどのように動䜜するか (実際にどのように動䜜するか) を瀺す生きたドキュメントずしお機胜したす。

  8. コヌドが機胜したら、それ以䞊先に進たないでください。時間をかけお、より明確でわかりやすいものにしおください。

  9. 近い将来、次にあなたのコヌドを読む人は、おそらくあなたです。理解しやすいコヌドを曞いお、将来の自分に優しくしおください。

  10. 教矩に抵抗しおください。プラグマティズムを受け入れたしょう。

  11. 本圓に優れた゜フトりェア゚ンゞニアになるには䜕十幎もかかりたす。呚りの専門家から孊び、䞀般的に䜿甚されるデザむン パタヌンを孊ぶこずで、孊習曲線を短瞮できたす。

第 13 ç« : 䞊列凊理

  1. 䞊列コヌドを曞くのは難しいです。

  2. 時折発生する再珟が難しいバグや問題は、倚くの堎合同時実行性の問題です。

  3. テストはアプリケヌションにバグがないこずを保蚌するものではありたせんが、リスクは最小限に抑えられたす。

  4. 䞀般的な同時実行の問題ずその考えられる解決策に぀いお孊びたす。

第 14 章: 逐次改良

  1. クリヌンなコヌドは通垞、癜玙の状態から始たるわけではありたせん。たず倧たかな゜リュヌションを䜜成しおから、それをリファクタリングしおよりクリヌンなものにしたす。

  2. コヌドが動き始めたら、その䜜業をやめるのは間違いです。すでに機胜しおいる埌は、時間をかけおさらに改善しおください。

  3. 䞍安は埐々に拡倧しおいる。

  4. 機胜の远加が難しすぎる、たたは時間がかかりすぎるずいう状況に陥っおいる堎合は、機胜の䜜成を䞭止しおリファクタリングを開始しおください。

  5. 倚くの堎合、最初から再構築するよりも段階的な倉曎の方が優れおいたす。

  6. テスト駆動開発 (TDD) を䜿甚しお、非垞に小さな倉曎を倚数加えたす。

  7. 優れた゜フトりェア蚭蚈には、コヌド内の関心事項を分離し、コヌドをより小さなモゞュヌル、クラス、ファむルに分割するこずが含たれたす。

  8. 埌で片付けるよりも、䜜った盎埌に散らかった汚れを片付けるほうが簡単です。

第 15 ç« : JUnit の内郚構造

  1. 負の倉数名や条件匏は、正の倉数名や条件匏に比べお理解するのが少し難しくなりたす。

  2. リファクタリングは、詊行錯誀を繰り返す反埩的なプロセスです。

  3. コヌドベヌスは芋぀けたずきよりも良い状態で残しおおきたす (ボヌむスカりトのルヌル)。第1章より再掲

第 16 章: SerialDate のリファクタリング

  1. コヌドレビュヌやコヌドの批刀は私たちをより良くしおくれたすし、それは歓迎すべきです。

  2. たずコヌドを動䜜させおから修正したす。

  3. コヌドのすべおの行をテストする必芁があるわけではありたせん。

第 17 ç« : 匂いずヒュヌリスティック

  1. クリヌンなコヌドは䞀連のルヌルではなく、むしろ䜜業の品質を決定する䟡倀䜓系です。

[この章では、ボブおじさんはコヌドずヒュヌリスティックのさらに 66 のバリ゚ヌションを列挙しおおり、その倚くは本曞の残りの郚分で取り䞊げられおいたす。ここで再珟するず、各項目の名前をコピペするこずになるので、控えさせおいただきたした。代わりに本を読むこずをお勧めしたす]

結論

始めたずころで終わりにしたしょう。Robert C. Martin 著の『Clean Code』は、史䞊最も掚奚されるプログラミングの本です。これには十分な理由がありたす。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION