我有几种方法,确切地说是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种。
目前,如开头所述,有单独的方法,并根据这些方法要求使用适当的。
我认为这里有两个问题需要解决:
我尝试将模型的必需属性放在xml中,然后为每个只分配所需属性的方法构建模型。这似乎有效,但只解决了这个难题的一部分。
感谢任何线索或方向。
问候。
答案 0 :(得分: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
个对象。
答案 1 :(得分:0)
假设您有一个Heading类,给定一个字符串,返回相应的标题字符串。
对不起,这将比C#更多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;
}
使用Map可以简化这一点,但这很简单。
现在说你的模型也可以返回给定密钥的字符串:
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();
}
应该这样做。你当然可以担心尾随标签,但基本上我们已经推广了解决方案。