TL; DR:这取决于您要解决的问题。
在我谈论C#中的Func和Action很棒时,我与Gramps进行了类似的交谈。My Gramps是一位非常古老的计时器程序员,因为软件在占用整个房间的计算机上运行,所以它一直围绕源代码编写。
他一生中多次更换技术。他用C,COBOL,Pascal,BASIC,Fortran,Smalltalk,Java编写代码,并最终以业余爱好开始C#。我学习了如何与他一起编程,那时我还是个小伙子,就坐在他的膝盖上,在IBM SideKick的蓝色编辑器上剔除了我的第一行代码。到20岁时,我已经花了更多的时间在编码上,而不是在外面玩。
这些只是我的记忆,请原谅我,如果我在转述它们时不太实际。我有点喜欢那些时刻。
那是他对我说的:
“您应该问一个问题的概括,还是在特定范围内解决它?好吧,这是一个问题。”
Gramps停下来思考了一会儿,同时将眼镜的位置固定在脸上。他正在电脑上玩三消游戏,同时在旧的声音系统上听着Deep Purple的LP。
他告诉我:“好吧,这取决于您要解决的问题”。“令人信服的是,对于所有设计选择都存在一个单一的,神圣的解决方案,但是没有一个。软件架构就像是奶酪,你知道。”
“……奶酪,格兰普?”
“不管您如何看待自己喜欢的东西,总会有人认为它很臭”。
我困惑地眨了眨眼,但是在我没说什么之前,Gramps继续了。
“当您制造汽车时,如何挑选零件的材料?”
“我……我想这取决于所涉及的成本以及该零件应该做什么。”
“这取决于零件要解决的问题。您不会制造钢制轮胎或皮革制挡风玻璃。您会选择最能解决当前问题的材料。现在,什么是通用解决方案还是特定解决方案?要解决什么问题,要解决什么用例,您应该采用全功能的方法,为仅使用一次的代码提供最大的灵活性吗?您的系统中会有很多用途,甚至可能会有很多变化的部分吗?诸如此类的设计选择就像您为汽车零件选择的材料或您用来建造小房子的Lego砖的形状一样哪种乐高积木是最好的?”
这位年老的程序员在继续之前,摸索了桌子上的小乐高火车模型。
“只有在知道需要什么砖的情况下,您才能回答。如果您根本不知道是什么问题,那么您将如何知道特定解决方案是否比通用解决方案更好,反之亦然试图解决吗?您看不到过去无法理解的选择。”
“ ..您只是引用《黑客帝国》吗? ”
“什么?”
“没事,继续。”
“好吧,假设您正在尝试为国家发票系统构建某种东西。您会从内部知道该地狱的API及其三万行XML文件的样子。用于创建该文件的“通用”解决方案看起来将如何?该文件充满了可选参数,充满了只有非常特殊的业务部门才应该使用的情况。在大多数情况下,您可以放心地忽略它们。如果您只需要创建通用的发票系统,永远不会卖出鞋子。只要建立一个销售鞋子的系统,使其成为目前最好的销售鞋子的发票系统即可。现在,如果您必须为任何类型的客户创建一个发票系统,那么在更广泛的应用上-可以转售为独立的通用销售系统,例如-现在有趣的是实现那些仅用于天然气,食物或酒精的选项。现在,这些是可能的用例。在它们只是一些假设之前,请勿使用案例,并且您不想实现请勿使用案例。不要使用是不需要的弟弟。”
Gramps将乐高火车放回原处,回到了他的3场比赛。
“因此,要为给定问题选择通用或特定的解决方案,您首先需要了解问题的根源。否则,您只是在猜测,而猜测是经理而不是程序员的工作。一切都取决于IT。”
所以你有它。“这取决于”。考虑软件设计时,这可能是最强大的两个单词的表达方式。