如果你将随便一个方法也当做一个类,你得弄多少类(或者接口)啊?OOD设计也仍然是要尽可能地精炼的。只有符合某种“必须拆解”的东西才拆解,而非常简单的东西就应该作为关联类(或者接口)中的属性或者方法。在设计中,应该基于“业务领域概念”来设计,而不应该出现什么纯粹计算机领域的概念。你的什么“xxxxFileHandler“是非常突兀的,是乱源。如果说一套数据资料需要有两种不同的保存和读写形式,那么你只要有 AQIDay、ExcelAQIDay、CSVAQIDay这三个类就够了。而相应的操作,应该出现在 AQIDay的定义中,并且被另外两个所继承。比如说写代码public class DataProc
{
...... public void ReadAQI(DateTime month)
{
var x = new CSVAQIDay( new DateTime(month.Year, month.Month, 1));
foreach(var y in x.Datas)
{
.....显示y
}
x.Add(....);
x.Save(); //以CSV格式保存数据,而不是Excel格式
}
}那么这类程序,显然就需要通过AQIDay类的 Datas 属性和 Add、Save方法来操作。那么你的图上并没有!而format操作,纯粹是你将来编写实现Save方法时的内部实现,很低级、很靠“后”的东西。在你的图上,什么“xxxxHandler”、“format”这种东西是多余的,而真正需要作为开发合同的AQIDay的高层接口属性和方法缺失。可见你在画这个图的时候,也不能够给人家明确写出具体的AQIDay类对象的操作行为、脚本,而只是一个含糊其辞的状态。初学者有一种毛病,就是总是念念不忘纠结底层的技术(在高层次的设计图上纠结结一点点技术术语,例如什么Handler之类的),而忽略大量真正需要设计的属性、行为、时序、通讯、用例等等。这是不对的。你知道技术再多,你现在要面对的是设计接口、协议,而底层技术是将来具体实现的人才应该去关心的事情。
{
...... public void ReadAQI(DateTime month)
{
var x = new CSVAQIDay( new DateTime(month.Year, month.Month, 1));
foreach(var y in x.Datas)
{
.....显示y
}
x.Add(....);
x.Save(); //以CSV格式保存数据,而不是Excel格式
}
}那么这类程序,显然就需要通过AQIDay类的 Datas 属性和 Add、Save方法来操作。那么你的图上并没有!而format操作,纯粹是你将来编写实现Save方法时的内部实现,很低级、很靠“后”的东西。在你的图上,什么“xxxxHandler”、“format”这种东西是多余的,而真正需要作为开发合同的AQIDay的高层接口属性和方法缺失。可见你在画这个图的时候,也不能够给人家明确写出具体的AQIDay类对象的操作行为、脚本,而只是一个含糊其辞的状态。初学者有一种毛病,就是总是念念不忘纠结底层的技术(在高层次的设计图上纠结结一点点技术术语,例如什么Handler之类的),而忽略大量真正需要设计的属性、行为、时序、通讯、用例等等。这是不对的。你知道技术再多,你现在要面对的是设计接口、协议,而底层技术是将来具体实现的人才应该去关心的事情。
解决方案 »
- winform程序的小问题
- winform dateTimePicker控件问题
- socket的问题
- 如何调用系统默认文本编辑器打开文本格式文件(非txt)
- 求一 正则表达式
- 谁能解决这样一个难题:由于在Web页上不能显示TIF图片,我用VB做了一个OCX,放到Web页面上,但是,这个OCX只能作为客户端控件使用,怎么用它来访问服务器端的图片啊?
- Winform中 DataGird排序后行定位问题(waiting online)
- 控制威迪杰喷码机换行问题
- 关于socket 公网tcp连接的问题
- C# 的安装包程序bootstrapper不知道哪儿有的下
- 在使用Crystal Reports时,除了用加入新项--专家向导生成.rpt文件外,还有什么别的方法
- 如何学习c#,我是个菜鸟!!请指教!!
2. 你的 xxxHandler 都应该从设计图纸中去掉。假设设计时有15个类型(和接口),而实现代码时,你完全可能实现50个class(和接口)。不是所有的次要的东西都要画在设计图上的。不属于设计层次、而仅仅是实现层次的 xxxHandler,如果你喜欢,那么你应该在实现时自己去写。
3. 去掉了上面两项冗余的,那么你的图上其实就剩下三个class。其中 AQIDay 是父类。
4. 但是你的 AQIDay 与其它关联类的交互,靠什么呢?你没有说明必要的属性、必要的方法。
5. 你的 format 方法只是底层的具体实现方法,不够格放到图纸上。应该把高层的更适合AQIDay操作的Save方法放到图纸上。
{
AQIDay x = new CSVAQIDay( new DateTime(month.Year, month.Month, 1));
foreach(var y in x.Datas)
{
.....显示y
}
x.Add(....);
x.Save(); //以CSV格式保存数据,而不是Excel格式
}
这样更清楚地对应到设计图的含义。这里的 x,声明为 AQIDay,实例化为(引用对象为)CSVAQIDay。以后的操作,就都是根据 AQIDay 父类的公共属性和方法接口而调用的。这样,如果我需要改为 Excel格式的,那么我只要把实例化 x 引用对象的那一行代码改一下就行了。甚至我可以把那一行改为调用一个“工厂方法”让其隐藏实例化方式(例如根据配置文件,从将来开发的更多种类的AQIDay子类中去实例化)。这种调用 AQIDay 的方式,就对应到你的设计图,不要有多余的东西。你的设计图是用来指导我来写上述这种非常“自然的、成文自明的”程序的,多余的、纯计算机底层的东西不在设计图上展示。
bool Load(AQIDay obj, string type);bool Save(AQIDay obj, string type);这两个接口的实现方法中,通过type参数,调用不同的实现xls或csv文件读写的方法即可。很简单的一个接口类,或者是一个wcf服务类啊。
差不多,是这样的,从csv和xls中读取的数据,字段和是固定的,为了方便扩展.和用OO的思想,当然想将从csv和xls的每行记录,都用一个AQIDay 的类的结构来维护.
其实是要往数据库中放的.但是考虑到将来的维护,所以如果直接在 sql语句中固定insert语句,会很麻烦.
况且后期还打算向客户端提供的AQIDay信息.就是这么回事儿.