java - 代码重复与可读性

标签 java spring design-patterns readability

我有多个服务(在 Spring MVC 中)是全局服务的子项。因此,我需要通过此示例了解多种方法的最佳实践(或您的意见):

//Domain classes
public class MyParentObject{}
public class MyObj extends MyParentObject{}

//Services
public class MyParentObjectServiceImpl implements MyParentObjectService{

  @Override
  public MyParentObject findObjectByProp(String prop, String objectType){
      //myCode (not abstract class)
    }

}

public class MyObjServiceImpl extends MyParentObjectServiceImpl implements MyObjectService{

  private myObjType = "MyObj";

  @Override
  public MyObj findMyObjByProp(String prop){

   return (MyObj) super.findObjectByProp(prop, this.myObjType); 

  }
}

在这种方法中,我使用这样的调用:

MyObj foo = myObjService.findMyObjByProp(prop);

所以我需要知道这种方法是否“更好”或更适合直接使用第二个参数调用父方法。例如:

MyObj foo = (MyObj)myParentObjectService.findObjectByProp(prop, "MyObj");

..并避免创建第二种方法,更具体。重要的是要知道无论如何都会创建子服务,因为我们有很多特定于域对象的代码。

我的想法是第一种方法更好,因为它更具可读性,但我需要用一些文档、博客或意见来支持这个决定,以便与我的同事讨论这个设计。

最佳答案

这看起来像一个带标签的类层次结构。在不了解细节的情况下,很难笼统地评论这种设计的值(value)。但是,我推荐的一种略有不同的方法是泛化您的基类以获得一点类型安全。

特别是:

public /* abstract */ class MyParentObjectServiceImpl<T extends MyParentObject>
  implements MyParentObjectService{

  MyParentObjectServiceImpl(Class<T> type) { this.type = type; }

  private final Class<T> type; // subclasses provide this

  @Override
  public T findObjectByProp(String prop){
    //you can use type for object specific stuff
  }
}

public class MyObjServiceImpl extends MyParentObjectServiceImpl<MyObj>
  // You might not need this interface anymore 
  // if the only method defined is findMyObjByProp
  /* implements MyObjectService */ {
  MyObjServiceImpl() {
    super(MyObj.class);
  }

  @Override
  public /* final */ MyObj findMyObjByProp(String prop) {
    return (MyObj) super.findObjectByProp(prop, this.myObjType);
  }
}

您肯定会获得类型安全性(强制转换只会出现在基类中),您摆脱了“标签”(标识不同对象的字符串)并可能减少实现所需的类/接口(interface)的数量整个层次结构。我多次成功地使用了这种方法。请注意,如果基类是抽象的,这种方法效果最好。思想的食粮。

关于java - 代码重复与可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27362559/

相关文章:

java - MATLAB 报告 "Exception in thread "AWT-EventQueue- 0"java.lang.NullPointerException"

java - ehcache3 - 为什么缓存不会过期?

Java:如何将 JMenu 添加到 JPanel 或创建下拉按钮?

java - XPage Java 类实例化为数据源

java - 部署一次脚本用于迁移 MongoDB 中的数据

c# - 如何修改所有派生类中的方法返回值?

java.sql.SQLException : [Microsoft][ODBC Microsoft Access Driver] Cannot update. 数据库或对象是只读的

java - Mapsruct 类和 @Service 类没有 @Autowired

java - 对于这种情况,是单例,工厂还是其他更好的东西?

c# - 如何在C#中创建基于多命令结果组合的策略决策机制