工厂 class 方法是否违反了 Liskov 替换原则?
Do factory class methods break the Liskov substitution principle?
我想知道工厂 class 方法是否破坏了 Liskov substitution principle.
例如在下面的 Python 代码中,Response.from_request
工厂 class 方法会破坏它吗?
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)
替换原则说你需要能够用兼容类型(即子类型)的另一个对象替换一个对象,并且它的行为必须仍然相同。您需要从为特定对象键入提示的函数的角度来看:
def func(foo: BaseResponse):
...
此函数需要一个行为类似于 BaseResponse
的参数。那是什么行为?
get_headers()
get_body()
这是BaseResponse
仅有的两种方法。只要你传递给func
的对象有这两个特性,它就传递给BaseResponse
的duck test。如果它进一步实现任何额外的方法,那没有关系。
所以,不,class 方法不会破坏 LSP。
我想知道工厂 class 方法是否破坏了 Liskov substitution principle.
例如在下面的 Python 代码中,Response.from_request
工厂 class 方法会破坏它吗?
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)
替换原则说你需要能够用兼容类型(即子类型)的另一个对象替换一个对象,并且它的行为必须仍然相同。您需要从为特定对象键入提示的函数的角度来看:
def func(foo: BaseResponse):
...
此函数需要一个行为类似于 BaseResponse
的参数。那是什么行为?
get_headers()
get_body()
这是BaseResponse
仅有的两种方法。只要你传递给func
的对象有这两个特性,它就传递给BaseResponse
的duck test。如果它进一步实现任何额外的方法,那没有关系。
所以,不,class 方法不会破坏 LSP。