7月20日 星期一 雨,台风到了,又走了。
今天早上好大的雨,鞋子都湿了。心情还不错,继续保持哈,饱满的情绪。
今天要做点什么呢?
首先就是要把数据库修复好,不然就要给叼了。
其次是完成删除模块,上传下载模块,同步模块,备份模块还需要继续完善。事情还挺多的。
10:34------------前一个小时做的是修复数据库的事情。还好要修复的表不多,我备份之后,然后手动地把多余的数据删掉了,但是有一个表的数据删除不成功。刚才险些陷入了困境,提示说无法找到某子项目的引用,调试了半个小时,最后发现原来是根本就不需要禁用那个子项目,而是引用自己。冷静啊。做的什么蠢事啊。
10:47-----------目前要完成的是业务备份向导,业务数据备份向导的一个需求是导出某段时间内的数据,所以在获得表对象的时候需要加入一个条件函数,就是利用Where()了。也就是说可以给backup类添加一个多态的backup方法,令他可以处理有条件的备份操作。
-----------还有一点是,在执行对话框的列表控件中,理想的思路是使用它作为一个日志输入窗口,因此应该有一个日志输出方法来抽象这个过程,代码有重新设计的必要。
13:31-------------业务备份向导的有条件的备份方法目前无法完成,因为每一个表示条件的r表达式都需要知道确切的TSource类的类型,不然的话无法获取r的属性。所以现在只好猥琐的一个表一个表的写了。还好这里只有4个表。
13:55-------------又出现了一个问题:
虽然现在能把r表达式写出来(因为使用了具体的类),但是除了Bill表跟时间直接相关,可以用billDate属性来写r表达式外,其它三个表都无法写,因为第二,三个表是跟Bill表相关联的,而第四个表又是跟第三个表相关联。这导致无法直接在where方法中传入一个委托来解决问题。
所以 现在又两个 选择: 一是缩小backup的方法粒度,现在的粒度大小是数据表,如果缩到数据项粒度,就有重用的机会了。
二是写一个委托来完成。
15:14-------------关于委托的理解:刚才10分钟内在思考一个问题,r表达式的参数是怎么使用的,也就是说为什么一个可迭代的容器,比如说Table<T>,就可以自动对容器中的所有值进行判断呢? 答案很简单,就是在容器方法的实现中来调用这个委托方法了,虽然传入参数的时候只有一个名字,但是是可以传入参数的,比如说这段代码:
public class GenericDelegateDemo
{
List<String> listString = new List<String>()
{
"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
};
public String GetStringList(Predicate<String> p)
{
foreach(string item in listString)
{
if (p(item))
return item;
}
return null;
}
public bool ExistString()
{
string str = GetStringList((c) => { return c.Length <= 3 && c.Contains('S'); });
if (str == null)
return false;
else
return true;
}
}
15:31-------------决定用缩小粒度的方法
17:00-------------完成,并且开始测试
17:28------------ 测试成功。发现了一个小问题,在使用泛型的时候,可以广泛地使用var,而代替太多的强制类型转换,因为强制类型转换往往会导致编译不通过,或者运行时抛错。究竟哪一种编程思路才是正确的呢?思考中。