假設我有一個長而複雜的條件列表,爲了運行if語句,它必須是true。是否有一種更可讀的方式來製作&&陳述的長鏈?
if(this == that && foo != bar && foo != that && pins != needles && apples != oranges)
{
DoSomethingInteresting();
}
通常情況下,如果我被迫做這樣的事情,我只是把每個語句在其自己的行,像這樣:
if
(
this == that
&& foo != bar
&& foo != that
&& pins != needles
&& apples != oranges
)
{
DoSomethingInteresting();
}
但我還是覺得這是一個有點一團糟。我很想if語句的內容重構爲自己的財產像這樣
if(canDoSomethingInteresting)
{
DoSomethingInteresting();
}
但後來只是將所有的爛攤子到canDoSomethingInteresting()
並沒有真正解決問題。
正如我所說,我的goto解決方案是中間的解決方案,因爲它不會像最後一個那樣混淆邏輯,並且比第一個更具可讀性。但是一定有更好的辦法!
例如,響應於Sylon的評論
bool canDoSomethingInteresting
{
get{
//If these were real values, we could be more descriptive ;)
bool thisIsThat = this == that;
bool fooIsntBar = foo != bar;
bool fooIsntThat = foo != that;
return
(
thisIsThat
&& fooIsntBar
&& fooIsntThat
);
}
}
if(canDoSomethingInteresting)
{
DoSomethingInteresting();
}
是你的每個條件在邏輯上是不同的,還是有一些屬於一起?例如,結合你的條件的子集是否合理? –
我不會考慮第三種解決方案混淆。如果方法名稱反映了它的作用,那麼IMO會使重要代碼更具可讀性。在我無法避免像這樣的條件邏輯的情況下,我使用類似於第二種排列條件的第三種解決方案。 (使其易於修補和調整) –
它可以是我想的。我不是在解決一個具體的問題,而是尋找更多的模式或更好的思維方式。讓我們走最壞的情況,假裝它們在邏輯上是截然不同的,因爲這會帶來更大的複雜性。 –