Объектная модель в функциональном стиле? - PullRequest
6 голосов
/ 28 апреля 2011

Реально ли вообще реализовать объектную модель в функциональном стиле?

Одной из проблем, с которой ООП, похоже, справляется, является описание объектных моделей.

Например, HTML DOM являетсясложный зверь с состоянием, который взаимодействует напрямую с пользовательским интерфейсом и , требует возможности программирования из динамических языков.Функции ООП, как правило, оказываются полезными во многих отношениях:

  • Ограничения доступа к элементам делают взаимодействие с ненадежным кодом (например, JavaScript) безопасным
  • Функции доступа и свойства делают привязку к пользовательскому интерфейсугораздо более удобным

сторона UI истории может быть немного спорный вопрос, если выпроецируя модель через MVVM, но вы все еще постоянно боретесь с состоянием внутри.

Я работаю в F # для этого проекта, чтобы я мог легко прибегнуть к ООП, но мне любопытно, насколько далеко яможет подтолкнуть его, прежде чем он станет непрактичным.Возможно, есть шаблоны дизайна или что-то еще?

1 Ответ

5 голосов
/ 28 апреля 2011

Это немного философски, чтобы иметь «правильный» ответ, но хорошо, я укушу.

По моему мнению, проблема возникает потому, что вы считаете FP и OO несовместимыми, но это не так.FP и императивное программирование совмещены, то есть используют выражения вместо выражений.

Часть проблемы заключается в том, что ОО не имеет четкого определения, по моему мнению, в любом случае.Чтобы поддержать это, я бы указал на Алана Кея, который сказал: «На самом деле я придумал термин« объектно-ориентированный », и я могу сказать, что я не имел в виду C ++». Тем не менее, большинство языков мы рассматриваем как OO, то есть java / C #берут больше после C ++, чем smalltalk.

Что дает нам стиль OO C ++ / java / C #, это хороший способ организовать наш код в модели, создать данные, добавить в них свойства и т. д. Это практически невозможно-функционален и может хорошо использоваться с функциональным программированием.

Как вы указали, многие C ++ / java / C # имеют тенденцию быть состоящими, но это не обязательно, и java, и C # имеют фундаментальные типытакие как их строковые классы, которые являются неизменными.Это правда, Java и C # не облегчают создание неизменяемого класса, но, приложив немного усилий, вы можете сделать это.

Что приводит нас туда, где неизменные присваиваются?В моих проектах обычно все делается неизменным, поскольку это облегчает исправление ошибок, и если я вижу, что это вызывает проблемы с производительностью, я начинаю добавлять некоторую изменчивость на критические пути.Единственное место, где неизменность никогда не сработает, это элементы управления графическим интерфейсом, которые обычно содержат слишком много состояний, чтобы быть неизменными.Сказав, что вы можете получить довольно долгий путь построения GUI с использованием неизменяемого подхода «комбинатор», тогда интерпретируется изменяемыми элементами управления графическим интерфейсом.Это более или менее то, что делает парень из WebSharper: http://www.intellifactory.com/products/wsp/Home.aspx

Еще один замечательный ресурс для дебатов по FP / OO - это Brain «Как функциональное программирование влияет на структуру вашего кода?» (Что сильно повлияло на мое мышлениео FP / OO): http://lorgonblog.wordpress.com/2008/09/22/how-does-functional-programming-affect-the-structure-of-your-code/

...