最近、コードのレビュー中に、新しい同僚が書いたコードに出会いました。これには匂いのあるパターンが含まれています。同僚の決定は、有名なClean Codeの本(およびおそらく他の同様の本)によって提案されたルールに基づいていると思います。
クラスコンストラクターは有効なオブジェクトの作成に完全に責任があり、その主なタスクはオブジェクトの(プライベート)プロパティの割り当てであることを理解しています。もちろん、オプションのプロパティ値がクラスコンストラクター以外のメソッドによって設定される可能性がありますが、そのような状況はかなりまれです(クラスの残りの部分がそのようなプロパティのオプション性を考慮する場合は、必ずしも間違っているわけではありません)。これは、オブジェクトが常に有効な状態であることを保証できるため、重要です。
しかし、私が遭遇したコードでは、ほとんどのプロパティ値は実際にはコンストラクター以外のメソッドによって設定されています。計算の結果の値は、クラス全体のいくつかのプライベートメソッド内で使用されるプロパティに割り当てられます。著者は、クラスプロパティを、それらを必要とする関数にパラメーター化するのではなく、クラス全体でアクセスできるグローバル変数であるかのように使用しているようです。さらに、クラスのメソッドは特定の順序で呼び出す必要があります。そうしないと、クラスはそれほど多くのことをしないからです。
このコードは、大きなパラメーターリスト(<3パラメーター)を回避するために、メソッドを短くする(<= 5行のコード)アドバイスにインスパイアされており、コンストラクターが機能しないようにする必要がある(何らかの計算を実行するなど)これはオブジェクトの有効性にとって不可欠です)。
もちろん、メソッドが特定の順序で呼び出されない場合に、あらゆる種類の未定義エラーが発生する可能性があることを証明できれば、もちろんこのパターンに反論することができます。ただし、これに対する応答では、プロパティの設定が必要なメソッドが呼び出されたらプロパティを設定する必要があることを検証する検証が追加されると予測しています。
ただし、特定の順序で(手続き的に)呼び出される一連のメソッドではなく、クラスが実際のオブジェクトの青写真になるように、コードを完全に変更することをお勧めします。
私が遭遇したコードは臭いを感じます。実際、クラスプロパティに値を保存するタイミングと、使用する別のメソッドのパラメーターに値を配置するタイミングについては、かなり明確な違いがあると思います。 。この区別の言葉を探しています。