python - 当方法可以接受各种类型的数据时,单一责任原则?
问题描述
最佳实践建议一个方法或函数应该做一件事,并且做好,那么我该如何在以下场景中应用 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
解决方案
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
你想要的任何东西(或者作为一个函数Entity
,Domain
或者作为一个单独的函数在外面。这会给你更清晰的单元测试,但在你的特定情况下,你可以决定保持原样而不是过度设计它。KISS也是一个很好的原则
推荐阅读
- java - Java:将 LocalDateTime 保存到 MySQL 会持续减去 7 小时
- django - 关系“django_session”不存在
- javascript - 如何调用组件内部的方法确实从 react.js 中的第 3 方库更新?
- javascript - 语法帮助 - javascript 中的 HTML
- mqtt - socket.gaierror: [Errno -2]
- azure - Azure 条件访问不适用于令牌获取请求?
- sql - 根据现有日期列(MYSQL)为“周结束日期”创建一个新列
- ruby-on-rails - 如何自动更新rails中的字段
- java - REST 服务访问另一个第三方服务
- javascript - 一次设置多个 javascript 变量