2011-04-19 70 views
3

我有如下实现的方法类:我们可以重构这些方法吗?

void methodOne() { 
    try { 
     getHelper().doActionOne(); 
    } catch (Exception ex) { 
     throw new CustomException(ex); 
    } 
} 

void methodTwo() { 
    try { 
     getHelper().doActionTwo(); 
    } catch (Exception ex) { 
     throw new CustomException(ex); 
    } 
} 

void methodThree() { 
    try { 
     getHelper().doActionThree(); 
    } catch (Exception ex) { 
     throw new CustomException(ex); 
    } 
} 


void methodFour; 
void methodFive; 
... 

有没有更好的方式来做到这一点?这些代码让我感到不舒服。

编辑: 对不起,不清楚的例子。我执行与Hibernate GenericDao类,真正的代码是这样的:

class GenericDaoImpl<T, PK> { 

    PK create(T object) { 
     try { 
      getSession().save(object); 
     } catch(Exception ex) { 
      throw new DataAccessLayerException(ex);// wrap any exception to my exception 
     } 
    } 

    T read(PK id) { 
     try { 
      getSession().get(T.class, id); 
     } catch (Exception ex) { 
      throw new DataAccessLayerException(ex); 
     } 

    } 

    void update(T object); 
    void delete(T object); 

} 
+3

能否请您解释一下在这些方法被称为上下文? – Ammu 2011-04-19 03:16:38

+0

为什么代码会让你感到不舒服?我没有看到你的代码有什么特别的错误。 – 2011-04-19 03:22:08

+0

目前还不清楚你想要完成什么,所以很难推荐更好的方法。你为什么捕获所有异常并用自定义异常包装它们?它看起来像你试图避免所有检查异常与未经检查的异常。 – WhiteFang34 2011-04-19 03:22:28

回答

6

只是一个基本的建议,但你可以重构弄成像这样的“命令模式”。该模式允许您将一些功能封装到实现单一方法的类中。这个类可以被实例化并传递到另一个类执行,而执行者类不知道或关心它在做什么,它只是需要调用execute()。如果这些动作需要参数,则实现Command的类可以包含可以在构造函数中设置的字段/属性或由标准属性设置器设置。

作出这样的接口(我的Java是生疏了,所以这可能不是100%有效的语法):

public interface Command 
{ 
    public void execute(); 
} 

public class ActionOne implements Command 
{ 
    public void execute() 
    { 
     // do actionOne... 
    } 
} 

public class ActionTwo implements Command 
{ 
    public void execute() 
    { 
     // do actionTwo... 
    } 
} 

// etc. for more actions 

然后创建一个执行该操作的类,并且调用代码只需要通过在正确的Command实现类中。

public class Executor 
{ 

    public void executeCommand(Command command) 
    { 
     try 
     { 
      // Put any boilerplate code here (logging, auditing, etc.) 
      command.execute(); 
     } 
     catch (Exception ex) 
     { 
      // Put general error handling code here. If you're just catching and rethrowing, consider not catching the Exception at this level. If it's a checked exception, add a throws clause to the method. 
      throw new CustomException(); 
     } 
    } 
} 
+0

我appriciate你的建议,但使用命令模式似乎增加我的班的人数。我正在考虑使用类Method来动态调用。 – Genzer 2011-04-19 04:23:24

+2

你为什么在乎增加班级数量? 10个小型集中班比一个大班要好10个不同的东西。除非你绝对必须走这条路线,否则我也会避开反思。使用一些基本的接口和类可以更简洁地表达您的代码。 – 2011-04-19 04:26:44

+0

我试图重构类与类似的问题。 如果我的课程有100个方法,还有什么建议吗?我唯一能想到的是为Action类创建一个新的包。 – TheAmpersand 2012-12-17 17:10:12

1

是的,你总是可以重构代码。唯一的问题是你是否要重构使其更好或更糟。这个代码很奇怪的提示是一个很好的暗示,它可以变得更好。

这看起来像一个很好的候选人polymorphisim。使用一种共享方法尝试五个不同的类,而不是五种不同的方法。界面将把它们结合在一起。

public interface DoIt { 
    public void doIt(); 
} 

public class One implements DoIt { 
    public void doIt() { 
    // code which was previously in getHelper.doActionOne(); 
    } 
} 

public class Two implements DoIt { 
    public void doIt() { 
    // code which was previously in getHelper.doActionTwo(); 
    } 
} 

... 

public class Five implements DoIt { 
    public void doIt() { 
    // code which was previously in getHelper.doActionFive(); 
    } 
} 

现在唯一要做的就是创建情况的正确的类,并调用其doIt()方法。

0

这家工厂是由Spring Framework与许多人一起提供。首先,它有一个特定的HibernateTemplate,它将每个Hibernate特定的异常映射到未经检查的相关Spring异常。其次,它提供AOP服务来在方法级别转换异常,因此您可以指定一次映射并将它们统一应用于多个服务。

虽然我不会用Spring为仅这一项功能,它用于构建应用程序巨大的好处,我已经使用了很多年持续。