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

Java 方法签名最佳实践-重载与长名称,java,language-agnostic,naming-conventions,overloading,Java,Language Agnostic,Naming Conventions,Overloading,只是想知道你对这两种不同的方法有什么想法:重载方法和长/冗长的方法名 更新:我正在寻找一般模式/最佳实践。以下只是一个示例。 给定具有父/子关系的组织结构 > OrgUnit > - OrgUnit > -- OrgUnit > -- OrgUnit 两种方法在很大程度上使用相同的代码来获取xml元素的子元素 // 1) only 1 level down children getSubOrgUnits() // 2) all levels down getSubOr

只是想知道你对这两种不同的方法有什么想法:重载方法和长/冗长的方法名

更新:我正在寻找一般模式/最佳实践。以下只是一个示例。

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

> 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)可以得到附加参数,这些参数导致GETCHEDS(true,false,null),但也有3),而4)可以得到GETRUNTIONSUBITIONEXECITESOMES()/<
可以是特定于JAVA的,但请从更广泛的角度来看待这一点

首先,我将调用该方法
getChildren()
,而不是
getChilds()
:)

如果你有几个层次,为什么不引入一个深度层次的论点呢

// Get children up to depthLevel
getChildren(final int depthLevel)

// For convenience
getChildren()
对于无参数方法,添加有意义的信息,以便其他开发人员知道您是返回全部还是仅返回第一级


编辑:OP问:“那么一般来说,您使用什么方法,为什么,哪些用例?您能稍微分享一下您的想法吗?”

这是非常基于意见的。正如@OldCurmudgeon所说,许多处理树状结构的库使用专用方法访问下一层。这很好,只要你经常这样做。另一方面,如果您想访问结构的特定级别,引入
depthLevel
参数将为您提供更大的权限。这在很大程度上取决于您通常的用例


因此,如果您很可能需要经常获取对象的第一个子对象,请引入
getFirstChild()
getChildren()
。如果您更有可能更频繁地访问更深层次的数据,或者您需要访问专用级别,请引入一个深度参数。

处理此类结构的常用方法是:

// Used when you KNOW there is only one child.
getFirstChild();
// Used when there may be many children.
getChildren();
这是XOM使用的模式,用于遍历XML文件的结构

您始终可以使用:

thing.getFirtsChild().getChildren();

进入更深层次。

这一切归结为味道

一般来说,您可以选择“参数越少越好”。它在代码清晰性方面很方便,而且实际上节省了堆栈内存(不多,但从长远来看,每一位都很重要)

使用不同的名称也有助于自动完成分配

例如,我会选择

GetAllSubOrgUnitsList()
GetFirstSubOrgUnitsList()
原因是,在get之后,我写的第一封信将确定我想要什么

正如您所提到的,如果您不能有一个直观的名称,您可以添加默认参数

以你为例,

GetDirectSubUnitsExcludingSome()
我将用一组最小的参数来替换它

GetFilteredSuborgUnits(ISuborgFilter aFilter);
然后,从体系结构出发,要求开发人员实现他们的自定义过滤器。 过滤器可以要求层次深度、特定所有权等(由您决定,您是架构师)

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


即使GetAllSuborgUnits()将提供与GetFilteredSubOrgUnits(null)相同的功能,提供一个快速清晰的行为替代方案也比使用复杂的名称/参数集要好。毕竟,裁员并不总是坏事:)

在我看来,使用详细的方法名是更好的解决方案

  • 这样更容易理解,您的代码需要更少的注释
  • 它更易于维护,您可以在不影响现有签名的情况下更改实现。您仍然可以添加新签名,而无需回归
但要小心,在某些情况下,最好添加一些参数

GetFilteredSuborgUnits(ISuborgFilter aFilter);
示例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);
在这种情况下,第二部分更好。因为它可读性更强,一看就容易理解。因为当您登录
INFO
WARNING
级别时,不需要指定
异常。因此,专门化该方法是一件好事。但是,重要的是保持方法
公共无效日志(级别l,字符串s,异常e)公共而非私有,因为在某些情况下使用此通用方法可能很有用

结论


这确实取决于具体情况,但是如果您有可能添加特定的方法,使用详细的名称,专门化目标行为,那么就这样做。

我不认为名称越长越好

它确实“取决于”,但让我们澄清一下:

  • 两个方法做相同的事情,但采用不同的选项,IMHO,应该具有相同的名称(可以重载)
  • 做不同事情的两种方法(不同于确定的方法 (按参数)应具有不同的名称。换言之,就是这样 应该是通用函数的一个名称(尽管有变体), 以及不同功能的单独名称
值得注意的是,重载几乎是JRE中使用的统一做法

在实际使用中,我发现较长的名称没有什么优势。授予:

 getSubOrgUnits()
这比:

 getSubOrgUnits(true)
如果我将其包含在正式API中,我会给它们单独的名称,或者将第二个名称作为常量:

 getSubOrgUnits(INCLUDE_SUB_UNITS)
尽管大多数IDE允许您通过将鼠标悬停在方法上(通常在弹出窗口中显示Javadoc),立即看到
true
参数是如何解释的


对我来说,重载的优点是它使变量之间有一个正式的关联。在Javadocs中,这也是一个更好的演示。

我正在寻找一个更通用的模式/最佳实践。我有一种感觉,“旧的”java lib大量使用do(boolean activateX、boolean activateY、int-someParam)的方法重载,这可能会导致像do(boolean、boolean、int)这样的签名,您必须读取源代码(并且必须拥有它)