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

相關問題