是否有設計模式或方法或語言,使您可以編寫複雜的條件邏輯超越嵌套的Ifs?替代嵌套如果條件邏輯
至少,這種問題或問題是否有名字?我無法在這裏或通過Google找到任何描述我想解決的事情,不僅僅是用一個Switch語句替換您的IF。
我正在玩一個腳本來生成一堆數據。作爲其中的一部分,我想添加很多分支條件邏輯,這些邏輯應該提供變化以及阻止某些組合。
類似的,如果用戶是組A的一部分,那麼他們不能成爲B組的一部分,並且如果他們具有屬性C,那麼它將它們限制爲特性5或6,但是沒有低於或高於該特性。
是否有設計模式或方法或語言,使您可以編寫複雜的條件邏輯超越嵌套的Ifs?替代嵌套如果條件邏輯
至少,這種問題或問題是否有名字?我無法在這裏或通過Google找到任何描述我想解決的事情,不僅僅是用一個Switch語句替換您的IF。
我正在玩一個腳本來生成一堆數據。作爲其中的一部分,我想添加很多分支條件邏輯,這些邏輯應該提供變化以及阻止某些組合。
類似的,如果用戶是組A的一部分,那麼他們不能成爲B組的一部分,並且如果他們具有屬性C,那麼它將它們限制爲特性5或6,但是沒有低於或高於該特性。
答案很簡單:重構。
讓我們舉個例子(僞代碼):
if (a) {
if (b) {
if (c) {
// do something
}
}
}
可以被替換爲:
if (a && b && c) {
// do something
}
現在,說a
,b
和c
是複雜的謂詞,這使得代碼難以例如:
if (visitorIsInActiveTestCell(visitor) &&
!specialOptOutConditionsApply(request, visitor) &&
whatEverWeWantToCheckHere(bla, blabla)) {
// do something
}
我們可以重構這也創造了一種新方法:
def shouldDoSomething(request, visitor, bla, blabla) {
return visitorIsInActiveTestCell(visitor) &&
!specialOptOutConditionsApply(request, visitor) &&
whatEverWeWantToCheckHere(bla, blabla)
}
現在我們if
條件不嵌套,並變得更容易閱讀和理解:
if (shouldDoSomething(request, visitor, bla, blabla)) {
// do something
}
有時它不是簡單的提取等邏輯和重構,並且可能需要一些時間來考慮它,但我還沒有碰到一個不可能的例子。
這對於改進我今天開始的工作非常有用,並幫助我重新構建了問題。 基本上現在我有分類數據,並試圖找到方法來減少需要顯式評估的案例數量。每個參數限制在下一個參數中找到的選項數量,但對於分類數據,必須對每個個案進行評估以反駁它。 我想知道,如果我試圖找到一種方式來表達它作爲一個範圍,那麼我可能只是沒有評估任何高於/低於某個點的東西。 – Aaron
假設您使用的是面向對象的語言,您可能想用polymorphism替換條件邏輯。
也就是說,代替:
class Bird:
#...
def getSpeed(self):
if self.type == EUROPEAN:
return self.getBaseSpeed();
elif self.type == AFRICAN:
return self.getBaseSpeed() - self.getLoadFactor() * self.numberOfCoconuts;
elif self.type == NORWEGIAN_BLUE:
return 0 if isNailed else self.getBaseSpeed(self.voltage)
else:
raise Exception("Should be unreachable")
你可以說:
class Bird:
#...
def getSpeed(self):
pass
class European(Bird):
def getSpeed(self):
return self.getBaseSpeed()
class African(Bird):
def getSpeed(self):
return self.getBaseSpeed() - self.getLoadFactor() * self.numberOfCoconuts
class NorwegianBlue(Bird):
def getSpeed():
return 0 if self.isNailed else self.getBaseSpeed(self.voltage)
# Somewhere in client code
speed = bird.getSpeed()
從here服用。
我認爲你需要使用switch語句和if語句的組合。您可以將您的開關語句分解爲也具有開關語句的較小幫助函數。 –
@ whs.bsmith我甚至不記得一個例子(在將近20年的編程中),switch語句簡化了嵌套的if語句。但也許我只是很幸運;) – alfasin
@alfasin看看redux中的選擇器。 –