有人说,如果您将SOLID原理付诸实践,那么您最终会从事函数式编程。我同意本文的观点,但是我认为从接口/对象到函数/闭包的转换会丢失一些语义,并且我想知道函数式编程如何减轻这种损失。
从文章:
此外,如果您严格地应用接口隔离原理(ISP),您将了解您应该比角色头接口更喜欢角色接口。
如果您继续将设计推向越来越小的界面,那么最终您将获得最终的角色界面:使用单一方法的界面。这在我身上经常发生。这是一个例子:
public interface IMessageQuery
{
string Read(int id);
}
如果我依赖IMessageQuery
,则隐式合同的一部分是调用Read(id)
将搜索并返回具有给定ID的消息。
将此与对其等效功能签名的依赖进行比较 int -> string
。没有任何其他提示,此功能可能很简单ToString()
。如果您使用A实施IMessageQuery.Read(int id)
,ToString()
我可能会指责您故意颠覆性!
那么,函数式程序员可以做什么来保留命名接口的语义?例如,创建具有单个成员的记录类型是常规做法吗?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
...也许这就是为什么文件是合同的一部分?