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)这样的签名,您必须读取源代码(并且必须拥有它)