【发布时间】:2020-10-28 09:47:52
【问题描述】:
我有一个类接受不同数量的输入但实现相同的目标(相同的输出)。它是一个复杂的类,大量用于 API。我构建了一个类处理程序,它接受输入并根据 API 请求将它们映射到函数中。
我不确定这种设计是否可维护,或者它是否会带来其他问题。所以我有这些询问:
- 这种设计是否可维护和可扩展?
- 这是容错的吗?
- 我可以改进它吗?
- 我是否遵循与任何公认的设计模式相似的设计?
- 有什么建议吗?
请看一下这个非常简化的代码设计:
处理程序:
def class_handler(class_usage_type, class_object, kwargs):
# Method inputs and procedures are different but output is the same
Usage_FUNC_MAP = {
'use_method_x': class_object.method_x,
'use_method_y': class_object.method_y,
'use_method_z': class_object.method_z,
# ...
}
try:
result = Usage_FUNC_MAP[class_usage_type](**kwargs)
except Exception as e:
result = {
'output_elem1': kwargs
'output_elem2': f'Error: {e}',
'output_elem3': f'Error {e}'
}
finally:
return result
类
class some_class():
# ...init
def method_x(self, param1_for_x, param2_for_x):
# ...procedure for x
return same_output
def method_y(self, param1_for_y):
# ...procedure for y
return same_output
def method_z(self, param1_for_z, param2_for_z, param3_for_z, param4_for_z):
# ...procedure for z
return same_output
# ...
API
# Main is in a different file as an API
# Route 1 for x
# ...
params_for_x = {"param1_for_x": '...', "param2_for_x": '...'}
result_for_x = class_handler(class_usage_type='use_method_x', class_object=some_class, kwargs=params)
#...
# Route 2 for y
# ...
params_for_y = {"param1_for_y": '...'}
result_for_y = class_handler(class_usage_type='use_method_y', class_object=some_class, kwargs=params)
# ...
# Route 3 for z
# ...
params_for_z = {"param1_for_z": '...', "param2_for_z": '...', "param3_for_z": '...', "param4_for_z": '...'}
result_for_z = class_handler(class_usage_type='use_method_z', class_object=some_class, kwargs=params)
# ...
# ...
【问题讨论】:
-
为什么需要类处理程序?你也可以访问
result_for_x = some_class.method_x(params)? -
看起来这是更适合Code Review的问题
-
@AlexanderRiedel 在一个地方处理输入参数的差异,这可能会产生错误,而不是在类中的每个函数中处理它们。另一个原因是在 API 使用方面使用函数“名称”
标签: python class design-patterns structure handler