有一个关于在C#代码中使用函数式编程技巧的问题。例如功能样式C#API设计(返回函数参数增加了计算结果)
让我们有接口
interface IGraph { /*contains vertices and edges*/}
假设我们需要布置图的顶点(点分配到每个顶点)。
interface ILayoutInfo {
Point GetVertexPoint(vertex);
}
简单的布局路线能有这样的签名:
ILayoutInfo SimpleLayout(IGraph graph);
可以在这样的方式
void Demo() {
IGraph graph = CreateGraphInAnyWay();
ILayoutInfo layout = SimpleLayout(graph);
PrintCoordinates(graph,layout);
}
被用来在下面的设计需要PrintCoordinates既引用到图形和布局。
考虑功能风格设计,其中布局布线增加图形信息 与关于图顶点coordenates的信息。
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
谢谢。你真的给我一口新鲜空气。 – tivadj 2009-02-07 10:32:09