Основна причина, на яку прагне FP, а C # OOP не в тому, що у FP акцент робиться на еталонній прозорості; тобто дані переходять у функцію і дані виходять, але вихідні дані не змінюються.
У C # OOP існує концепція делегування відповідальності, де ви делегуєте управління об'єктом на нього, і тому ви хочете, щоб він змінив власну внутрішню.
У програмі FP ви ніколи не хочете змінювати значення в об'єкті, тому мати функції, вбудовані у ваш об'єкт, не має сенсу.
Далі у FP у вас вищий поліморфізм, що дозволяє вашим функціям бути набагато більш узагальненими, ніж дозволяє C # OOP. Таким чином ви можете написати функцію, яка працює для будь-якої a
, і тому вбудовувати її в блок даних не має сенсу; що б щільно пара методу так , що він працює тільки з конкретним видом з a
. Така поведінка в C # OOP все добре і поширена, тому що ви взагалі не маєте можливостей абстрактно функціонувати, але у FP це компроміс.
Найбільша проблема, яку я бачив у моделях анемічного домену в C # OOP, полягає в тому, що ви отримуєте дублікат коду, оскільки у вас є DTO x і 4 різні функції, які здійснюють активність f до DTO x, оскільки 4 різних людей не бачили іншої реалізації . Коли ви кладете метод прямо на DTO x, то ці 4 людини бачать реалізацію f і використовують її повторно.
Анемічні моделі даних у повторному використанні коду перешкод C # OOP, але це не так у FP, оскільки одна функція узагальнена на стільки різних типів, що ви отримуєте більше повторного використання коду, оскільки ця функція може бути використана в більшій кількості сценаріїв, ніж функція, яку ви написав би для одного DTO в C #.
Як зазначається в коментарях , висновок типу є однією з переваг, на які покладається FP, щоб дозволити такий значний поліморфізм, і конкретно ви можете простежити це до системи типу Хіндлі Мілнера з алгоритмом виводу типу W; такого виводу типу в системі типів C # OOP було уникнено, оскільки час компіляції, коли додається висновок на основі обмежень, стає надзвичайно довгим завдяки необхідному вичерпному пошуку, деталі тут: https://stackoverflow.com/questions/3968834/generics-why -cant-the-compiler-infer-the-type-argument-in-this-case