Я хочу реализовать бизнес-логику в python, в которой часто происходят изменения. Обновление этой бизнес-логики должно быть легким, а старую логику следует сохранить.
Моя текущая идея выглядит так:
class Item():
def __init__(self):
pass
def __call__(self, company, time):
if time < "2017Q1":
return self.calc_base(company, time)
elif time < "2018Q2":
return self.calc_after2017Q1
else:
return self.calc_after2018Q2
def calc_base(self, company, time):
return income(company, time) + costs(company, time)
@time_after("2017Q1")
def calc_after2017Q1(self, company, time):
intermediate = self.calc_base(company, time)
return max(intermediate, 100_000) #Haircutt due to article xxx
@time_after("2018Q2")
def calc_after2018Q2(self, company, time):
intermediate = self.calc_after2017Q1(company, time)
intermediate -= 20_000 #Correction due to xxx
Идея состоит в том, чтобы вызвать экземпляр этого класса с указанием компании и времени. Внутри класс будет искать, какую бизнес-логику использовать в течение этого времени, и направлять к правильной функции расчета. Всякий раз, когда логика меняется, просто добавляется новая функция и документируется ее отличие от предыдущих вычислений.
Эта реализация требует некоторой обработки с помощью if .. elif .. else в self. call . Кто-нибудь может подумать о питонном и умном способе автоматизации этого? Я думал в духе декораторов (как показано в этом примере, но они не реализованы), где я могу указать, с какого времени новая логика действительна, пока следующая не заменит ее.
Наконец, я чувствую, что заново изобретаю колесо, поскольку это, вероятно, очень стандартная проблема. Но почему-то мне не хватает словарного запаса, чтобы найти хорошие результаты в этом направлении. Поэтому я также был бы признателен за подсказки в правильном направлении.