Java 如何正确设计界面

Java 如何正确设计界面,java,design-patterns,interface,Java,Design Patterns,Interface,我有两节课。让我们称它们为PostClass和CommentClass。这两个类都实现了Reportable接口: public interface Reportable { void report(); boolean isReported(); . . . 现在我需要为每个类添加两个附加方法。这些方法在逻辑上适合同一接口,但需要有不同的名称。例如: PostClass将具有方法->remove(),restore() CommentClass将有方法->hid

我有两节课。让我们称它们为
PostClass
CommentClass
。这两个类都实现了
Reportable
接口:

public interface Reportable {

    void report();

    boolean isReported();

    . . .
现在我需要为每个类添加两个附加方法。这些方法在逻辑上适合同一接口,但需要有不同的名称。例如:

PostClass
将具有方法->
remove()
restore()

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

问题:设计此变更的首选方式是什么?在我看来,这些选项是:

  • 创建一个额外的接口,该接口将扩展
    可报告的
    接口。问题:接口太多
  • 将所有四个新方法添加到
    Reportable
    接口中,然后在每个类中只保留不相关的两个方法未实现。问题:不整洁/丑陋

  • 如果它们做相同的事情,那么就用包含函数的名称;尽管考虑到现有的名称,这听起来不像你想要的

    选项3:创建两个新接口,
    可移动
    可隐藏
    ,并让每个类实现适当的接口


    再想一想,我可能会建议使用
    hide()
    show()
    ,因为这似乎能最好地捕捉正在发生的事情。

    如果它们做同样的事情,那么就用包含函数的名称;尽管考虑到现有的名称,这听起来不像你想要的

    选项3:创建两个新接口,
    可移动
    可隐藏
    ,并让每个类实现适当的接口


    仔细想想,我可能会建议使用
    hide()
    show()
    ,因为这似乎能最好地捕捉到正在发生的事情。

    虽然这个问题可能会被归类为基于意见的,但我的方法仍然是添加两种方法(
    show()
    hide()
    )并让类实现它

    以下是一些其他选择:

    如果您使用的是JDK8,那么可以尝试在接口中添加上述两种方法,这样就不会立即破坏现有的实现

    此外,显然可以从接口中的默认方法调用抽象方法,因此技术上可能有两个通用命名的抽象方法和两个(或四个以上)专门命名的默认方法,但这太过分了,只会增加混乱


    你可以考虑总共有六种新方法。code>show和
    hide
    是抽象的,并且
    showPost
    /
    hidePost
    showComment
    hideComment
    是默认类,它们分别调用抽象的
    show
    hide
    。这样,即使某些实现类错误地调用了错误的别名,它仍然会调用正确的实现(理论上)。

    虽然问题可能被归类为基于意见的,但我的方法仍然是添加两个方法(
    show()
    hide()
    )并让类实现它

    以下是一些其他选择:

    如果您使用的是JDK8,那么可以尝试在接口中添加上述两种方法,这样就不会立即破坏现有的实现

    此外,显然可以从接口中的默认方法调用抽象方法,因此技术上可能有两个通用命名的抽象方法和两个(或四个以上)专门命名的默认方法,但这太过分了,只会增加混乱


    你可以考虑总共有六种新方法。code>show和
    hide
    是抽象的,并且
    showPost
    /
    hidePost
    showComment
    hideComment
    是默认类,它们分别调用抽象的
    show
    hide
    。这样,即使某些实现类错误地调用了错误的别名,它仍然会调用正确的实现(理论上)。

    只要它们的用途和用途明确,就不用担心还有几个接口。这两个选项有效:

  • PostClass
    实现了
    RemovableReportable
    ,它扩展了
    Reportable
    ;及
    CommentClass
    实现了
    HideableReportable
    ,它扩展了
    Reportable

  • PostClass
    实现了
    Reportable
    Removable
    ;及
    CommentClass
    实现了
    可报告的
    可隐藏的

  • 但是,将所有四个新方法添加到
    可报告的
    接口中,并在每个类中保留两个未实现的方法是非常错误的,因为这不会产生干净、易于理解和使用的代码。开发人员必须了解在每种情况下使用哪种方法,从而使代码更难使用和修改。如果某个开发人员调用了错误的方法,会发生什么?如果错误的方法不起作用,bug可能会被忽略。如果它抛出异常,则只会在运行时捕获bug。如果它调用另一个方法,那么你有两种方法来做同样的事情,这也是不好的和令人困惑的


    接口中未使用的方法是一种代码气味,可能表明存在设计缺陷。

    只要它们的用途和用途明确,就不要担心还有几个接口。这两个选项有效:

  • PostClass
    实现了
    RemovableReportable
    ,它扩展了
    Reportable
    ;及
    CommentClass
    实现了
    HideableReportable
    ,它扩展了
    Reportable

  • Pos
    
    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
       }
    
    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 {
    
    }