0

我有几种方法,确切地说是 10 种。它们都具有相同的返回类型并接受相同的参数,就像这样

public string GenerateDataForABC(List modelList, Student student)

除了一些自定义之外,它们几乎都做同样的事情,即返回一个字符串。

例如,GenerateDataForDEF 方法将有一个唯一的代码,如下所示:

StringBuilder sb = new StringBuilder();
sb.Append("STUDENT_NUMBER");
sb.Append("\tCALLBACK_NUMBER");
sb.Append("\tSPECIALINSTRUCTIONS");
...

这样就可以为制表符分隔的文件创建一个标题。然后会有一个 for 循环,其代码如下:

foreach (Model model in modelList)
{
string sstudentNumber = "789";

sb.Append("\t");
sb.Append("\t");//SPECIALINSTRUCTIONS
sb.Append("\t" + model.ExamNumber);

...
}

foreach 在所有方法中都是通用的,唯一的区别是从 Model 对象中使用的属性。所以一种方法可能使用所有属性,另一种可能只使用 5 个。

目前,如开头所述,有单独的方法,并根据这些方法的要求使用属性。

正如我所看到的,这里有两个问题需要解决:

  1. 每种方法中的自定义部分。如何处理?
  2. 前锋。有替代品吗?

我尝试将模型的所需属性放在 xml 中,然后为仅分配所需属性的每个方法构建模型。这似乎有效,但只解决了一部分难题。

任何线索或方向表示赞赏。

问候。

4

2 回答 2

0

假设我没有误解整个问题,一种解决方案是一种使用字符串的单一方法String.Format()

private string GenerateData(string outputFormat, List modelList, Student student) {

  foreach (Model model in modelList)
  {
    sb.Append(String.Format(outputForm, model.ExamNumber, model.ExamDate, ...);
  }
}

然后可以将您的特定方法重写为:

public string GenerateDataForExamNumber(List modelList, Student student) {
  return GenerateData ("\t\tExam Number: {0}", modelList, student);
}

public string GenerateDataForExamDate(List modelList, Student student) {
  return GenerateData ("\t\tExam Date: {1}", modelList, student);
}

可能还有一个额外的options对象,以防它们在输出之间需要进一步的微小差异。

于 2013-08-27T12:07:40.653 回答
0

假设您有一个 Heading 类,它给定一个字符串,返回适当的标题字符串。

抱歉,这将比 C#-ish 更像 java-ish,但我想你会明白的:

final public static String STUDENT_NUMBER = "Student Number";
final public static String CALLBACK_NUMBER = "Callback Number";
final public static String SPECIAL_INSTRUCTIONS = "Special Instructions";
// etc.

public String getHeading(String key) {
    if (key.equals(STUDENT_NUMBER) return STUDENT_NUMBER;
    // etc;
}

这可以通过使用地图来简化,但这很简单。

现在说你的模型也可以在给定键的情况下返回一个字符串:

public String getCell(String key) {
    if (key.equals(STUDENT_NUMBER) return StudentNumber;
    // etc.
}

同样,这可以改进,用一个单独的类来提供单元格值,但这是一个不能真正帮助解释的细节,所以我将把它从代码中删除。

现在,获取一个标题列表或数组:

final String[] columns = {STUDENT_NUMBER, CALLBACK_NUMBER, SPECIAL_INSTRUCTIONS};

并将该列表传递给一个新方法:

public String makeTable(Heading heading, Model[] models, String[] columns) {
    StringBuilder sb = new StringBuilder();
    for (String column: columns) {
        sb.Append(heading.getHeading(column).Append("\t");
    }
    for (Model model: models) {
        for (String column: columns) {
            sb.Append(model.getCell(column).Append("\t");
        }
    }
    return sb.toString();
}

那应该差不多了。您当然可以担心尾随标签,但基本上我们已经概括了解决方案。

于 2013-08-27T13:59:58.993 回答