0

所以我有以下接口:在接口方法的布尔参数的接口中有常量是一种好习惯或代码异味?

public interface RoleService { 
    boolean INCLUDE_DEACTIVE_OBJECTS = true; 
    boolean EXCLUDE_DEACTIVE_OBJECTS = false; 
    Set<? extends BaseBusinessObject> getOwnedBusinessObjectsOf(final Employee employee, final boolean includeDeactiveObjects); 
} 
在上层

和某处,示例用法如下..

if (someCondition) { 
    ownedBusinessObjects = roleService.getOwnedBusinessObjectsOf(employee, RoleService.INCLUDE_DEACTIVE_OBJECTS); 
} else { 
    ownedBusinessObjects = roleService.getOwnedBusinessObjectsOf(employee, RoleService.EXCLUDE_DEACTIVE_OBJECTS); 
} 

因此,而不是传递值如true(或false) ,我相信当我说INCLUDE_DEACTIVE_OBJECTS时,阅读方法调用要容易得多。

但我不确定,这是否简直愚蠢?这是一种反模式还是代码味道或某种违反最佳做法的行为?

我认为这有点类似于避免Magic Numbers,但它是有用的,还是它相当混乱?

+0

“语言不可知”标签的荣誉。目前在设计问题上很少见到这种情况。 – niksofteng

回答

3

由于这使API更具可读性,所以很好。不管底层的价值是什么,重要的是你通过一个触发特定行为的标志。如果您选择的语言只允许位置参数传递,那么这样的常量使得调用更具可读性。比较:

roleService.getOwnedBusinessObjectsOf(employee, RoleService.INCLUDE_DEACTIVE_OBJECTS); 
roleService.getOwnedBusinessObjectsOf(employee, true); 

“获取员工的所有权业务对象......什么?没有人知道“true”是什么意思,命名值更好。


另一种方法是,当你选择的语言支持命名参数通话时间(这里的Python):

roleService.getOwnedBusinessObjectsOf(employee, include_deactivated=True); 

的API应该推行命名的参数在这里(再次:蟒蛇):

def getOwnedBusinessObjectsOf(employee, *, include_deactivated): ... 

在Objective-C,你会做明确的方法命名类似的东西:

[roleService getOwnedBusinessObjectsOf:employee includingDeactivated:YES] 
1

在界面中放置常量字段绝对是不好的,IMO。我来自C#背景,它甚至不允许Interface中的const字段。即使在Java中,您也有Constant Interface(反模式),其唯一目的是包含多个类可以共享的常量。你不是那么做。仍然只是参考。

因此,而不是传递值,如真(或假的),我认为这是 更容易阅读的方法调用,当我说 INCLUDE_DEACTIVE_OBJECTS

选项1

要在保持可读性的前提下替换常量,您可以定义2个方法来指示是否禁用(我会选择'Inactive',而不是停用动词但不包含deactive形容词)对象。

getOwnedBusinessObjectsIncludingInactive(...) 
getOwnedBusinessObjectsExcludingInactive(...) 

这些将是RoleService类刚刚包装方法其private LY调用一个方法来检索实际数据,通过分别使truefalse

选项2

有一个单独的类定义在一个地方应用水平的常数。

getOwnedBusinessObjectsOf(employee, Constants.INCLUDE_INACTIVE_OBJECTS) 
getOwnedBusinessObjectsOf(employee, Constants.EXCLUDE_INACTIVE_OBJECTS) 
-1

如果只是为了可读性,在你的抽象类,你可以有静态变量持有这些布尔值,你可以用ClassName.AttributeName

public YourClass 
{ 
    public bool static INCLUDE_DEACTIVE_OBJECTS = true; 
    public bool static EXCLUDE_DEACTIVE_OBJECTS = false; 

    public static void Main (String args[]) 
    { 

    } 
} 
0

任何这需要一个布尔值方法分配参数违反了单一职责原则,因为它为真实做了一件事,而对于错误做了第二件事。

这总是一种代码味道。干净的代码告诉我们一分为二的方法:

  1. getOwnedBusinessObjectsIncludingDeactiveObjectsOf(Employee employee);

  2. getOwnedBusinessObjectsExcludingDeactiveObjectsOf(Employee employee);

当然,如果该方法被广泛使用,您可能希望更简洁的名称,例如getAllObjectsgetActiveObjects

相关问题