Java 这样一个简单的方法如何分解和命名?

Java 这样一个简单的方法如何分解和命名?,java,methods,coupling,cohesion,Java,Methods,Coupling,Cohesion,最佳实践不断地要求一个方法只负责一件事。 我遇到了一种方法,可以做3件事,但我不知道如何做。根据最佳实践对其进行分解。2.随便说说。 我还想知道,在现实生活中,有多少方法真的像课本上一直建议的那样只做一件事 method ( entryId ) { if (this.checkDuplicate(entryId)) { this.deleteDuplicate(entryId); return true; } else { return fa

最佳实践不断地要求一个方法只负责一件事。 我遇到了一种方法,可以做3件事,但我不知道如何做。根据最佳实践对其进行分解。2.随便说说。 我还想知道,在现实生活中,有多少方法真的像课本上一直建议的那样只做一件事

method ( entryId ) {
   if (this.checkDuplicate(entryId)) {
       this.deleteDuplicate(entryId);
       return true;
   } else {
       return false;
   } 
}
正如我们所看到的,名为method的方法所做的不仅仅是一件事。甚至可以遵守“方法只对一件事负责”的规则吗

如果是,如何将上述算法分解为它


如果不是,我能给一个做这么多事情的方法起什么名字呢?

让我们这样说吧——这个规则(GRAP-高内聚模式)与编程语言的语义或语法无关。相反,这意味着您必须从更像功能或业务逻辑的角度来小心处理您的方法/类职责。
几乎所有的设计原则都必须以非常仔细和谨慎的方式应用,否则你会有几十个间接和抽象层,没有真正的目的

虽然Yauheni Maltsau写的是真的,但我想加上我的10美分


我想说,您的方法实际上只做了一件事:检查重复项并将其删除。所以除了名字,我会像这样保存它。你应该给它一个更具描述性的名字,比如
removiefduplicate
或者类似的名字。

你不一定要用一个完美的名字和完美的内聚来开始。 如果您有单元测试来验证代码的行为,那么您可以分几个阶段进行重构,最终可能会在重构过程中多次更改名称。这个想法是在不破坏任何东西的情况下逐步改进

我可能会首先将方法命名为“deleteEntryIfDuplicate”,然后我会问自己为什么该方法需要返回布尔值。因为我没有使用布尔值的调用代码,所以我只能推测,但是可能有一个责任没有在正确的地方处理。例如,可能不需要返回布尔值,而是应该在一个方法中处理重复条目的所有功能,该方法执行删除、记录并通知侦听器。这似乎是在增加责任,但管理重复条目的情况可以被视为一项责任。烘焙蛋糕是一项单独的责任,即使这意味着你需要把鸡蛋和牛奶从冰箱里拿出来,把面粉和糖从食品储藏室拿出来,预热烤箱,等等。目标是让每一个电话都处于正确的抽象层次


我应该补充一点,你不必事事“金盘”。工程学是关于权衡的。从长远来看,责任明确分离的干净代码可以节省时间和金钱,但您可能没有无限的时间来完善和完善每件事。

您可能会深入研究这一点,您基本上是说,如果永远不应该使用语句。您应该问问自己,
方法
函数名是否只做一件事?例如,您不需要一个不更新数据库和发送电子邮件的方法。从技术上讲,此方法甚至不应该存在,因为
deleteDuplicate(entryId)
应该检查是否有要删除的内容!如果以这种方式保留此方法,
checkDuplicate(entryId)
将被调用两次:由方法调用和删除复制