Возникает вопрос об использовании методов функционального программирования в коде C #. Пример
Пусть у нас есть интерфейс
interface IGraph { /*contains vertices and edges*/}
Предположим, нам нужно расположить вершины графа (назначить Point каждой вершине).
interface ILayoutInfo {
Point GetVertexPoint(vertex);
}
Простой маршрут маршрута может иметь такую подпись:
ILayoutInfo SimpleLayout(IGraph graph);
Что можно использовать таким образом
void Demo() {
IGraph graph = CreateGraphInAnyWay();
ILayoutInfo layout = SimpleLayout(graph);
PrintCoordinates(graph,layout);
}
В дизайне ниже PrintCoordinates нужны как ссылки на график, так и макет.
Рассмотрим дизайн функционального стиля, в котором маршрутизация макетов дополняет графическую информацию
с информацией о координатах вершин графа.
ILayoutedGraph SimpleLayoutNew(IGraph graph);
Где ILayoutedGraph реализует ОБА IGraph и ILayoutInfo
void DemoNew() {
IGraph graph = CreateGraphInAnyWay();
ILayoutedGraph layoutedGraph = SimpleLayoutNew(graph);
PrintCoordinatesNew(layoutedGraph);
}
1) В этом проекте PrintCoordinatesNew получает только ОДИН параметр.
2) Странный интерфейс ILayoutedGraph родился, который не содержит никаких методов и просто
оборачивает другие интерфейсы. Если в какой-то библиотеке есть другие типы, такие как INetwork, то у нас получится
создание интерфейсов переноса ILayoutedNetwork, ILayoutedTree (что плохо).
Таким образом, такая техника используется только в функциональных языках только потому, что они не могут работать по-другому (нет состояния, поэтому функция должна объединять ввод с вычисленной информацией, которая будет использоваться внешними процедурами), или она также жизнеспособна в императивном мире.
Большое спасибо,
PS: более подробный печатный пример можно найти здесь
http://tivadj.blogspot.com/2009/02/designing-c-api-in-functional-style.html