コード匂い127 -可変定数


何か定数を宣言します.しかし、あなたはそれを変異することができます.

TL;DR: Use inmutable constants


問題

  • 最少の驚き原則違反
  • のカップリング

  • 解決策

  • 施行
  • 定数を避ける.彼らはテストではしゃべりにくい.
  • 文脈


    我々は、コンピュータプログラミングの最初のコースで定数を宣言することを学んだ.
    いつものように、何かが一定ならばそれは重要ではありません.
    変異しなければ重要である.

    サンプルコード


    間違い


    const DISCOUNT_PLATINUM = 0.1;
    const DISCOUNT_GOLD = 0.05;
    const DISCOUNT_SILVER = 0.02;
    
    //Since variables are constants we cannot reassign them
    const DISCOUNT_PLATINUM = 0.05; //Error
    
    //We can group them
    const ALL_CONSTANTS = {
      DISCOUNT: {
        PLATINUM = 0.1;
        GOLD = 0.04;
        SILVER = 0.02;  
      },
    };
    
    const ALL_CONSTANTS = 3.14; //Error
    
    ALL_CONSTANTS.DISCOUNT.PLATINUM = 0.08; //NOT AN ERROR. WTF!
    
    
    const ALL_CONSTANTS = Object.freeze({
      DISCOUNT: 
        PLATINUM = 0.1;
        GOLD = 0.05;
        SILVER = 0.02; 
    });
    
    const ALL_CONSTANTS = 3.14; //Error
    
    ALL_CONSTANTS.DISCOUNT.PLATINUM = 0.12; //NOT AN ERROR. WTF!
    


    export const ALL_CONSTANTS = Object.freeze({
      DISCOUNT: Object.freeze({
        PLATINUM = 0.1;
        GOLD = 0.05;
        SILVER = 0.02;  
      }),
    });
    
    const ALL_CONSTANTS = 3.14; //Error
    
    ALL_CONSTANTS.DISCOUNT.PLATINUM = 0.12; //ERROR
    
    //Code works, but it is coupled and we cannot test it
    
    Class TaxesProvider {
      applyPlatinum(product);
    }
    
    //Now we can couple to a interface (the protocol of taxes provider)
    //Since class has no setters it is constant an immuatable
    //And we can replace it on tests
    

    検出


    [ X ]半自動
    変更された値を見つけるために突然変異テストを行うことができます.

    タグ

  • 定数
  • 結論


    突然変異は非常に重要です.
    我々は正しいツールでそれを実施する必要があります.

    関係








    詳しい情報


  • クレジット


    この香りは触発された
    Sangharsh LohakareUnsplashによる写真

    You start digging in the code. The more you dig, the more stuff you turn up. Eventually you dig yourself into a hole you can’t get out of. To avoid digging your own grave, refactoring must be done systematically.


    エリックガンマ


    この記事はCodesmellシリーズの一部です.