プログラマーであれば、おそらく「違和感」を感じるコードに遭遇したことがあるでしょう。つまり、保守、理解、拡張が難しくなります。 コードの匂い として知られるコードベース内のこれらの一般的な警告サインは、何かが正しくないことを示しています。悪臭が何かが腐ったことを示すのと同じように、コードの臭いはコードの設計や実装に潜在的な問題があることを示します。
本題に入る前に、明確にしましょう:
「臭い」 という用語は、問題のあるコードを悪臭に例えた比喩です。コードの匂いを構成するものは、以下に応じて主観的なものになる可能性があります。
コードの匂いを無視することは、車のメンテナンスを後回しにするようなものです。今日は問題が起こらないかもしれませんが、時間が経つと大きな故障につながる可能性があります。注意すべき理由は次のとおりです:
保守性
コードが肥大化したり不明瞭になったりすると、メンテナンスは悪夢のような作業になります。デバッグが遅くなり、バグが混入する可能性が高くなります。
スケーラビリティ
臭いコードはアプリケーションのスケーリングを困難にします。コードベースが拡大するにつれて、根本的な問題が指数関数的な問題を引き起こす可能性があります。
技術的負債
コードの臭いを無視することは、借金を積み上げるようなものです。最終的には、時間のかかる書き換えやデバッグという形で、多くの場合利息を付けて返済しなければなりません。
最も一般的なコードの匂いと、それらをクリーンアップするための戦略をいくつか見てみましょう。
メソッドやクラスが長くなりすぎると、理解、テスト、保守が困難になります。
function processOrder(order) { validateOrder(order); calculateDiscount(order); applyTaxes(order); updateInventory(order); sendConfirmation(order); }
この方法は問題ないようですが、実行するタスクが多すぎるため、従うのが難しくなります。
解決策: 長いメソッドをより小さな単一目的の関数に分割します。
function processOrder(order) { validateOrder(order); applyDiscountsAndTaxes(order); finalizeOrder(order); } function applyDiscountsAndTaxes(order) { calculateDiscount(order); applyTaxes(order); }
過剰なコメントは、コードが自明ではないことを示している可能性があります。
// Calculate the total price after applying the discount let totalPrice = price - (price * discount);
解決策: コードを自己文書化するようにリファクタリングします。
let totalPrice = applyDiscount(price, discount);
型固有の動作を扱う switch ステートメントは、多くの場合、オブジェクト指向プログラミングのポリモーフィズムに置き換えることができます。
function getArea(shape) { switch(shape.type) { case 'circle': return Math.PI * shape.radius ** 2; case 'square': return shape.side * shape.side; } }
解決策: ポリモーフィズムを使用して形状固有の動作を処理します。
class Shape { getArea() { throw "Must be implemented by subclass"; } } class Circle extends Shape { constructor(radius) { super(); this.radius = radius; } getArea() { return Math.PI * this.radius ** 2; } } class Square extends Shape { constructor(side) { super(); this.side = side; } getArea() { return this.side * this.side; } }
特定のシナリオでのみ使用されるフィールドはクラスを乱雑にし、不必要な複雑さを引き起こす可能性があります。
解決策: 可能であれば、そのようなフィールドをローカル変数またはパラメーターに移動するか、責任を複数のクラスに分割します。
無関係な理由で 1 つのクラスを変更する必要がある場合、それはそのクラスがやりすぎていることを示しています。
解決策: クラスをより小さく、より焦点を絞ったユニットに分割することで、単一責任の原則を適用します。
変更で複数のクラスの変更が必要な場合は、モジュール性が低いことを示します。これにより、リファクタリングや機能の追加が困難になる可能性があります。
解決策: 散在する変更の理由を特定し、関連するロジックをグループ化してリファクタリングします。
同じコード部分が複数の場所にあると、バグやメンテナンスの問題が発生する可能性があります。
function calculateTotalPrice(price, tax) { return price + (price * tax); } function calculateDiscountedPrice(price, discount, tax) { let discountedPrice = price - (price * discount); return discountedPrice + (discountedPrice * tax); }
解決策: 共通ロジックを再利用可能なメソッドに抽出します。
function calculatePrice(price, tax, discount = 0) { let discountedPrice = price - (price * discount); return discountedPrice + (discountedPrice * tax); }
デッドコードとは、使用されなくなった機能です。コードベースが乱雑になり、開発者が混乱する可能性があります。
解決策: コードベースをクリーンで簡潔に保つために、未使用のコードを定期的に削除します。
メソッドが自身のデータではなく別のオブジェクトのデータに大きく依存している場合、それは密結合の兆候です。
function getDiscount(customer) { return customer.purchaseHistory.totalAmount > 1000 ? 0.1 : 0; }
Solution: Consider moving the behavior to the object itself.
class Customer { getDiscount() { return this.purchaseHistory.totalAmount > 1000 ? 0.1 : 0; } }
Classes that rely too heavily on each other’s internal details create unnecessary dependencies.
Solution: Enforce stricter encapsulation and reduce reliance on internal data.
Example:
const SALES_TAX = 0.07; let total = price + (price * SALES_TAX);
Deep Nesting
Simplify deeply nested loops or conditionals for better readability. Consider early returns or extracting methods.
Long Parameter Lists
Refactor methods that take many parameters by using parameter objects or reducing the method’s responsibility.
Code smells don’t mean your code is broken, but they are early indicators that your design may need improvement. Here's how you can deal with them:
Refactoring
The most effective way to deal with code smells is through refactoring—improving the internal structure of your code without changing its external behavior.
Incremental Changes
You don’t have to fix everything at once. Start with small, focused refactorings, targeting the smelliest areas of your code.
Testing
Before you refactor, ensure that your code has adequate tests in place. This helps you catch regressions and verify that the refactored code behaves as expected.
Recognizing and addressing code smells is crucial for maintaining healthy, scalable, and maintainable code. Think of it as preventative care—cleaning up these smells early will save you time, effort, and headaches down the line. Keep an eye out for these common warning signs, and make refactoring a regular part of your coding process!
Atas ialah kandungan terperinci Bau Kod: Tanda Amaran dalam Pangkalan Kod Anda Anda Tidak Boleh Abaikan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!