『Clean Code』の第 12 章「創発」では、基本的な設計原則を遵守することで、クリーンで適切に構造化されたソフトウェアがどのように誕生するかについて説明します。
ソフトウェア設計における創発とは、単純でよく理解されたルールから複雑な動作や機能が生まれるプロセスを指します。
これらのルールに従うことは、開発者が保守、拡張、理解が容易なソフトウェアを作成するのに役立ちます。
この章では、シンプルな設計の 4 つのルールに焦点を当て、クリーンで効率的なコードのシンプルさとテストのしやすさを強調します。
これらのルールをそれぞれ分解して、JavaScript を使用してどのように適用されるかを見てみましょう。
クリーンな新興ソフトウェアの基礎は、それが機能することです。
すべてのコードはテストに合格し、期待される動作が維持され、新しい機能によってバグが発生しないようにする必要があります。
JavaScript では、これは多くの場合、Jest や Mocha などのライブラリを使用して単体テストを作成することで実現されます。
function add(a, b) { return a b; } // Test (using Jest) test('adds 1 2 to equal 3', () => { expect(add(1, 2)).toBe(3); });
ソフトウェアがすべてのテストに合格することを確認することで、システムが意図したとおりに動作することが保証されます。
クリーンなコードは信頼性の高いテストから始まります。これがなければ、他のルールはどれも重要ではありません。
コードは、それが何を行うのかを伝える必要があります。適切な名前の関数、変数、クラスを使用すると、コメントを必要とせずにコードが読みやすく、理解しやすくなります。
その意図を明らかにするコードは一目瞭然です。
不適切なネーミング:
function d(x) { return x * 2; }
グッドネーミング:
function doubleNumber(number) { return number * 2; }
この場合、doubleNumber() は関数の意図を明確に示しています。
このコードを読んだ人は誰でも、追加の説明なしでその目的をすぐに理解できます。
これにより、混乱が軽減されるだけでなく、保守性も向上します。
コードの重複は、クリーンなソフトウェアにとって最大の敵の 1 つです。ロジックを繰り返すと、バグが発生し、メンテナンスの労力が増加する可能性があります。
目標は、一般的な動作を再利用可能な関数またはモジュールに抽象化することで冗長性を減らすことです。
コードの重複:
function calculateAreaOfSquare(side) { return side * side; } function calculateAreaOfRectangle(length, width) { return length * width; }
両方の関数は同様の計算を行っています。リファクタリングすることで重複を排除できます。
重複なし:
function calculateArea(shape) { if (shape.type === 'square') { return shape.side * shape.side; } else if (shape.type === 'rectangle') { return shape.length * shape.width; } }
関数を一般化することで、ロジックの繰り返しを排除し、コードの保守性を向上させます。
シンプルな設計の最後のルールは、明瞭さを犠牲にすることなくクラスとメソッドの数を最小限に抑えることを奨励します。
これは、不必要な複雑さを避けることを意味します。
各クラスまたは機能には、単一責任原則 (SRP) を遵守し、明確で焦点を絞った責任が必要です。
メソッドが多すぎます:
class User { constructor(name) { this.name = name; } getName() { return this.name; } setName(name) { this.name = name; } printWelcomeMessage() { console.log(`Welcome, ${this.name}!`); } // Additional unrelated methods getUserProfile() { // ... some logic } logActivity() { // ... some logic } }
このクラスには責任が多すぎます。ユーザー名の管理のみに重点を置く必要があります。
リファクタリング済み:
class User { constructor(name) { this.name = name; } getName() { return this.name; } setName(name) { this.name = name; } } class Logger { static logActivity(user) { // ... some logic console.log(`${user.getName()} performed an activity.`); } }
関心事を分離することで、コードがよりシンプルになり、保守が容易になります。
現在、各クラスはミニマリズムとシンプルさの原則を遵守しながら、単一の責任を負っています。
シンプルな設計の 4 つのルール (すべてのテストに合格する、意図を明らかにする、重複を排除する、クラスとメソッドの数を最小限に抑える) は、クリーンで保守可能で創発的なコードの作成に役立ちます。
これらの原則に従うことで、複雑さが抑制され、コードの変更への適応性が高まります。
ハッピーコーディング!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3