Допустим, у нас есть следующий класс обслуживания.
class SearchService:
def search(self, data: dict):
location_data = validate_input(data)
return get_results(location_data)
На самом деле этот класс сложен и использует внедрение зависимостей, но я пытаюсь сжать проблему. validate_input()
содержит сложные логики c и решает, в каком месте мы хотим искать.
def validate_input(data: dict):
if _is_point(data):
return PointLocation(data['lat'], data['lng'])
if _is_box(data):
return BoxLocation(data['lat1'], data['lng1'], data['lat2'], data['lng2'])
return PointLocation(0, 0) #default
Обратите внимание, как он может решить возвращать принципиально разные «типы» локаций. Первоначально я пытался go для какого-то вида LocationInterface
, но остановился, потому что это принципиально разные типы местоположений - я не мог найти ничего, чтобы объединить их и добавить в интерфейс. Затем это местоположение передается в другой сервис, который знает, что с ним делать
def get_results(location: Union[PointLocation, BoxLocation]):
HANDLERS = {
PointLocation: PointLocationHandler,
BoxLocation: BoxLocationHandler,
}
return HANDLERS[location.__class__].get_results(location)
Мой вопрос: считаете ли вы, что это нарушение какого-то фундаментального принципа OOP, и если да, то как это может быть улучшенный? Я беспокоился о том, что это нарушает принцип разделения интерфейсов, но после долгих перемоток я не мог решить, имеет ли это значение в данном случае - когда нарушающий объект является DTO, который не реализует сам лог c.