ホームページ > ウェブフロントエンド > jsチュートリアル > コードの匂い: 無視できないコードベースの警告サイン

コードの匂い: 無視できないコードベースの警告サイン

Patricia Arquette
リリース: 2024-10-07 14:20:29
オリジナル
720 人が閲覧しました

Code Smells: Warning Signs in Your Codebase You Can

プログラマーであれば、おそらく「違和感」を感じるコードに遭遇したことがあるでしょう。つまり、保守、理解、拡張が難しくなります。 コードの匂い として知られるコードベース内のこれらの一般的な警告サインは、何かが正しくないことを示しています。悪臭が何かが腐ったことを示すのと同じように、コードの臭いはコードの設計や実装に潜在的な問題があることを示します。

本題に入る前に、明確にしましょう:

「臭い」 という用語は、問題のあるコードを悪臭に例えた比喩です。コードの匂いを構成するものは、以下に応じて主観的なものになる可能性があります。

  • 使用するプログラミング言語
  • チームが従う開発方法論
  • 開発者の個人的な好み

コードの匂いを気にする必要があるのはなぜですか?

コードの匂いを無視することは、車のメンテナンスを後回しにするようなものです。今日は問題が起こらないかもしれませんが、時間が経つと大きな故障につながる可能性があります。注意すべき理由は次のとおりです:

  1. 保守性

    コードが肥大化したり不明瞭になったりすると、メンテナンスは悪夢のような作業になります。デバッグが遅くなり、バグが混入する可能性が高くなります。

  2. スケーラビリティ

    臭いコードはアプリケーションのスケーリングを困難にします。コードベースが拡大するにつれて、根本的な問題が指数関数的な問題を引き起こす可能性があります。

  3. 技術的負債

    コードの臭いを無視することは、借金を積み上げるようなものです。最終的には、時間のかかる書き換えやデバッグという形で、多くの場合利息を付けて返済しなければなりません。


よくあるコードの臭い (およびその修正方法)

最も一般的なコードの匂いと、それらをクリーンアップするための戦略をいくつか見てみましょう。

1. 肥大化したコード

? 長いメソッドまたはクラス

メソッドやクラスが長くなりすぎると、理解、テスト、保守が困難になります。

例:

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);


ログイン後にコピー

2. オブジェクト指向の悪用

? Switch ステートメント

型固有の動作を扱う 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;
    }
}


ログイン後にコピー

? 一時フィールド

特定のシナリオでのみ使用されるフィールドはクラスを乱雑にし、不必要な複雑さを引き起こす可能性があります。

解決策: 可能であれば、そのようなフィールドをローカル変数またはパラメーターに移動するか、責任を複数のクラスに分割します。


3. 剛性

? 発散的な変化

無関係な理由で 1 つのクラスを変更する必要がある場合、それはそのクラスがやりすぎているという兆候です。

解決策: クラスをより小さく、より焦点を絞ったユニットに分割することで、単一責任の原則を適用します。

? ショットガン手術

変更で複数のクラスの変更が必要な場合は、モジュール性が低いことを示します。これにより、リファクタリングや機能の追加が困難になる可能性があります。

解決策: 散在する変更の理由を特定し、関連するロジックをグループ化してリファクタリングします。


4. 不必要な複雑さ

? コードが重複しています

同じコード部分が複数の場所にあると、バグやメンテナンスの問題が発生する可能性があります。

例:

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);
}


ログイン後にコピー

? デッドコード

デッドコードとは、使用されなくなった機能です。コードベースが乱雑になり、開発者が混乱する可能性があります。

解決策: コードベースをクリーンで簡潔に保つために、未使用のコードを定期的に削除します。


5. 密結合

? 特集 Envy

メソッドが自身のデータではなく別のオブジェクトのデータに大きく依存している場合、それは密結合の兆候です。

Example:

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;
    }
}


ログイン後にコピー

? Inappropriate Intimacy

Classes that rely too heavily on each other’s internal details create unnecessary dependencies.

Solution: Enforce stricter encapsulation and reduce reliance on internal data.


Additional Code Smells to Watch Out For

  • Magic Numbers Replace unexplained numbers with named constants to improve readability and maintainability.

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.


How to Deal with Code Smells

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:

  1. 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.

  2. Incremental Changes

    You don’t have to fix everything at once. Start with small, focused refactorings, targeting the smelliest areas of your code.

  3. 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.


Final Thoughts

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!

以上がコードの匂い: 無視できないコードベースの警告サインの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート