我应该在接口中声明方便开发人员的方法吗?

时间:2018-06-27 11:28:05

标签: java oop api-design coding-style convenience-methods

我们最近讨论了有关定义方法的方法,以方便开发人员在界面中使用。给出以下最小示例:

public interface aInterface{

    public void setUri(Uri uri);
    public void setUri(String uri);

}

public class aClass implements aInterface{
  @Override
  public void setUri(Uri uri){
      //do something with uri
  }

  @Override
  public void setUri(String uri){
      set Uri(new Uri(uri));
  }

}

实现途径1:我们之一建议前瞻性地定义这两种方法,以免开发人员如果想使用该接口的实现,就不必编写样板代码。这将前瞻性地完成,而不知道最终会经常使用这两种方法中的哪一种。带有String-type-parameter的方法专门用于开发人员。

实施途径2:另一个人说,仅应创建setUri(Uri uri),因为您必须让接口的实现者实施这两种方法,这会导致接口用户付出更大的努力(测试等),这会带来更好的类型安全性。

我看到以下几个方面:

  • 对应于YAGNI原理,应仅创建两种方法中的一种-一种更适合预期功能的方法
  • 如果仅使用一个字符串,仅执行setUri(Uri)方法可能会导致更多样板代码。特别是如果Uri-Type的构造更复杂。最后,这违反了DRY原理,因为在该方法的不同用法下重复Uri-Type的构造。

哪些代码约定可以应用于此问题设置? 这两种实现途径中的每一种都会产生什么含义?

1 个答案:

答案 0 :(得分:1)

我认为,仅针对“如果有人需要它”声明接口中的方法重写,都违反了YAGNI和接口隔离。

我也支持继承而不是继承。接口是类的协定,表示“该类具有该功能”,定义可选方法并推动类实施完全无效。

有不同的解决方案,取决于整体设计结构。

我可以为您建议以下几种不同的方法:

  • 抽象类:在抽象类上提供一些常用方法
  • 封装:通过将其包装为对象来隐藏基础数据类型
  • UriFactory(工厂模式):根据给定类型的数据创建uri
  • UriGenerationStrategy(策略模式):将uri策略的产生注入我们的班级

以上所有内容可能有用或毫无意义,具体取决于您当前的项目结构和设计。