[О блоге] [наверх] [пред] [2021-09-14 08:04:14+03:00] [ce7f819e69134884ddc482056c4fa79c63226478]

Лучшее объяснение почему функциональные языки -- отстой

https://probablydance.com/2016/02/27/functional-programming-is-not-popular-because-it-is-weird/
Буквально именно так и ощущаю себя когда программирую на функциональном языке:

    Writing functional code is often backwards and can feel more like
    solving puzzles than like explaining a process to the computer. In
    functional languages I often know what I want to say, but it feels
    like I have to solve a puzzle in order to express it to the
    language.

Ну и отличные примеры того, как испечь императивный пирог:

    1. Preheat oven to 175 degrees C. Grease and flour 2 – 8 inch round
       pans. In a small bowl, whisk together flour, baking soda and salt;
       set aside.
    2. In a large bowl, cream butter, white sugar and brown sugar until
       light and fluffy. Beat in eggs, one at a time. Mix in the bananas.
       Add flour mixture alternately with the buttermilk to the creamed
       mixture. Stir in chopped walnuts. Pour batter into the prepared
       pans.
    3. Bake in the preheated oven for 30 minutes. Remove from oven, and
       place on a damp tea towel to cool.

и функциональный:

    1. A cake is a hot cake that has been cooled on a damp tea towel,
       where a hot cake is a prepared cake that has been baked in a
       preheated oven for 30 minutes.
    2. A preheated oven is an oven that has been heated to 175 degrees C.
    3. A prepared cake is batter that has been poured into prepared
       pans, where batter is mixture that has chopped walnuts stirred in.
       Where mixture is butter, white sugar and brown sugar that has been
       creamed in a large bowl until light and fluffy…

Именно вот про это я и говорю что для функциональщины нужно по другому
мыслить. Не как yet another ordinary human, а как математик с абстракциями.

    [оставить комментарий]
    комментарий 0:
    From: Алексей
    Date: 2021-09-14 09:57:45Z
    
    Увы, на ОО-языках можно написать такой же код. С тех пор, как кто-то придумал правило, что текст функции непременно должен влезать в экран, читать код стало намного труднее. Потому как то, что раньше было записано сплошняком, последовательно, теперь нарублено в салат из крошечных функций, которые вызывают и перевызывают друг друга. Буквально:
    
    1. Чтобы узнать, сколько нужно воды, см. п.8
    8. Количество воды зависит от количества муки (п.16) и масла (п.4) либо способом п.5, либо способом п.7 в зависимости от требуемого объёма теста (определяется в п.2).
    
    Я понимаю, когда в функции выносится код, выполняемый многократно. Но не когда на функции режется то, что в рамках программы больше ниоткуда, кроме текущего места, не вызывается! Когда каждый блок if вынесен в отдельную функцию, это жесть (учитывая, что возможность сворачивания блоков есть в любом текстовом редакторе, кроме разве что Блокнота).
    
    Так и это ещё не всё. Ведь какой-то вредитель авторитетно сказал, что композиция лучше наследования, а все остальные подхватили. Ну, и теперь у нас больше нет чёткой иерархии классов/объектов, а есть динамическое связывание. Фактически, структура программы собирается из кусочков прямо в рантайме, и вот тут понять алгоритм работы простым изучением кода становится адски сложно. Без отладчика практически нереально узнать, что, чёрт возьми, попадает в данные переменные или параметры, и даже какого оно типа. Точно так же сложно понять, при каких вообще условиях выполнится данный конкретный кусок кода (и выполнится ли он вообще), потому что у нас тут всюду косвенные вызовы, и простым поиском по имени функции/метода вы никогда никакого вызова не найдёте.
    
    комментарий 1:
    From: Sergey Matveev
    Date: 2021-09-14 10:06:13Z
    
    *** Алексей [2021-09-14 12:57]:
    >Увы, на ОО-языках можно написать такой же код.
    
    Согласен. Поэтому ООП тоже идёт нафиг :-)
    На чём угодно можно написать непонятный код -- тут никуда не денешься.
    Но на функциональщине я только простейшие вещи видел чтобы было ясно и
    понятно как их написать (хотя я тот ещё функциональщк :-)). Для
    функциональщины нужно мышление которое не каждому дано, а для ООП нужно
    много квалификации и опыта.
    
    >С тех пор, как кто-то придумал правило, что текст функции непременно должен влезать в экран, читать код стало намного труднее. Потому как то, что раньше было записано сплошняком, последовательно, теперь нарублено в салат из крошечных функций, которые вызывают и перевызывают друг друга. Буквально:
    
    Ага, встречал такое. Полный ужас. Вот что значит бездумное применение
    советов и практик. Как-то я на полном серьёзе видел код где требовалось
    около двадцати переходов по функциям/методам чтобы добраться до
    настоящего действия, что действительно там под капотом будет выполнятся.
    Ну типа .AddResult() какой-то был, и чтобы понять что оно на самом деле
    вырождается в self.result.append() -- нужно было под двадцать переходом
    по методам проделать.
    
    >Ну, и теперь у нас больше нет чёткой иерархии классов/объектов, а есть динамическое связывание. [...]
    
    Тоже верно. Бездумное применение чего угодно -- всегда плохо закончится.
    Я встречал что даже простой self.redis.get() превращался в код на ~200
    строк (без docstring-ов), ибо он сделан в лучших традициях и рекомендациях
    ООП был.