And can you keep your head, your backbone or your heart? We all found out the answer on the day it fell apart.
Подумалось тут, про уровни абстракции и про взаимоотношения объектов.
Если расширять старую шутку про "математики - это такие машины, перегоняющие кофе в теоремы" до "а программисты перегоняют кофе в код" и пытаться описать её в функциональном языке программирования, резко окажется, что "машина", которая выдаёт "результаты" - не математики или программисты, а кофе.
Ну, посудите сами:
Ввод - вывод:
Кофе(математик) - теорема
Кофе(программист) - код
Но! В парадигме ООП резко становится лучше описывать именно классы "программист" и "математик"; с методом, например, питьё.
Программист.питьё(кофе) - код
Математик.питьё(кофе) - теорема
А метод "питьё", соответственно, общий для всего, что наследует класс "Человек" в целом.
Так. кажется. сегодня я продуктивно поработал и знатно упоролся.
Если расширять старую шутку про "математики - это такие машины, перегоняющие кофе в теоремы" до "а программисты перегоняют кофе в код" и пытаться описать её в функциональном языке программирования, резко окажется, что "машина", которая выдаёт "результаты" - не математики или программисты, а кофе.
Ну, посудите сами:
Ввод - вывод:
Кофе(математик) - теорема
Кофе(программист) - код
Но! В парадигме ООП резко становится лучше описывать именно классы "программист" и "математик"; с методом, например, питьё.
Программист.питьё(кофе) - код
Математик.питьё(кофе) - теорема
А метод "питьё", соответственно, общий для всего, что наследует класс "Человек" в целом.
Так. кажется. сегодня я продуктивно поработал и знатно упоролся.
упарываться так упарываться:
алсо где-то там надо использовать ковариацию или контрвариацию но мне влом
helvene, исходный комментарий тоже был хорош но вот 17 я выдохну уже, да.
DrinkResult я б убрал — он отравляет всю классовую иерархию необходимостью наследоваться от него каждый раз, когда ты хочешь вернуть соответствующий класс из IBeverageTransformer. В частности, это лишает тебя возможности возвращать классы, определённые в third-party libraries. Сделать это можно с помощью generics - не знаю, как это выглядит в Шарпах, в java это.
Кроме того, instanceOf (который b is Coffee) считается code smell. Один из способов с этим справиться — double dispatch (см Visitor Pattern*). Но на самое деле это излишне тут, потому что у напитка нет особого поведения, так что его можно просто сделать Enum (не знаю как в шарпах, в джаве к ним можно приклеивать состояние и даже методы).
*Хотя вот я счас на него смотрю, и мне ясно, что с самим этим "паттерном" есть проблемы.
в C# через extention methods можно, но как по мне это костыль
но действительно, если от кофе ничего больше не требуется, можно и enum
ну и с дженериком красивее, да)))
А если серьезно, когда в голову приходят мысли, из которых состоит твой заглавный пост, это сигнал, что нужно срочно сменить род деятельности.