如果你将随便一个方法也当做一个类,你得弄多少类(或者接口)啊?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之类的),而忽略大量真正需要设计的属性、行为、时序、通讯、用例等等。这是不对的。你知道技术再多,你现在要面对的是设计接口、协议,而底层技术是将来具体实现的人才应该去关心的事情。

解决方案 »

  1.   

    给你简单总结一下这里的问题:1. 除非足够独立和庞杂,否则一个方法不要单独成为一个类。它应该就是所关联的其它类中的方法。
    2. 你的 xxxHandler 都应该从设计图纸中去掉。假设设计时有15个类型(和接口),而实现代码时,你完全可能实现50个class(和接口)。不是所有的次要的东西都要画在设计图上的。不属于设计层次、而仅仅是实现层次的 xxxHandler,如果你喜欢,那么你应该在实现时自己去写。
    3. 去掉了上面两项冗余的,那么你的图上其实就剩下三个class。其中 AQIDay 是父类。
    4. 但是你的 AQIDay 与其它关联类的交互,靠什么呢?你没有说明必要的属性、必要的方法。
    5. 你的 format 方法只是底层的具体实现方法,不够格放到图纸上。应该把高层的更适合AQIDay操作的Save方法放到图纸上。
      

  2.   

    我把代码改一下    public void ReadAQI(DateTime month)
        {
            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 的方式,就对应到你的设计图,不要有多余的东西。你的设计图是用来指导我来写上述这种非常“自然的、成文自明的”程序的,多余的、纯计算机底层的东西不在设计图上展示。
      

  3.   

    抛开需求变更的预期不谈,没法谈"OOD",如果你仅仅实现"xls"和"csv",而没有第三种格式,硬编码又有何不妨?如果说你还有别的格式支持,你需要的是抽象和重构,而不是拿出几张uml图高谈阔论。
      

  4.   

    我只是来看OOD的,不说话,上面有大神在
      

  5.   

    按楼主的描述,似乎是一个系统中的数据读写接口。这个接口需要从xls或csv文件中读取数据和保存数据到这两类文件中?如果我理解没错的话,这个类只需要暴露两个接口:
    bool Load(AQIDay obj, string type);bool Save(AQIDay obj, string type);这两个接口的实现方法中,通过type参数,调用不同的实现xls或csv文件读写的方法即可。很简单的一个接口类,或者是一个wcf服务类啊。
      

  6.   


    差不多,是这样的,从csv和xls中读取的数据,字段和是固定的,为了方便扩展.和用OO的思想,当然想将从csv和xls的每行记录,都用一个AQIDay 的类的结构来维护.
    其实是要往数据库中放的.但是考虑到将来的维护,所以如果直接在 sql语句中固定insert语句,会很麻烦.
    况且后期还打算向客户端提供的AQIDay信息.就是这么回事儿.