所以我有这份作业,在某些地方我需要一种可以打印表格的打印方法。方法应使用来自三个不同集合的数据打印表。表格标题不一样。例如,到目前为止,我的代码是:
private void PrintExample<T>(string fileName, T message)
{
using (StreamWriter sw = new StreamWriter(fileName, true))
{
if (message.GetType() == typeof(string))
{
// print something here
}
else if (message.GetType() == typeof(SortedList<someClass, string>))
{
sw.WriteLine("-------------------------------------------------------------------");
sw.WriteLine("| 1 | 2 | 3 |");
sw.WriteLine("-------------------------------------------------------------------");
foreach (KeyValuePair<someClass, string> kvp in message as SortedList<someClass, string>)
{
// print something here
}
sw.WriteLine("------------------------------------------------------------------------------------------");
sw.WriteLine();
}
else if (message.GetType() == typeof(Dictionary<int, List<someClass>>))
{
sw.WriteLine("-------------------------------------------------------------------");
sw.WriteLine("| SOMETHING | Name | Something2 |");
sw.WriteLine("-------------------------------------------------------------------");
foreach (KeyValuePair<int, List<someClass>> kvp in message as Dictionary<int, List<someClass>>)
{
foreach (someClass date in kvp.Value)
{
// print something here
}
sw.WriteLine("-------------------------------------------------------------------");
}
sw.WriteLine();
}
else if (message.GetType() == typeof(List<someClass>))
{
sw.WriteLine("--------------------------------------------------------------------");
sw.WriteLine("| other header | other header 7777 |");
sw.WriteLine("--------------------------------------------------------------------");
foreach (someClass date in message as List<someClass>)
{
// print something here
}
sw.WriteLine("----------------------------------------------------");
sw.WriteLine();
}
}
}
但是我想这不是做这种事情的好方法。有没有一种方法可以优化代码?顺便说一句,不是强制使用通用方法,这只是我实现代码的方式。
答案 0 :(得分:0)
以下是一些建议。我不会推荐一些最终状态,而只是建议一些事情。
从使代码更易于阅读和维护的角度来看,我正在接近“优化”。这段代码中没有任何事情让我担心它的运行速度。
您从此开始:
if (message.GetType() == typeof(string))
// code to print the string
if (message.GetType() == typeof(SomethingElse))
// code to print SomethingElse
第一步是将要打印的每种类型的代码的代码放入自己的方法中,以便现在看起来像这样。
if (message.GetType() == typeof(string))
PrintString((string)message);
if (message.GetType() == typeof(SomethingElse))
PrintSomethingElse((SomethingElse)message);
这是一个很小的重构。它所做的全部将代码移到单独的方法中。现在,您有了一种采用message
并确定要使用哪种方法进行打印的方法。然后,您将获得单独的较小方法,每个方法仅负责打印一种类型。这样就使整个内容更易于阅读。
更好的是,如果我们不必进行检查和争论就可以知道它是什么类型。 PrintExample<T>
之外的代码已经知道它将传递给该方法的类型。它正在呼叫PrintExample<string>()
,PrintExample<SomethingElse>()
等
因此,没有理由拥有一种可以接受任何类型的参数的方法,将其调用,然后返回尝试找出其类型。
相反,考虑到您的代码将知道如何打印的事物数量有限,您可以为其中的每一个编写一个方法,并将其公开:
public void Print(string value)
public void Print(SomethingElse value)
这甚至更容易使用。通用方法可让您调用
PrintExample<ThisCouldBeAnything>(thing);
但是如果ThisCouldBeAnything
实际上不是该方法可以打印的类型怎么办?如果您对不同类型使用不同的方法,那么如果您具有某种类型的变量,那么很容易查看是否有一种打印方法。调用正确的方法也很容易。
下一步是寻找重复的代码,并将其放在单独的方法甚至单独的类中。
如果打印List<Something>
和Dictionary<int, Something>
的方法都必须打印Something
的详细信息,则可以有两个都调用的PrintSomething
方法。< / p>
还有其他需要考虑的地方:您正在创建采用各种方法并编写描述它们的字符串的方法。照原样,您的班级只能写入文件。如果您需要大多数此功能,但又不想写入文件怎么办?如果您想将其写入控制台或对其进行其他操作怎么办?
最好将它们放在一个或多个单独的类中,并让方法返回string
或将StreamWriter
传递给方法或类。这样,如果一个类想要向文件中写入内容,则该类可以使用“ Printer”类或多个类来执行此操作。但是,如果另一个类想要对输出进行其他操作,则可以做到这一点。
如果您希望能够编写单元测试,这将变得更加重要。最好将课程分为不同的职责。一个负责将SomeClass
转换为字符串输出,您可以通过将字符串与期望值进行比较来测试它是否正确执行了该操作。如果要进行测试,您必须先写入文件,然后打开文件并读取它,那将更加复杂。