Деякі кажуть, що якщо ви доведете принципи SOLID до їхніх крайнощів, ви закінчите функціональне програмування . Я погоджуюся з цією статтею, але думаю, що деяка семантика втрачається при переході від інтерфейсу / об’єкта до функції / закриття, і я хочу знати, як функціональне програмування може зменшити втрати.
Зі статті:
Крім того, якщо ви жорстко застосовуєте Принцип розділення інтерфейсу (ISP), ви зрозумієте, що вам слід надавати перевагу рольовим інтерфейсам над заголовками.
Якщо ви продовжуєте рухати свій дизайн до менших та менших інтерфейсів, ви зрештою дістанетеся до кінцевого інтерфейсу ролей: інтерфейсу з єдиним методом. Це трапляється зі мною багато. Ось приклад:
public interface IMessageQuery
{
string Read(int id);
}
Якщо я приймаю залежність від договоруIMessageQuery
, частина неявного контракту полягає в тому, що дзвінок Read(id)
буде шукати і повертати повідомлення з даним ідентифікатором.
Порівняйте це з залежністю від його еквівалентної функціональної підпису int -> string
. Без додаткових підказів ця функція може бути простою ToString()
. Якщо ви реалізовуєте IMessageQuery.Read(int id)
з ToString()
I, я можу звинуватити вас у навмисному підриві!
Отже, що можуть зробити функціональні програмісти, щоб зберегти семантику добре названого інтерфейсу? Це звичайно, наприклад, створити тип запису з одним членом?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
... можливо, саме тому документація є частиною договору ?