SOLID для функционального программирования - PullRequest
30 голосов
/ 07 апреля 2011

Исходя из языка ООП, я знаком с принципами SOLID объектно-ориентированного проектирования.Кажется, что некоторые из них вписались бы в функциональную модель программирования, в то время как другие части не имеют смысла в мире, в котором отсутствует состояние.Существует ли подобный набор принципов для рефакторинга функционального кода?

Ответы [ 2 ]

39 голосов
/ 07 апреля 2011

Насколько я знаю (я не эксперт), принципы SOLID ничего не говорят о состоянии. Они должны быть применимы также и к функциональным языкам программирования. Они больше советов о том, как достичь модульности.

Некоторые из них довольно очевидны или, по крайней мере, хорошо известны. Единственная ответственность - это принцип UNIX «делай одно и делай это хорошо», который еще более популярен в функциональных языках, где «составление» широко используется аналогичным образом. Принцип сегрегации интерфейса также очень естественен (пусть ваши интерфейсы являются модульными и разделяют ортогональные концепции). Наконец, Dependency Inversion - это просто название «абстракции» и вездесущий в функциональном программировании.

Принципы "OL", Open / Closed и LSP, больше ориентированы на языки, основанные на наследовании в качестве основной концепции разработки программного обеспечения. Значения / модули функциональных языков по умолчанию не имеют открытой рекурсии, поэтому «наследование реализации» используется только в очень специфических случаях. Композиция является предпочтительной. Я не уверен, как вы должны интерпретировать принцип Open / Closed в этой ситуации. Вы можете подумать, что речь идет об инкапсуляции, которую также часто используют функциональные программы, используя абстрактные типы и тому подобное.

Наконец, может показаться, что принцип замещения Лискова связан с наследованием. Функциональные языки не всегда используют подтипы, но когда они это делают, действительно предполагается, что «производные типы» должны сохранять спецификацию «базовых типов». Функциональные программисты, конечно, стараются задавать и уважать интерфейс и свойства своих программ, модулей и т. Д. И могут использовать алгебраические рассуждения (это эквивалентно этому, поэтому я могу заменить ...) на основе этих спецификаций при программировании, рефакторинге, и т. д. Однако, как только вы избавитесь от идеи «наследования по умолчанию», у вас станет намного меньше проблем с нарушениями интерфейса, поэтому LSP не выделяется как жизненно важная гарантия, как в ООП.

7 голосов
/ 14 июля 2014

В этом видео представлены принципы SOLID и способы их применения в Clojure.

В нем показано, как эти принципы действуют в функциональном мире в той же степени, что и в ООП, поскольку нам по-прежнему нужнырешить те же основные проблемы.И в целом, это заставило меня думать, что функциональное программирование лучше подходит для дизайна SOLID.

...