代码重复与可读性

时间:2014-12-08 16:37:07

标签: 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);

所以我需要知道这种方法是“更好”还是更适合用第二个参数直接调用父方法。 E.g:

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

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

我认为第一种方法更好,因为更具可读性,但我需要通过一些文件,博客或意见来支持这一决定,以便与同事讨论这些设计。

1 个答案:

答案 0 :(得分:3)

这看起来像一个标记的类层次结构。在不知道细节的情况下,很难对这种设计的价值进行评论。但是,我建议采用一种略微不同的方法,即通过基类来获得一些类型安全性。

特别是:

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);
  }
}

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