第二周学习总结
软件开发简史
莱布尼茨最早提出:各种事务都可以通过一种语言进行描述
十九世纪:Ada 写出了第一个软件程序
冯诺依曼:在计算机输入了第一个程序
出现了形形色色的编程语言,直到面向对象的语言出现
OOP 和架构设计
面向对象设计有三要素:封装、继承和多态。
面向对象编程不是简单地使用面向对象语言进行编程,而是利用多态编程——将客观世界抽象为计算机领域内的对象。听老师讲过,多态是框架的重要基础。
我没有看过 HeadFirst 的架构设计那本书,之前看过几页大话设计模式。
设计模式就是一种应用面向对象语言解决现实问题的经验的汇总。
框架和工具
框架调用应用内的代码,工具被应用内的代码调用。
电话拨号软件案例分析
软件设计的臭味:僵硬、脆弱、不可移植、晦涩、过度设计等等。
老师在课上以一个“电话拨号软件”为例,解释了“臭味”软件——不可扩展。软件最大的特点就是需求不断变更,当新的需求来临的时候,只能通过添加 if-else、switch-case 或者一些新的状态码来解决。
代码从阅读感官上就不好,数量巨大后,完全没有可维护性。
关于 if-else 嵌套问题,在某些直播里面,老师也讲到,不是说不写 if-else,而是说在有设计模式的情况下,可以做优化,以免过度设计或者不做设计。
面向对象设计的基本原理
避免代码“臭味”,遵循“高内聚、低耦合”,也就是 SOLID 原则:
单一职责(SRP)
单一职责表明一个类有且只有一个职责。一个类自然能添加任意多的属性和方法,然而过多的内容会让这个类变得笨重。我个人觉得类里面的方法尽量精简,不要写大段大段的方法,保持较简短的方法的组合,那样测试也更容易。
开闭原则(OCP)
一个类应该对扩展开放,对修改关闭。一旦创建了一个类,你的方法就会被人调用,之后就尽量不要在修改方法了,因为很可能会导致一系列的副作用。所以一般只扩展新功能,而不是修改旧功能。
里氏替换原则(LSP)
派生的子类应该可以替换父类,也就是说任何父类出现的地方,子类一定可以替换。换言之,父类的约束要强于子类。现实开发中,一般情况下就是用组合来代替继承。
接口隔离原则(ISP)
类不应该被迫依赖它们不使用的方法,接口应该拥有尽可能少的行为,需要专一、精简。作业就是这样。看上去我们的作业比之前少一道题。
依赖倒置原则(DIP)
依赖倒置原则表明高层模块不应该依赖低层模块。相反,它们都依赖于抽象、接口。这意味着你的代码里面不应该在高层模块里面依赖低层模块,这样会让高层模块紧密耦合、依赖低层模块,难以复用。
现实开发中,一般会使用 Spring 等方式,将低层模块注入到高层模块中。这也就是控制反转(IoC)技术,通过构造器传参(低层模块)的形式初始化高层模块;具体到开发中就是依赖注入,注入了接口实现类(DI)。
小结
这周的内容主要是通过拨号软件的设计,引出了 Robert C.Martin 的 SOLID 原则。
我的设计能力很差,根本不知道这么多设计原则,读书的时候讲究实践,现在看来,还是理论更绵延长久。也没有看过 Martin 的其它设计,感觉好匮乏。所以现在很痛苦,那是之前欠下的债,现在不痛苦,后面就更苦。
评论