第一,要改,只需要改要改之字,此为可维护;第二,这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此及可复用;第三,此诗若要加字,只需另刻字加入即可,这是可扩展;第四,字的排列其实可能是竖排可能是横排,此时只需将活字移动就可做到满足排列需求,此是灵活性好。
我写出的代码与小菜第一版代码本质上完全相同,如果我去面试,也是一个失败的家伙。不写成类的原因是,这么简单的代码还要写成类吗?意味着,我对类寄以较高的希望,只有复杂的东西才用的超级武器,我现在不用,是因为我的东西还不够复杂。顺序执行的代码方式根深蒂固,而不是一开始就用对象的思维去思考问题。
1:业务逻辑与界面逻辑分开,降低耦合度,提高利用率(封装)
2:增加一些功能时,不必修改原始类的源代码
封装、继承、多态
强制要求要利用到类,当然是可以写出类代码,我也只写一个类(运算类),存在的问题也是如果要增加一种运算,要把整个类源码开放开来进行修改。
写到第三种方式时,我遇到的知识点就多了:
1.虚方法virtual与重载override对应;
2.throw new Exception("除数不能为0。");能够在屏幕上多显示一些有用信息
3.我后面才知道我的写法错了,没有得到正确结果,我没有增加工厂类,而是直接在运算类中增加一个方法。但这种方法的缺点只在于:没有取出正确的变量,如果代码中用this给其赋值,也是可以的。
虽然增加一种运算,还是要改运算工厂类,并且是使用switch,输入要有顺序,加号先输入,然后再输入前后两个数字。但毕竟不用把其它运算类的源码公开(这有点像,本来一个类的代码,现在变成几个类,所以实现了不用公开其它人源码,如果面向过程的也可以把单个函数编译成DLL,也一样)。根据我目前的知识,这算是最好的了。
UML
一个矩形框代表一个类,它分三层:名称(抽象用斜体表示);类特性,即字段和属性(前面的+表示public,-表示private,#表示protected);类操作,即方法或行为。(事件呢?)
接口图也用矩形框表示,区别在于顶端有<<interface>>,(接口有没有方法或行为?)接口另一种表示法:棒棒糖表示法(够表示吗?会不会多处出现同样一个接口)
继承用空心三角形+实线,子类指向父类,因此多个子类时,就共用一个空心三角形。
接口用空心三角形+虚线,子类指向接口,因此多个子类实现同样接口,也是共用一个空心三角形。
关联用实线箭头来表示,关联就说明类中间有用到其它类。
聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。如大雁与雁群,聚合关系用空心的菱形+实线箭头表示,从雁群指向大雁,说明雁群包含大雁。
合成(又译组合)是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。如鸟与翅膀,合成关系用实心的菱形+实线箭头表示,由鸟指向翅膀(鸟类中有翅膀的变量声明)。
关联、聚合、合成都可能有标识基数。
依赖关系用虚线表示,代码中表现为入口参数有该类型的变量。(实际中要根据代码区分它们的关系可能也是困难的)