【问题标题】:Single Responsibility Principle when method can accept various types of data?当方法可以接受各种类型的数据时,单一责任原则?
【发布时间】:2019-06-11 18:45:36
【问题描述】:

最佳实践建议一个方法或函数应该做一件事,并且做好,那么我该如何在以下场景中应用 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

上面是“pythonic”吗? 有没有更好的方法?

# 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

【问题讨论】:

  • 第二种方法有什么问题?

标签: python design-patterns single-responsibility-principle


【解决方案1】:

SRP 绝对是一个值得遵循的重要原则,但在实践中,您需要知道何时划清界限,否则您将给代码增加太多复杂性。

在你的特殊情况下,我会从对你的用户更好的开始,然后决定你是否保留这个

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

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) 

您可以根据需要实现getJson(作为EntityDomain 上的函数,或者作为外部单独的函数。 这将为您提供更清晰的单元测试,但在您的特定情况下,您可以决定保持原样而不是过度设计它。 KISS 也是一个很好的遵循原则

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多