如何避免多个地方同一事物的潜在长if语句

时间:2013-05-09 09:07:55

标签: java spring java-ee

我正在创建一个应用程序,在前面我检查用户是管理员,用户,主持人还是超级用户。基于此,我创建了一个不同的XML。

所以我目前所做的是在方法参数中传递一个字符串,该字符串将对象转换为XML以指定它应该使用哪个映射。然而,传递这些字符串并不好。有没有更好的模式?

我可以将角色检查带到映射类,然后将映射ID更改为与当前用户的角色相同。但我不认为安全检查适合这些类。

您是否只需创建一个枚举来保留角色并传递该角色而不是字符串?

或创建不同的类并使用工厂返回正确的对象?

2 个答案:

答案 0 :(得分:3)

通用接口方法

通过在所有返回对象之间实现通用接口,您可以在代码中开发一些loose coupling。例如:

public interface XmlReturn
{
     public void displayXML(); // Just an example method.
}

实现此接口的类:

public class AdminXmlReturn implements XmlReturn
{
     public void displayXML() { // Some code here for the admin XML }
}

有了这个,你可以生成一种带有鉴别器的工厂:

public abstract class XmlFactory 
{
     public static XmlReturn getInstance(String type)
     {
         // Using string as an example type. Doesn't need to be.
         if(type.equals("Admin")) {
              return new AdminXmlReturn();
         }
     }
}

并通过它的接口类型引用对象,您可以生成所需的任意数量的XML个文件,而无需更改任何代码。 IE:

public void loadPage(String permission)
{
    // permission can be any type. This is just an example.
    XmlReturn xml = XmlFactory.getInstance(permission);
    xml.displayXML();
    // This method exists in all objects that implement XmlReturn
}

优点

此方法的主要优点是您可以根据需要添加任意数量的新XML文件和权限,并且您无需更改加载XML的代码。这种“关注点分离”将帮助您使您的程序易于管理和扩展。

通过将您的决策逻辑移植到工厂,您可以帮助您的代码更具可读性,并允许其他人从您的程序内部工作细节中抽象出来,如果您打算共享代码。

答案 1 :(得分:0)

你的问题不是很清楚。无论如何,我试着给出一些选择:

  1. 如果你想序列化为不同类型的用户,那么我建议将不同类型的用户建模为类的层次结构,并在每个类中都有一个专门的toXML()序列化方法。顺便说一下,如果你想做的话,JAXB可以帮到你很多。

  2. 如果你有一个类XMLBuilder写一些XML,并且构建XML的方式取决于用户的类型,那么我建议用不同类型的用户建模类,然后在XMLBuilder中使用方法重载,即有几个build()方法,每个方法都将用户类层次结构的不同子类作为输入。

  3. 我希望这会有所帮助。