В соответствии с рекомендациями метод или функция должны выполнять одну задачу и делать это хорошо, поэтому как я могу применить SRP в следующем сценарии:
Резюме: у меня есть API-оболочка, которая отправляет запрос HTTP Post, однако, чтобы предоставить 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