Некоторые говорят, что если вы доведете принципы SOLID до крайности, вы в конечном итоге окажетесь в функциональном программировании . Я согласен с этой статьей, но думаю, что при переходе от интерфейса / объекта к функции / закрытию теряется некоторая семантика, и я хочу знать, как функциональное программирование может уменьшить потери.
Из статьи:
Кроме того, если вы строго применяете принцип разделения интерфейса (ISP), вы поймете, что вам следует отдавать предпочтение ролевым интерфейсам по сравнению с интерфейсами заголовков.
Если вы продолжите продвигать свой дизайн к все меньшим и меньшим интерфейсам, вы в конечном итоге получите конечный ролевый интерфейс: интерфейс с одним методом. Это часто случается со мной. Вот пример:
public interface IMessageQuery
{
string Read(int id);
}
Если я возьму зависимость от IMessageQuery
, часть неявного контракта заключается в том, что вызов Read(id)
будет искать и возвращать сообщение с заданным идентификатором.
Сравните это с получением зависимости от эквивалентной функциональной сигнатуры int -> string
. Без каких-либо дополнительных сигналов эта функция может быть простой ToString()
. Если вы реализуете IMessageQuery.Read(int id)
с ToString()
меня могут обвинить вас в том , сознательно подрывной!
Итак, что могут сделать функциональные программисты, чтобы сохранить семантику хорошо названного интерфейса? Например, принято ли создавать тип записи с одним членом?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
... может быть, поэтому документация является частью договора ?