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