如何概括两个完全相同但不同实体的类的逻辑?

时间:2017-08-28 13:00:34

标签: python design-patterns

我的项目中有两个类:首先使用comments执行某些操作,然后使用alerts执行AlertFilterServiceCommentFilterService

它们具有几乎相同的构造函数和完全相同的方法签名,例如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这样的抽象类(它将包含所有常见部分)和两个具体实现。这样做的最佳方式是什么?

3 个答案:

答案 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) 
  

状态模式是一种行为软件设计模式,它以面向对象的方式实现状态机。使用状态模式,通过将每个单独的状态实现为状态模式接口的派生类来实现状态机,并通过调用由模式的超类定义的方法来实现状态转换。

注意:根据状态模式的前一个大纲,如果你想使状态模式符合要求,我建议重构你的代码,使注释/警报状态类是通用状态类的子类,将包含上述逻辑。