有一个关于在 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、ITree,我们最终会创建包装接口 ILayoutedNetwork、ILayoutedTree(这很糟糕)。
所以这种技术只用于函数式语言,只是因为它们不能以其他方式工作(没有状态,所以函数必须将输入与计算信息结合起来供外部例程使用),或者它在命令式世界中也是可行的?
非常感谢,
PS:可以在这里找到更详细的漂亮打印示例 http://tivadj.blogspot.com/2009/02/designing-c-api-in-functional-style.html