前言
最近做了一个项目,其中有个日志模块。功能要求很是简单,只要从文件中读取日志并显示即可。但是项目是一个新手程序员做的,现在面我们来看看这个新手程序员做的内容有什么问题。
界面
界面使用了一个二维列表,显示时间、日志内容和时间等信息。由于不是关注重点,且界面也能够满足需求,所以就不再讨论。
后台代码
以下是最主要的读取代码。
private void 日志_Load(object sender, EventArgs e)
{
this.listView1.Items.Clear();
this.listView1.BeginUpdate();
StreamReader sr = new StreamReader(Common.StartFolder + "\\record.log");
while (sr.Peek() > 0)
{
string x = sr.ReadLine();
if (!x.Contains(","))
continue;
string[] content = x.Split(',');
if (content.Length == 4)
{
ListViewItem item = new ListViewItem();
item.Text = content[0];
item.SubItems.Add(content[1]);
item.SubItems.Add(content[2]);
item.SubItems.Add(content[3]);
listView1.Items.Add(item);
}
}
sr.Close();
this.listView1.EndUpdate();
}
从以上代码中,我们可以看到,数据读取、数据拆分和界面关联完成混在了一起。这样的代码耦合度太高,而且没有任何可复用的内容,同时如果界面上的顺序需要修改,也会比较麻烦。
修改建议
首先,既然日志是一个可能常用的内容,我们应该定义一个日志类。如下所示,我们即定义了类的属性,还定义了几个可能用到的方法。
public class TranLog
{
public int StartID;
public int EndID;
public int LogTime;
public string Result;
public string[] ToStrings1 ()
{
// 代码略。
}
public static TranLog Parse(string s)
{
// 代码略。
}
public static TranLog[] Load(string file)
{
// 代码略
}
}
有了以上的代码定义,现在我们再看看客户端的代码,可以进行以下优化。
private void 日志_Load(object sender, EventArgs e)
{
listView1.Items.Clear();
listView1.BeginUpdate();
foreach(var log in TranLog.Load(Common.StartFolder + "\\record.log"))
listView1.Items.Add(new ListViewItem(log.ToStrings1());
listView1.EndUpdate();
}
通过重新编写以后,客户端的代码只有以下几行。业务逻辑也变得非常清晰,即加载和界面填充,从面极大地简化了代码。这样的化简不仅易于阅读,同样也易于管理。