English 中文(简体)
逻辑上的推算
原标题:Refactoring if/else logic

我有一套千条双线方法,如:

if (userType == "admin") {
     if (age > 12) {
          if (location == "USA") {
               // do stuff
          } else if (location == "Mexico") {
               // do something slightly different than the US case
          }
     } else if (age < 12 && age > 4) {
          if (location == "USA") {
               // do something slightly different than the age > 12 US case
          } else if (location == "Mexico") {
               // do something slightly different
          }
     }
 } else if (userType == "student") {
     if (age > 12) {
          if (location == "USA") {
               // do stuff
          } else if (location == "Mexico") {
               // do something slightly different than the US case
          }
     } else if (age < 12 && age > 4) {
          if (location == "USA") {
               // do something slightly different than the age > 12 US case
          } else if (location == "Mexico") {
               // do something slightly different
          }
     }

我如何把这一点推向更令人难以接受的东西?

问题回答

您应使用Strategies, 可能的话,可在某个方面实施,例如:

enum UserType {
  ADMIN() {
    public void doStuff() {
      // do stuff the Admin way
    }
  },
  STUDENT {
    public void doStuff() {
      // do stuff the Student way
    }
  };

  public abstract void doStuff();
}

作为每一外部的代码结构if 您的法典中的内容大致相同,在下一步骤中,你可能希望通过

<>Update: in Java4, 您可手实施typesafe enum,并使用老式次分类来执行不同的战略。

我与本守则有关的第一件事是创建<代码>Admin和Student,这两条均继承基类<代码>。 用户。 这些班级应采用doStuff(>)方法,以掩盖这一逻辑的其他内容。

作为一项umb的规则,你一旦赶上海山的开关,就可以使用多吗?

数千? 或许是一种规则发动机,是你们所需要的。 羊毛可能是一种可行的选择。

或者一种指挥模式,概括了每一案件的“略微不同的”逻辑。 在地图上储存每个指挥部,同时把年龄、地点和其他因素混为一谈。 检查指挥部,执行该指挥部,并再次这样做。 尼斯和清洁。

地图可以作为配置储存,并一开始读。 你可以通过增加新的班级和重新配置来增加新的逻辑。

第一,用户的使用范围 类型和地点——然后,您可以使用开关声明(改进可读性)

第二,使用更多的方法。

例:

switch (userType) {
  case Admin: handleAdmin(); break;
  case Student: handleStudent(); break;
}

以后

private void handleAdmin() {
  switch (location) {
    case USA: handleAdminInUSA(); break;
    case Mexico: handleAdminInMexico(); break;
  }
}

此外,确定重复编码并采用额外方法。

http://www.ohchr.org。

如果有人强迫你在没有遗体的情况下对 Java进行编码(如你强迫使用 Java1.4.2),则使用最后静态的 s,而不是 en,或做以下事情:

  if (isAdmin(userType)) {
    handleAdmin(location, age);
  } else if (isStudent(userType)) {
    handleStudent(location, age));
  }

//...

private void handleAdmin(String location, int age) {
  if (isUSA(location)) {
    handleAdminInUSA(age);
  } else if (isUSA(location)) {
    handleAdminInMexico(age);
  }
}

//...

private void handleAdminInUSA(int age) {
  if (isOldEnough(age)) {
    handleAdminInUSAOldEnough();
  } else if (isChild(age)) {
    handleChildishAdminInUSA(); // ;-)
  } //...
}

这样做的风险不仅在于它并非有远见,而且很容易发生错误。 一段时间后,你可能会在你的条件下出现重叠的风险。

如果你能够按用户类型对情况进行真正的区分,你至少可以将每一状况的身体分解为单独的功能。 因此,你根据这种类型进行检查,并指定一个与这种类型具体相关的适当职能。 比较可行的做法是代表每个用户为一类,然后超越某些计算方法,以年龄为基础收回价值。 如果你能够使用课堂,但至少可以使用 en,那么你就能够就座标做更nic的开关。 只有在 Java7才会开关。

我担心的是重叠的情况(例如,两种用户类型与一些共同的规则等)。 如果是这样,那么,作为你读和保存的一些外部档案(E.g.,表格),你可能更不用说数据,你的代码将主要作为驱动力操作,对这些数据进行适当的研究。 这是复杂的商业规则的共同做法,因为没有人想去维持吨代码。

我也许会首先检查一下,你是否能够使《标准》和《标准》的标准化。

你可以使用责任链模式。

参看<代码>f-else,例如,在接口栏目中填入“代码>。

2. 在清单或树木或任何适当的数据结构内建立你的链条,并在这一链条中执行所期望的功能。 您可以采用建筑模式来建立上述数据结构。 它类似于战略模式,但在责任链模式中,链条中的一例可以称为关联的事例。

此外,你可以通过使用战略模式来示范具体地点的功能。 希望会有所助益。

如果区块中的代码符合少数标准模式,我将编制一栏(类型、位置、面积、最高范围、行动),其中列出几种处理方式。 理想的情况是,这一表格将从数据档案中读取或保存在SQ库。

然后,你就可以在《 Java法》中做一个表格,以确定为用户采取的行动。

您可以将<代码>用户Type改为enum,并给出一种方法,使您的所有“行动略有不同”。

如果没有更多的信息,就没有很好的答案。

但公平的猜测是:使用联络处

第一种定义用户,界定阿明特人、学生和所有其他类型的使用者,然后让多吗?

考察访问模式。 它利用多变性,但不太灵活,因为以后增加新病例比较容易。

倒数是,你需要某种方式将国家信息转换成不同的情况。 补贴是一种更清洁的办法,可以增加行为,而不必改变你的继承等级。

你真的需要将这些案例分解成目标方法。 我假定这些插图和数字正在从一个数据库中删除。 您不必以粗略的有条件逻辑来利用这些原始形式,而是需要利用这些数据来制造模仿预期互动的物体。 a. 考虑一个有学生升学和学生升学分级的用户班,一个与美国和墨西哥分级的区域班级,另一个有适当分级的年龄组。

一旦有了这种面向目标的架构,你就能够利用清楚的面向目标的设计模式来重新证明这一逻辑。

Use OOP Concepts: This is dependent of the rest of the design, but maybe you should have a user interface, Student,Admin interfaces the extends it and UsaStudent,MexicoStudent,UsaAdmin,MexicoAdmin implementation that do some stuff. Hold a User instance and just call its doStuff method.





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...