方法签名最佳实践 - 重载与长名称

时间:2014-11-20 09:01:21

标签: java language-agnostic naming-conventions overloading

只是想知道您对这两种不同的方法有何看法:重载方法与长/详细方法名称。

更新:我正在寻找一般模式/最佳做法。以下只是一个例子。

给定具有父/子关系的组织结构

> 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特定的,但对此有更广泛的看法。

5 个答案:

答案 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);

在这种情况下,第二部分更好。因为它更易读,易于理解。因为当您登录INFOWARNING级别时,您不需要指定Exception。所以专业化这个方法是件好事。但是,保持方法public void log(Level l, String s, Exception e);公开而非私有非常重要,因为在某些情况下使用此通用方法可能很有用。

<强>结论

这实际上取决于具体情况,但是如果你有可能添加特定的方法,并使用详细的名称来专门处理目标行为,那就去做吧。

答案 1 :(得分:2)

这一切归结为味道。

作为一般惯例,你可以选择“最少的参数越好”。它在代码清晰度方面既方便又实际上节省了堆栈内存(不多,但从长远来看,每一点都很重要)。

具有不同的名称有助于分配自动完成。

例如我会选择

GetAllSubOrgUnitsList()
GetFirstSubOrgUnitsList()

原因是,在获得之后,我写的第一个字母将标明我想要的东西。

正如您所提到的,如果您没有直观的名称,则可以添加默认参数。

在您的示例中,

GetDirectSubUnitsExcludingSome()

我会用一组最小的参数替换它

GetFilteredSuborgUnits(ISuborgFilter aFilter);

然后,从架构中,请开发人员实施他们的自定义过滤器。 过滤器可以要求分层深度,某些所有权等(您决定是建筑师)。

所以,作为一个简短的总结:亲吻!

即使GetAllSuborgUnits()将提供相同的GetFilteredSubOrgUnits(null),给出一个快速而明确的行为替代方案比使用复杂的名称/参数集更好。毕竟,裁员并不总是坏事:)。

答案 2 :(得分:2)

我不同意长名是更好的方法。

它确实是“依赖的”,但让我们澄清一下:

  • 恕我直言,两个执行相同功能但采用不同选项的方法应该具有相同的名称(重载)。
  • 两种处理不同事物的方法(确定的方法除外) 按参数)应使用不同的名称。换句话说,那里 应该是通用 function 的名称(尽管有变体), 并为不同的功能分别命名。

值得注意的是,重载是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 getChildElementsgetFirstChildElement用于遍历XML文件结构的模式。

您可以随时使用:

thing.getFirtsChild().getChildren();

访问更深层次。