Это запах кода, если функция возвращает или принимает ввод различных типов? - PullRequest
0 голосов
/ 19 марта 2020

Допустим, у нас есть следующий класс обслуживания.

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.

...