[英]Are nested python try-except blocks bad code or code smell?
我遇到的情況是,我需要填充一個對象fillable_object,而我還有另一個對象fill_object用來填充第一個對象。 但是,filler_object可以是不具有相同屬性的不同類型。 在這種情況下,我希望與fillable_object中的字段相關的字段的值為null。
我想到的是,嘗試除塊之外,為每個可填充對象的類分組。 由於不同類的屬性集是互斥的,因此它們要么全部獲取要么不獲取,然后嘗試下一個類型,等等。當前fillable_object可以容納的類太多,但我認為這很煩人如果數量增加,以后再維護。
def fill_with(fillable, filler):
try:
fillable.attr1 = filler.attr1
except AttrError:
try:
fillable.attr2 = filler.attr2
fillable.attr3 = filler.attr3
except AttrError:
try:
#Continue for each class filler can be.
except AttrError:
return fillable
是的,這絕對是代碼的味道,您發現了原因:添加新的filler
對象時會發生什么? 您必須重寫函數。 這違反了開閉原則 。
軟件實體(類,模塊,功能等)應打開以進行擴展,但應關閉以進行修改
具體來說,您可以使用一些解決方法,但是您處於典型的“大開關”中,可以/應該用明智的多態用法代替。
在您的示例中, filler
觸發了異常:如果filler.attr1
不存在,則嘗試下一個屬性,依此類推。 該filler
物具有的知識,因此,你應該把fill_with
方法filler
。
class FillerA():
...
def fill(self, fillable):
fillable.attr1 = self.attr1
class FillerB():
...
def fill(self, fillable):
fillable.attr2 = self.attr2
fillable.attr3 = self.attr3
...
現在您的功能就是:
def fill_with(fillable, filler):
filler.fill(fillable)
該函數已關閉以進行修改,但是您可以通過添加新的filler
類型(使用fill
方法)來擴展它。 獎勵: filler
不再需要公開他的屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.