我的项目中有两个类:首先使用comments
执行某些操作,然后使用alerts
执行AlertFilterService
和CommentFilterService
它们具有几乎相同的构造函数和完全相同的方法签名,例如do_somethig_for_alerts(self)
和do_something_for_comments(self)
。
class AlertFilterService:
do_somethig_for_alerts(self):
some_code
if
code
else:
message['status'] = AlertStatus.NEW.value
await self.db.store_alert(message)
class CommentFilterService
do_somethig_for_comments(self):
some_code
if
code
else:
message['status'] = CommentStatus.NEW.value
await self.db.store_comment(message)
如何避免代码重复?我想要一个像FilterService
这样的抽象类(它将包含所有常见部分)和两个具体实现。这样做的最佳方式是什么?
答案 0 :(得分:0)
如果你有两个几乎相同的类,而另一个具有很小的差异,你可以通过扩展它来继承另一个。
如果你想拥有一个单独的类,可以实现两种不同的方法来处理不同的情况,或者只使一个方法接受一个参数来处理这种情况,具体取决于传递的参数
答案 1 :(得分:0)
你可以尝试类似的东西
def select_val_type(tag)
if (tag== "comments"
val== Comments.NEW.value
else:
val == AlertStatus.NEW.value
message['status'] = val
if(tag == "comments")
await self.db.store_comments(message)
else:
await self.db.store_alert(message)
答案 2 :(得分:0)
有很多方法可以解决这个问题,所以如果没有太多背景,我会坚持一个非常普遍的答案。
这是state pattern的非常一般/粗略实现/用例。有关实施,请参阅this link。
class MessageStatus(object):
def __init__(self, status_instance):
self._status_instance = status_instance # maintain a ptr to the class containing your attributes
def __call__(self):
# some code
if some_condition:
# more code
else:
message['status'] = self.cls.NEW.value
await self.status_instance.db.store_comment(message)
状态模式是一种行为软件设计模式,它以面向对象的方式实现状态机。使用状态模式,通过将每个单独的状态实现为状态模式接口的派生类来实现状态机,并通过调用由模式的超类定义的方法来实现状态转换。
注意:根据状态模式的前一个大纲,如果你想使状态模式符合要求,我建议重构你的代码,使注释/警报状态类是通用状态类的子类,将包含上述逻辑。