比方說,我決定寫一個應用程序,進行信件。 所以我製作的一類代表的概念:如何避免爲班級添加越來越多的狀態?
class Letter
{
//implementation1
};
然後我意識到我需要添加一些「標誌」的字母,如「處理」,「處理」,「wont_be_processed」。
class Letter
{
//implementation1
state letter_state_;
};
並假設所有字母都存儲在某個容器中。
(我想清楚上面提到的狀態是實施所必需的, 並不是業務邏輯的一部分。)
最後我明白我需要另一個特殊的標誌,它只用於一個字母所有對象,存儲在容器中。
於是兩個天真的方式如何進一步,我看現在是着手:
1)添加其他標誌;
2)添加另一個字段。
請注意,第一個選項將是不自然的,因爲「處理」,「處理」,「wont_be_processed」以某種方式相互關聯,並且新狀態不會正確地與它們相關。 第二個選項導致課程膨脹,我的同事也不喜歡添加新的字段(但是,沒有證明理由)。
是否有這樣的設計陷阱的集合名稱或克服問題的標準方法?
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
也許,整個設計是完全錯誤的。如果是這樣,我應該關閉這個問題嗎?
只有兩種可能性:1)新狀態生效時原狀態不適用,2)原狀態獨立於新狀態,可能仍然適用。如果1)那麼它是一個新的狀態。如果2)那麼它是一個新的領域。 – stark
這是第二種情況。然而,假設類是相當大的,我需要在構造函數中添加新的代碼行以正確處理新字段,並且我還需要更改代碼,負責類的序列化。所以添加新字段會導致不同文件的更改。同時,這個領域的唯一消費者將是一個「如果」在一個方法。是否有一條線,我應該停止添加這種「本性」的新領域? –
也許,使用「狀態」這個詞是有誤導性的。我只需要以某種方式將屬性分配給字母以基於這些屬性來處理它們。但是我不想爲不同的字母引入新的類並寫一個工廠來創建它們。另外,我儘量避免使用動態多態。 –