2016-11-25 42 views
1

我有兩個類。我們稱它們爲PostClassCommentClass。這兩個類都實現了Reportable接口:如何正確設計界面

public interface Reportable { 

    void report(); 

    boolean isReported(); 

    . . . 

現在我需要兩個額外的方法添加到類中的每一個。這些方法在邏輯上適合相同的界面,但需要具有不同的名稱。例如:

PostClass將有方法 - >remove()restore()

CommentClass將有方法 - >hide()show()

問題:什麼是設計這種變化的首選方法是什麼?選項如我所見:

  1. 創建一個額外的接口,它將擴展Reportable接口。 問題:接口過多
  2. 將所有四種新方法添加到Reportable接口中,然後在兩個類中保留不相關的兩個方法。 問題:凌亂/醜
+0

我會爲方法找到很好的命名,以便它可以用於發佈和評論。所以我只能在我的界面中使用這兩種方法。 –

+0

@Luminous_Dev這些方法描述了實際存在的應用程序邏輯,我需要這些方法反映這些方法,因此它對我和其他人都有意義。 –

+0

如果這兩個(四個?)方法與其中一個或另一個實現類無關,那麼它們如何「邏輯地融入相同的接口」?似乎是一個矛盾。 'Reportable'中的每個方法或者邏輯地應用於所有'Reportable'對象,或者該方法不屬於'Reportable'。 –

回答

1

只要它們的用途和目的很明確,不用擔心有更多的接口。這兩個選項是有效的:

  1. PostClass實現RemovableReportable,其延伸Reportable;並且 CommentClass實施HideableReportable,其延伸Reportable

  2. PostClass實現ReportableRemovable;並且 CommentClass實現ReportableHideable

但添加四個新的方法爲Reportable接口,並留在每個類未實現兩種方法非常錯誤的,因爲它不會導致代碼是乾淨的,易於理解和使用。開發人員必須瞭解每種情況下使用哪種方法,從而使您的代碼更難以使用和修改。如果一些開發人員調用錯誤的方法會發生什麼?如果錯誤的方法什麼都不做,bug可能會被忽視。如果它拋出異常,這隻會在運行時捕獲錯誤。如果它調用另一種方法,那麼你有兩種做同樣事情的方法,這也是不好的和令人困惑的。

接口中未使用的方法是代碼異味,可能表明存在設計缺陷。

+0

謝謝。我喜歡實現多個接口的想法。這可能對我有用,我會放棄這一點。 –

2

如果他們做同樣的事情,然後補上包含函數名;雖然這聽起來不像你想要的現有名稱。

選項3:創建兩個新接口,RemovableHideable,並讓每個類實現適當的接口。

第二個想法,我可能會推薦使用hide()show(),因爲這似乎捕獲了最好的情況。

+0

感謝您的回答。我認爲,但是我想保持方法名稱不同以更好地反映實際的業務邏輯。實施情況也會有所不同。 –

0

儘管問題可能會被分類爲基於意見,但我的方法仍然是向接口添加兩種方法(show(),hide())並讓這些類實現它。

下面是一些其他選項:

如果您正在使用JDK8你可以嘗試將上述兩種方法default-methods的接口,使得它不會立即打破現有的實現。

此外,顯然它可以從接口中的默認方法調用抽象方法,所以從技術上講可能有兩個一般命名的抽象方法和兩個(或四個以上)專門命名爲默認方法但會會過度,只會增加混亂。

你可以考慮總共有六種新方法。 showhide是抽象的,並且還showPost/hidePostshowCommenthideComment是缺省類這反過來分別調用抽象showhide。這樣即使某些實現類錯誤地調用了錯誤的別名,它仍會調用正確的實現(理論上)。

0

無論我將在這個答案中描述純粹是我的意見和主觀。

以下必須設計這個時要牢記:

  1. 任何方法加入到申報(或任何一般超)應適用於所有亞型不管。
  2. 一種方法應該描述類的行爲,類能夠「做」的東西。

2點解釋

想方法postClass.remove(),它可以作爲閱讀的 'A PostClass知道如何刪除......'。但刪除什麼?本身?來自哪裏?

對我來說,'去除'和'恢復/添加'似乎是可以在PostClassCommentClassCollection上完成的東西,而不是這些類自己做的事情。如果我猜對了,這確實是如何在你的應用程序中使用PostClassCommentClass(即某種Collection)。現在,PostClassCommentClass可以獲得回撥onRemove(),,onHide()onShow(),以便在執行刪除/恢復/隱藏/顯示時執行每項操作所需的操作。

優勢的回調是,如果一個班級不打算在行動中做一些特別的事情,他們可以選擇致電super

設計1 - 你的應用程序的可報告已被隱藏,顯示的行爲,恢復和刪除

所以,對於所有的「報告」,你可以將這些回調添加到Reportable接口本身。

public interface Reportable { 
    void report(); 
    boolean isReported();   
    void onRestore(); 
    void onRemove(); 
    void onHide(); 
    void onShow(); 
} 

用法可能是這樣的

public class User { 
    private List<Reportable> reports; 
    //... more User related code 

    public void deleteReport(Reportable report) { 
     //give report a chance to cleanup 
     report.onDelete(); 
     //delete from user's list of reports 
     this.reports.remove(report); 
     //more code 
    } 

設計2 - 有獨立的接口

public interface Viewable { 
    void onHide(); 
    void onShow(); 
} 

public interface Disposable { 
    void onRemove(); 
    void onRestore(); 
} 

public class PostClass implements Reportable, Disposable { 

} 

public class CommentClass implements Reportable, Viewable { 

} 

使用情況,這是非常自我解釋,我猜。

我喜歡設計2,因爲它似乎更乾淨,堅持「SOLID」的設計原則。

希望這會有所幫助。