【发布时间】:2009-02-06 11:58:28
【问题描述】:
有一个关于在 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
【问题讨论】:
标签: c# functional-programming method-chaining