【问题标题】:Object is modified implicitly in one method and used by another对象在一种方法中被隐式修改并由另一种方法使用
【发布时间】:2022-01-16 16:50:35
【问题描述】:

我有两种方法meth1meth2meth1 接受集合set1 的输入,返回一个值,同时修改set1

现在meth2 使用这个set1 来计算另一个返回值。

我在这段代码中看到的问题是集合修改是隐式的,如果编码人员不够小心,可能会错过。

我可以在一个方法中完成所有操作,但是两种方法的工作方式不同,足以将它们放在不同的方法中。单个方法也会很长。

既然我必须在这里使用两种方法,那么避免隐式修改的最佳方法是什么?处理这种情况的最佳做法是什么?

任何指针都非常感谢。


方法签名:

meth1:

private List<CustomObject> meth1(List<CustomObjectOnWhichOperationIsPerformed> lst,
Set<AnotherCustomObject> set1, Map<String, AnotherCustomObject> mp) {
// Iterate on lst, call mp and remove AnotherCustomObject entities from set1
}

meth2:

private List<CustomObject> meth2(Set<AnotherCustomObject> set1) {
// Iterate on set1 to create the list
}

【问题讨论】:

  • 集合的变化是否必须在方法 1 之外可见?如果没有,请创建已通过的系列的防御性副本并仅对其进行处理。如果需要在该方法之外进行更改,即结果,那么您基本上有两个选择:1)创建副本并正常返回(您可能需要将当前返回值和集合包装在新的返回类型中)或者 2) 尝试在方法名和参数名中表达参数改变的事实,并添加一些 JavaDoc 来补充细节。
  • 是的,需要在方法之外进行更改。所以我也只能想到这些选项。目前正在使用添加 JavaDocs 的第二个选项。
  • 你能分享一下这两种方法的一些细节吗,例如他们的签名?这可能有助于提出更具体的建议。
  • @Thomas 当然。将添加签名。
  • 您现在可以再添加 2 个内容吗? 1 - 描述meth1 的返回值:它与输入有什么关系,它代表什么以及 2 - 如果可能,添加真实的方法和参数名称,更改它们可能已经有助于传达正在发生的事情(除非你可以' t 分享在这种情况下,您将自己找出一个有意义的名称 - 想想您对某些名称的含义。)

标签: java oop design-patterns


【解决方案1】:

可以用不同的方式解决这个问题吗?这似乎违反了单一责任原则。第一个方法返回一个值,但也修改了传递给它的参数。

将第一种方法分成两种方法

  1. 修改集合(显式)
  2. 处理获取第一个返回值的逻辑

然后是最后一步

  1. 计算另一个返回值

【讨论】:

  • 这看起来不错。该操作基本上是一个循环,我正在从集合中删除元素。所以逻辑与集合修改紧密相关。所以无论如何我都会要求逻辑部分返回一些可用于重新创建集合的集合。有什么解决办法吗?
  • 为什么一定要这样?为什么这些方法是私有的?看看整体的设计,如果这是一个黑盒子的框图,你能不能把盒子排列成每个盒子一个输入一个输出?
  • 方法是私有的,因为它们没有在代码的其他任何地方使用。这不是执行此操作的标准方法吗?对于框图的事情,当然。听起来很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2013-02-10
  • 2014-03-28
  • 2020-08-02
  • 1970-01-01
相关资源
最近更新 更多