高品質のコード:継続的な更新

2218 ワード

  • 1. コード品質
  • 1.1コードの規範性
  • 1.2コードの整合性
  • 1.3コードのロバスト性
  • 2.結語
  • 3.参考文献
  • 1.コード品質


    1.1コードの規範性


    はっきりと書く
    明確なレイアウト
    合理的なネーミング

    1.2コードの整合性


    機能テスト
    境界テスト
    ネガティブテスト

    面接問題16、数値の整数次


    初期解法:
    double Power(double base, int exponent){
        double result = 1.0;
        for(int i = 1; i <= exponent; i++){
            result *= base;
        }
        return result;
    }
    

    以上のコードは不完全であり,入力指数(exponent)が1未満の場合は考慮されていない.
    包括的だが非効率な解法
    分析:指数が負数の場合、指数に対して絶対値を取ってから逆数を取ることができます.また,底数が0,指数が負の場合を考慮する必要があり,この誤りに対しては,戻り値,グローバル変数,異常の3つの処理方法がある.
    bool g_InvalidInput = false;
    double Power(double base, int exponent){
        g_InvalidInput = false;
        if(equal(base, 0.0) && exponent < 0){
            g_InvalidInput = true;
            return 0.0;
        }
        unsigned int absExponent = (unsigned int)exponent;
        if(exponent < 0){
            absExponent = (unsigned int)(-exponent);
        }
        
        double result = PowerWithUnsignedExponent(base, absExponent);
        if(exponent < 0){
            result = 1.0/result;
        }
        return result;
    }
    
    double PowerWithUnsignedExponent(double base, unsigned int exponent){
        double result = 1.0;
        for(int i = 0; i <= exponent; i++){
            result *= base;
        }
        return result;
    }
    

    上記のコードは、エラーが発生したかどうかを識別するためにグローバル変数を使用します.しかし、コードは、エラーが発生しているかどうかを判断するために、呼び出し者がグローバル変数をチェックする必要があります.
    包括的で効率的な解法
    分析:サブパーティションを分解し、再帰的に実現する
    数式:
    a^n=\left\{
    \begin{aligned}
    a^{n/2}*a^{n/2} \text{, n }\\ 
    a^{(n-1)/2}*a^{(n-1)/2}  \text{, n }
    \end{aligned}
    \right.
    
    double PowerWithUnsignedExponent(double base, unsigned int exponent){
        if(exponent == 0){
            return 1;
        }
        if(exponent == 1){
            return base;
        }
        
        double result = PowerWithUnsignedExponent(base, exponent>>1);
        result *= result;
        if(exponent & 0x1 == 1){
            result *= base;
        }
    }
    

    詳細は右シフト演算で置換して2で割り,ビット演算子で置換して余剰を求めて奇数偶数を判断する.実行効率が向上しました.

    1.3コードのロバスト性


    2.結語


    3.参考文献


    剣指offer