思想是解决问题的根本
思想必须转换成习惯
构建一套完整的思想体系是开发能力成熟的标志
——《简单之美》(前言)php
.html
“成功的软件项目就是那些提交产物达到或超出客户的预期的项目,并且开发过程符合时间和费用上的要求,结果在面对变化和调整时有弹性。”
——《面向对象分析与设计》(第3版)P.236程序员
——引用《Spring 2.0 技术手册》林信良算法
框架的目标之一是非侵入性(No intrusive)数据库
组件能够直接拿到另外一个应用或框架之中使用编程
增长组件的可重用性(Reusability)segmentfault
管理对象的生成、资源取得、销毁等生命周期服务器
创建对象与对象之间的依赖关系session
启动容器后,全部对象直接取用,不用编写任何一行代码来产生对象,或是创建对象之间的依赖关系。数据结构
控制反转 Inversion of Control
依赖关系的转移
依赖抽象而非实践
依赖注入 Dependency Injection
没必要本身在代码中维护对象的依赖
容器自动根据配置,将依赖注入指定对象
Aspect-oriented programming
面向方面编程
无需修改任何一行程序代码,将功能加入至原先的应用程序中,也能够在不修改任何程序的状况下移除。
表现层:提供服务,显示信息。
领域层:逻辑,系统中真正的核心。
数据源层:与数据库、消息系统、事务管理器及其它软件包通讯。
——《企业应用架构模式》P.14
假设应用程序有储存需求,若直接在高层的应用程序中调用低层模块API,致使应用程序对低层模块产生依赖。
/** * 高层 */ class Business { private $writer; public function __construct() { $this->writer = new FloppyWriter(); } public function save() { $this->writer->saveToFloppy(); } } /** * 低层,软盘存储 */ class FloppyWriter { public function saveToFloppy() { echo __METHOD__; } } $biz = new Business(); $biz->save(); // FloppyWriter::saveToFloppy
假设程序要移植到另外一个平台,而该平台使用USB磁盘做为存储介质,则这个程序没法直接重用,必须加以修改才行。本例因为低层变化致使高层也跟着变化,很差的设计。
正如前方提到的
控制反转 Inversion of Control
依赖关系的转移
依赖抽象而非实践
程序不该该依赖于具体的实现,而是要依赖抽像的接口。请看代码演示
/** * 接口 */ interface IDeviceWriter { public function saveToDevice(); } /** * 高层 */ class Business { /** * @var IDeviceWriter */ private $writer; /** * @param IDeviceWriter $writer */ public function setWriter($writer) { $this->writer = $writer; } public function save() { $this->writer->saveToDevice(); } } /** * 低层,软盘存储 */ class