Здесь у вас есть: при выполнении условия необходимо выполнить действие .
Вы можете определить интерфейс (вы можете использовать простой базовый класс или абстрактный базовый класс) для захвата этого. Затем добавьте классы, которые реализуют этот интерфейс (наследуют от базового класса) для различных if's -> action .
Вот пример:
class Rule:
def isMetBy(self, deal):
pass
def execute(self, deal):
pass
class Rule1(Rule):
def isMetBy(self, deal):
return deal.current_trend == FLAT_TREND and CROSSED_BOTTOM_ORANGE in deal.crossing
async def execute(self, deal):
return await deal.create_order(CROSSED_BOTTOM_ORANGE)
class Rule2(Rule):
def isMetBy(self, deal):
return deal.current_trend == DOWN_TREND and CROSSED_BOTTOM in deal.crossing
async def execute(self, deal):
return await deal.create_order(CROSSED_BOTTOM)
rules = [Rule1(), Rule2()]
async def check_deal(deal):
for rule in rules:
if(rule.isMetBy(deal)):
return await rule.execute(deal)
Каждое правило содержит оператор if, являющийся вашим кодом. Таким образом, вы можете определить столько правил, сколько вам нужно. Добавление новых - это просто добавление другого класса. Если вы можете, вы назовете свои правила хорошими именами, так что это добавит преимущество или naming ваши правила. Я использовал Rule1 и Rule2, потому что я не знаю, что означают ваши правила. Например, у вас может быть что-то вроде (я только что сделал это для иллюстрации) EnableTrailingForProfitableDealsRule .
В вашем случае у вас есть один , если с несколькими subif's внутри. Вы можете разделить их на разные классы или использовать Composite pattern , чтобы создать rule с subrules .
Вот пример:
class CompositeRule(Rule):
subRules = []
def __init(self):
self.subRules = [Rule1(), Rule2()]
def isMetBy(self, deal):
if deal.is_profitable() and len(deal.orders) == 1 :
for rule in self.subRules:
if(rule.isMetBy(deal)):
return true;
return false
async def execute(self, deal);
for rule in self.subRules:
if(rule.isMetBy(deal)):
return await rule.execute(deal)
CompositeRules
может сделать код проще или труднее для понимания. Если ваш код становится сложнее понять с CompositeRules
, вы можете вместо этого использовать простые правила. Многие из этих простых правил будут иметь одно и то же значение, если они будут утверждены, но обычно это не проблема.
Вот CompositeRule
, разбитый на два простых правила:
class Rule1(Rule):
def isMetBy(self, deal):
return if deal.is_profitable() and len(deal.orders) == 1 and deal.current_trend == UP_TREND and CROSSED_TOP in deal.crossing
async def execute(self, deal):
return await deal.trailing_enable(CROSSED_TOP)
class Rule2(Rule):
def isMetBy(self, deal):
return if deal.is_profitable() and len(deal.orders) == 1 and deal.current_trend == FLAT_TREND and CROSSED_TOP_GREEN in deal.crossing:
async def execute(self, deal):
return await deal.trailing_enable(CROSSED_TOP_GREEN)
Вы можете поэкспериментировать и выбрать лучший подход, который вам подходит.