【问题标题】:Do factory class methods break the Liskov substitution principle?工厂类方法是否违反了 Liskov 替换原则?
【发布时间】:2019-08-19 11:07:42
【问题描述】:

我想知道工厂 class 方法是否会破坏 Liskov substitution principle

例如在下面的 Python 代码中,Response.from_request 工厂类方法会破坏它吗?

import abc


class BaseResponse(abc.ABC):

    @abc.abstractmethod
    def get_headers(self):
        raise NotImplementedError

    @abc.abstractmethod
    def get_body(self):
        raise NotImplementedError


class Response(BaseResponse):

    def __init__(self, headers, body):
        self.__headers = headers
        self.__body = body

    def get_headers(self):
        return self.__headers

    def get_body(self):
        return self.__body

    @classmethod
    def from_request(cls, request, payload):
        headers = request.get_headers()
        headers["meta_data"] = payload["meta_data"]
        body = payload["data"]
        return cls(headers, body)

【问题讨论】:

    标签: python factory class-method liskov-substitution-principle


    【解决方案1】:

    替换原则说您需要能够用兼容类型(即子类型)的另一个对象替换一个对象,并且它的行为必须仍然相同。您需要从为特定对象键入提示的函数的角度来看待这一点:

    def func(foo: BaseResponse):
        ...
    

    此函数需要一个行为类似于BaseResponse 的参数。这是什么行为?

    • get_headers()
    • get_body()

    这是BaseResponse仅有的两种方法。只要你传递给func的对象有这两个特征,它就传递BaseResponseduck test。如果它进一步实现了任何额外的方法,那就无所谓了。

    所以,不,类方法不会破坏 LSP。

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2012-01-12
      • 1970-01-01
      • 2021-11-17
      • 2020-02-03
      • 2017-07-04
      • 2014-08-16
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多