Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单一责任原则当方法可以接受各种类型的数据时?_Python_Design Patterns_Single Responsibility Principle - Fatal编程技术网

Python 单一责任原则当方法可以接受各种类型的数据时?

Python 单一责任原则当方法可以接受各种类型的数据时?,python,design-patterns,single-responsibility-principle,Python,Design Patterns,Single Responsibility Principle,最佳实践建议一个方法或函数应该做一件事,并且做得很好,那么我如何在以下场景中应用SRP: 小结:我有一个发送HTTP Post请求的API包装器,但是为了提供json,我希望允许用户有多个选项,假设我的函数可以接受以下任何选项: def function_for_srp(jsonable_data: Union[Entity, Domain, str]): # Pseudo code (Violation of SRP?) if jsonable_data is instance

最佳实践建议一个方法或函数应该做一件事,并且做得很好,那么我如何在以下场景中应用SRP:

小结:我有一个发送HTTP Post请求的API包装器,但是为了提供json,我希望允许用户有多个选项,假设我的函数可以接受以下任何选项:

def function_for_srp(jsonable_data: Union[Entity, Domain, str]):
    # Pseudo code (Violation of SRP?)
    if jsonable_data is instance of entity or domain:
        jsonable_data = json.dumps(jsonable_data) 
    else do nothing, as its a json encoded string of data already
    some_api_wrapper.post_data(jsonable_data) 
此函数根据传递给它的数据类型执行多项操作,因此是否违反了SRP?我如何以干净的方式克服这个设计问题,理想情况下我会这样想:

def function_for_srp_using_entity(entity: Entity): pass
def function_for_srp_using_domain(domain: Domain): pass
def function_for_srp(json_encoded_data: str): pass
上面的是“蟒蛇”吗? 有更好的方法吗

# possible alternative?
def function_for_srp(jsonable_data: Union[Entity, Domain, str]):
    json = some_other_function(jsonable_data)
    some_api_wrapper.post_something(json)
    # Is this still a violation?

def some_other_function(jsonable_data: Union[Entity, Domain, str]):
    # Figure out the type and return a json encoded string that is suitable
    if isinstance of entity/domain, json dump and return
    else check if is valid json encoded string, if not make it valid and return it

SRP无疑是一个很好的遵循原则,但在实践中,您需要知道何时划清界限,否则会给代码增加太多的复杂性

在您的特殊情况下,我会从对您的用户更有利的方面入手,并决定您是否保留此功能

def function_for_srp(jsonable_data: Union[Entity, Domain, str]):

第二个选择很明确,你没有违反任何原则:)

如果您想保留第一个选项,您可以执行以下操作(也是伪代码):

您可以按照自己的意愿实现
getJson
(作为
实体上的函数
之外的单独函数)。
这将为您提供更清晰的单元测试,但在您的特定情况下,您可以决定保持原样,而不是过度设计。KISS也是一个很好的遵循原则

第二种方法会有什么问题?
def function_for_srp_using_entity(entity: Entity): pass
def function_for_srp_using_domain(domain: Domain): pass
def function_for_srp(jsonable_data: Union[Entity, Domain, str]):
jsonableData = jsonable_data.getjson(); 
some_api_wrapper.post_data(jsonable_data)