私は手紙を進めたアプリを書くことに決めました。 は、だから私は概念を表すクラスを細工:クラスにさらに多くの状態を追加することを避けるにはどうすればよいですか?
class Letter
{
//implementation1
};
その後、私は、私は、このような「処理」などの文字のためのいくつかの「フラグ」を追加する必要があることに気づき、「処理」、「wont_be_processed」。
class Letter
{
//implementation1
state letter_state_;
};
そして、すべての文字がいくつかのコンテナに格納されているとします。
(上記の状態は実装には、 であり、ビジネスロジックの一部ではないことを明確にしておきたい)
最後に、別の特別なフラグが必要であることを理解しました。コンテナに格納されているすべてのオブジェクト。
だから、私が今見ているさらに進行する方法を2つの素朴な方法があります。
1)は、別のフラグを追加します。
2)別のフィールドを追加します。
"処理中"、 "処理済み"、 "未処理"はどういう関係であっても、新しい状態はそれらに適切に関連しないため、最初のオプションは不自然になります。 2番目のオプションはクラスの拡張につながります。また、私の同僚は新しいフィールドを追加するのが好きではありません(しかし、根拠を証明することなく)。
このような設計の落とし穴や問題を解決するための標準的な方法はありますか?
Upd。追加された例。
void process_letter(Letter& foo)
{
if(foo.latter_state_ == states::wont_be_processed)
return;
if(foo.letter_state_ == states::processed)
process_impl_1(foo);
}
たのでしょうか?
void process_letter(Letter& foo)
{
if(foo.latter_state_ == states::wont_be_processed
&& foo.new_spacial_state_ != special_state::bar)
return;
if(foo.letter_state_ == states::processed)
process_impl_1(foo);
}
UPD2
はたぶん、全体のデザインは完全に間違っています。もしそうなら、質問を閉じるべきですか?
新しい状態が有効な場合は元の状態は適用されません.2)元の状態は新しい状態とは独立しており、適用されている可能性があります。 1)の場合は新しい状態です。 2)の場合は、新しいフィールドです。 – stark
それは第2のケースです。しかし、クラスがかなり大きいと仮定し、新しいフィールドを正しく処理するためにコンストラクタに新しいコード行を追加する必要があります。また、クラスのシリアル化を担当するコードを変更する必要があります。新しいフィールドを追加すると、異なるファイルが変更されます。一方、このフィールドの唯一の消費者は、1つの方法で1つの「if」になります。そのような「順応」のために新しいフィールドを追加することを止めるべき行がありますか? –
恐らく、「州」という言葉の使用は誤解を招きます。私はちょうどこのプロパティに基づいて処理するために、何らかの形で文字にプロパティを割り当てる必要があります。しかし、私は別の文字の新しいクラスを導入し、それらを作成するためのファクトリを書きたいとは思わない。また、私は動的多型を使用しないようにしています。 –