如何在引入新领域后处理模型的行为变化?

时间:2017-05-15 00:56:46

标签: python django algorithm oop design-patterns

我有一个模型/类,它有自己的方法来计算一些数据。最近我必须引入一个新的布尔/选择字段try: requests.get('http://192.168.1.100/state.xml?relayState=1&noReply=0') except requests.exceptions.ConnectionError as err: if "BadStatusLine" in repr(err): # TODO: be a responsible developer and figure out why I get BadStatusLine pass else: # wasn't the error I was expecting, so raise it raise ,基于该字段计算将在多个位置更改,尤其是在属性方法上。如下例所示:

is_producing

似乎在所有地方使用class Lease(models.Model): name = models.CharField(max_length=250) @property def owner_count(self): return 27 # for example class Lease(models.Model): name = models.CharField(max_length=250) is_producing = models.BooleanField(default=True) @property def owner_count(self): if self.is_producing: return 27 # for example else: return 20 # for example class Offer(models.Model): lease = models.ForeignKey(Lease) amount = models.FloatField() def save(self): if self.lease.is_producing: self.amount = 100 # For Example else: self.amount = 200 都是反模式而不直观。另一方面,如果我们使用该新字段创建一个新模型,它将复制大量代码并关联模型。

所以我正在寻找可以解决上述场景的设计模式或任何其他优雅的解决方案,可以用更少的代码重复来解决它。

1 个答案:

答案 0 :(得分:0)

我没有你想要实现的所有背景,但我的第一个赌注是看观察者设计模式:

https://en.wikipedia.org/wiki/Observer_pattern

租约将被视为subject,它将维护一个观察员列表(您正在谈论的地方)对其内部状态变化感兴趣。任何状态变化都会自动通知这些places。这将消除对你所指的if / else的需要,并允许组件之间的良好解耦。

希望这会有所帮助。