Рассмотрим влияние языка программирования на мышление. На примере популярной библиотеки - 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». Это предложение как раз покажет нам еще раз в подробностях, что язык определяет мышление.