只是想知道您对这两种不同的方法有何看法:重载方法与长/详细方法名称。
更新:我正在寻找一般模式/最佳做法。以下只是一个例子。
给定具有父/子关系的组织结构
> OrgUnit
> - OrgUnit
> -- OrgUnit
> -- OrgUnit
两种方法,它们在很大的部分中使用相同的代码来获取xml元素的子代。
// 1) only 1 level down children
getSubOrgUnits()
// 2) all levels down
getSubOrgUnits(boolean includeChildren)
// 3) alternative naming of 1)
getDirectSubOrgUnits()
// 4) alternative naming of 2)
getAllSubOrgUnits()
所以1和2正在使用参数 3和4使用无参数命名。
你会选择什么?为什么?还要考虑1)和2)可以获得额外的参数,这些参数会导致像getChilds(true,false,null)这样的东西,但3)和4)可能会得到像getDirectSubUnitsExcludeSome()这样的名称
可以是JAVA特定的,但对此有更广泛的看法。
答案 0 :(得分:8)
在我看来,使用详细的方法名称是一个更好的解决方案。
但要小心,在某些情况下,最好添加一些参数
示例1
private List<Element> getElementsByType(MyTypeEnum type);
public List<Element> getElementsOfType1();
public List<Element> getElementsOfType2();
public List<Element> getElementsOfType3();
/* VS */
public List<Element> getElementsByType(MyTypeEnum type);
两种实现都很好,取决于你,MyTypeEnum
的大小,它的大小增加的能力。你想揭露什么?您是否希望getElements***
的来电者能够获得所有类型的Element
?
示例2
public void log(Level l, String s, Exception e);
/* VS */
public void logInfo(String s);
public void logWarning(String s);
public void logError(String s, Exception e);
在这种情况下,第二部分更好。因为它更易读,易于理解。因为当您登录INFO
和WARNING
级别时,您不需要指定Exception
。所以专业化这个方法是件好事。但是,保持方法public void log(Level l, String s, Exception e);
公开而非私有非常重要,因为在某些情况下使用此通用方法可能很有用。
<强>结论强>
这实际上取决于具体情况,但是如果你有可能添加特定的方法,并使用详细的名称来专门处理目标行为,那就去做吧。
答案 1 :(得分:2)
这一切归结为味道。
作为一般惯例,你可以选择“最少的参数越好”。它在代码清晰度方面既方便又实际上节省了堆栈内存(不多,但从长远来看,每一点都很重要)。
具有不同的名称有助于分配自动完成。
例如我会选择
GetAllSubOrgUnitsList()
GetFirstSubOrgUnitsList()
原因是,在获得之后,我写的第一个字母将标明我想要的东西。
正如您所提到的,如果您没有直观的名称,则可以添加默认参数。
在您的示例中,
GetDirectSubUnitsExcludingSome()
我会用一组最小的参数替换它
GetFilteredSuborgUnits(ISuborgFilter aFilter);
然后,从架构中,请开发人员实施他们的自定义过滤器。 过滤器可以要求分层深度,某些所有权等(您决定是建筑师)。
所以,作为一个简短的总结:亲吻!
即使GetAllSuborgUnits()将提供相同的GetFilteredSubOrgUnits(null),给出一个快速而明确的行为替代方案比使用复杂的名称/参数集更好。毕竟,裁员并不总是坏事:)。
答案 2 :(得分:2)
我不同意长名是更好的方法。
它确实是“依赖的”,但让我们澄清一下:
值得注意的是,重载是JRE中几乎统一的做法。
在实际使用中,较长的名称没有什么优势。授予:
getSubOrgUnits()
比:
更明显 getSubOrgUnits(true)
如果我将其包含在正式的API中,则可以给他们单独的名称,或者将第二个名称用作常量:
getSubOrgUnits(INCLUDE_SUB_UNITS)
尽管大多数IDE允许您通过将鼠标悬停在方法上来立即查看true
参数的解释(通常会弹出Javadoc)。
对我来说,重载的优点是它使变体形成 formal 关联。这也是Javadocs中更好的演示。
答案 3 :(得分:0)
首先,我会调用该方法getChildren()
,而不是getChilds()
。 :)
如果你有几个级别,为什么不引入深度级别的参数?
// Get children up to depthLevel
getChildren(final int depthLevel)
// For convenience
getChildren()
如果是无参数方法,请添加有意义的信息,以便其他开发人员知道您是返回全部还是仅返回第一级。
编辑: OP问:“所以一般来说你使用什么方法,为什么,哪些用例?你可以分享一下你的想法。”
这是非常基于意见的。正如@OldCurmudgeon所说,许多处理树状结构的库使用专用方法来访问下层。这很好,只要你经常这样做。另一方面,如果要访问特定级别的结构,引入depthLevel
参数可以为您提供更多功能。这在很大程度上取决于您的常用用例。
因此,如果您很可能需要经常获取对象的第一个孩子,请介绍getFirstChild()
和getChildren()
。如果您更有可能更频繁地访问更深层次的数据,或者需要访问专用级别,请引入深度参数。
答案 4 :(得分:0)
处理这种结构的常用方法是:
// Used when you KNOW there is only one child.
getFirstChild();
// Used when there may be many children.
getChildren();
这是XOM
getChildElements和getFirstChildElement用于遍历XML文件结构的模式。
您可以随时使用:
thing.getFirtsChild().getChildren();
访问更深层次。