最近、次のような状況に遭遇しました。
class A{
public:
void calculate(T inputs);
}
まず、A
物理世界のオブジェクトを表します。これは、クラスを分割しないことの強力な議論です。今、calculate()
非常に長く複雑な機能であることが判明しました。私は3つの可能な構造を知覚します:
- テキストの壁としてそれを書く-利点-すべての情報が一箇所にある
private
クラスでユーティリティ関数を記述し、それらをcalculate
ボディで使用する-欠点-クラスの残りの部分は、これらのメソッドを知らない/気遣わない/理解しないcalculate
次のように書きます:void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); }
これは良いプラクティスか悪いプラクティスか?このアプローチは問題を明らかにしますか?全体として、再び同じ状況に直面したとき、これを良いアプローチと考えるべきですか?
編集:
class A{
...
public:
// Reconfiguration of the algorithm.
void set_colour(double colour);
void set_density(double density);
void set_predelay(unsigned long microseconds);
void set_reverb_time(double reverb_time, double room_size);
void set_drywet(double left, double right);
void set_room_size(double value);;
private:
// Sub-model objects.
...
}
これらすべての方法:
- 値を得る
- 状態を使用せずに、他の値を計算します
- いくつかの「サブモデルオブジェクト」を呼び出して、状態を変更します。
set_room_size()
これらのメソッドは、要求された値をサブオブジェクトに渡すだけであることがわかります。set_room_size()
一方、あいまいな式の画面をいくつか表示し、(2)サブオブジェクトのセッターを呼び出す画面の半分を実行して、取得したさまざまな結果を適用します。したがって、関数を2つのラムダに分割し、関数の最後で呼び出します。もっと論理的なチャンクに分割できたら、より多くのラムダを分離できたでしょう。
とにかく、現在の質問の目標は、その考え方が持続するべきか、それともせいぜい価値(読みやすさ、保守性、デバッグ能力など)を追加しないかを決定することです。
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
物理的な世界に存在する可能性のあるオブジェクトに関するデータを確実にA
表します。実オブジェクトなしののインスタンスとのインスタンスなしの実オブジェクトを持つことができるので、それらを1つの同じものとして扱うのは無意味です。A
A
calculate()
これらのサブ機能について知らないでしょう。
A
場合、それは少し極端になっています。
A
物理世界のオブジェクトを表します。これは、クラスを分割しないことの強力な議論です。」残念ながら、プログラミングを始めたとき、私はこれを言われました。たくさんの馬のホッケーだと気づくのに何年もかかりました。ものをグループ化するのは恐ろしい理由です。少なくとも私が満足する限りでは、物事をグループ化する正当な理由を明確にすることはできませんが、それは今すぐ捨てるべきものです。結局のところ、すべてが「良いコード」であるということは、正しく動作し、比較的理解しやすく、比較的簡単に変更できるということです(つまり、変更には奇妙な副作用はありません)。