Да, это определенно запах кода, и вы обнаружили почему: что происходит, когда вы добавляете новые 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
больше не нужно выставлять свои атрибуты.