“函数的理想参数个数为零”是完全错误的。理想的参数数目恰好是使函数不受副作用影响所需的数目。少于这个数目,您不必要地导致您的功能不纯净,从而迫使您远离成功之路,攀登痛苦的梯度。有时“鲍勃叔叔”会在他的建议下出现。有时他错得很厉害。他的零论点建议就是后者的一个例子
(来源:@David Arno在此站点上的另一个问题下的评论)
该评论获得了133个投票的惊人成绩,这就是为什么我想更加关注它的优点。
据我所知,编程有两种不同的方式:纯函数式编程(此评论令人鼓舞)和告诉,不要问(不时建议在本网站上推荐)。AFAIK这两个原则从根本上是不兼容的,彼此之间几乎是相反的:纯函数可以概括为“仅返回值,没有副作用”,而告诉,不问可以概括为“不返回任何东西,只有副作用”。另外,我有点困惑,因为我认为告诉,不要问,它被视为OO范式的核心,而纯函数则被视为功能范式的核心-现在,我看到了OO中推荐的纯函数!
我想开发人员应该选择这些范例之一并坚持下去吗?好吧,我必须承认,我永远也无法跟随自己。通常,返回值对我来说似乎很方便,而且我真的看不到如何仅凭副作用实现我想达到的目标。通常,对我来说副作用很方便,而且我真的看不到如何仅通过返回值就能达到我想要达到的目的。而且,有时(我想这太可怕了),我有两种方法都能做到。
但是,从这133个投票中,我认为当前纯函数式编程正在“取胜”,因为它已成为一种共识,说出来更好,不要问。它是否正确?
因此,在这个反模式化游戏的示例中,我尝试制作:如果我想使其符合纯功能范式-怎么办?!
对我来说,拥有战斗状态似乎是合理的。由于这是基于回合的游戏,因此我将战斗状态保留在字典中(多人游戏-可能有许多玩家同时进行许多战斗)。每当玩家回合时,我都会在战斗状态上调用适当的方法,该方法会(a)相应地修改状态,然后(b)向玩家返回更新,这些更新会序列化为JSON,并且基本上只是告诉他们发生了什么板。我想,这是在公然违反两项原则的同时。
好的-如果我确实想,我可以制定一个方法返回战斗状态,而不是就地修改它。但!然后,我是否将不得不复制战斗状态中的所有内容,只是为了返回一个全新的状态,而不是就地进行修改?
现在,如果此举是一种攻击,那么我可以返回一个更新了HP的角色?问题是,这不是那么简单:游戏规则,一举一动不仅会消除一部分玩家的生命值,而且往往会产生更多的影响。例如,它可能会增加字符之间的距离,应用特殊效果等。
对我来说,只需修改适当的状态并返回更新就简单得多了。
但是,经验丰富的工程师将如何解决这个问题?