LINUX.ORG.RU
ФорумTalks

Программирование курильщика (python) и нормального человека

 ,


0

1

Рассмотрим влияние языка программирования на мышление. На примере популярной библиотеки - aiohttp.

Допустим Вы программируете http-сервер.

Вам нужна функция добавления роутов в список.

Вы начинаете с универсальной:

def add_route(self, method: str, path: str,
              handler: Union[_WebHandler, AbstractView],
              *, name: Optional[str]=None,
              expect_handler: Optional[_ExpectHandler]=None
             ) -> AbstractRoute:
    resource = self.add_resource(path, name=name)
    return resource.add_route(method, handler,
                              expect_handler=expect_handler)

Чтобы пользователю Вашей библиотеки было хорошо, Вы предоставляете ему возможность определить наследника Вашего класса, работающего с роутером, принимаете аргумент router. Таким образом, если юзеру что-то нужно - он доопределит поведение этой функции и будет радоваться жизни...

Затем Вам требуются частные случаи (есть желание упростить использование Вашей библиотеки). Вы хотите добавить add_post, Вы добавляете его, переиспользуя универсальный метод:

def add_post(self, path: str, handler: _WebHandler,
             **kwargs: Any) -> AbstractRoute:
    """
    Shortcut for add_route with method POST
    """       
    return self.add_route(hdrs.METH_POST, path, handler, **kwargs)

Всё идёт хорошо, Вы продолжаете работу. Добавляем другие методы, например add_delete:

def add_delete(self, path: str, handler: _WebHandler,
               **kwargs: Any) -> AbstractRoute:
    """
    Shortcut for add_route with method DELETE
    """
    return self.add_route(hdrs.METH_DELETE, path, handler, **kwargs)

Некоторое время всё еще идёт хорошо. Вы продолжаете работу. Нужно еще добавить методы add_get и так далее.

В этом месте Вы вспоминаете, что Вы программируете на Python. А язык определяет мышление, поэтому Вы пишете следующий вариант add_get:

def add_get(self, path: str, handler: _WebHandler, *,
            name: Optional[str]=None, allow_head: bool=True,
            **kwargs: Any) -> AbstractRoute:
    """
    Shortcut for add_route with method GET, if allow_head is true another
    route is added allowing head requests to the same endpoint
    """
    resource = self.add_resource(path, name=name)
    if allow_head:
        resource.add_route(hdrs.METH_HEAD, handler, **kwargs)
    return resource.add_route(hdrs.METH_GET, handler, **kwargs)

А и правильно! Если пользователи вдруг не огребут проблемы, почему их наследник не получает вдруг в add_route GET-определения, то их мышление же может вдруг выправиться, а это недопустимо!

PS: Тексты примеров взяты из aiohttp/web_urldispatcher.py Версия 3.5.4.

PPS: понимаю что мне скажут «переопредели еще и add_get». Это предложение как раз покажет нам еще раз в подробностях, что язык определяет мышление.

★★

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.