思想
思想是解决问题的根本
思想必须转换成习惯
构建一套完整的思想体系是开发能力成熟的标志
——《简单之美》(前言)
.
“成功的软件项目就是那些提交产物达到或超出客户的预期的项目,而且开发过程符合时间和费用上的要求,结果在面对变化和调整时有弹性。”
——《面向对象分析与设计》(第3版)P.236
术语介绍
——引用《Spring 2.0 技术手册》林信良
非侵入性 No intrusive
-
框架的目标之一是非侵入性(No intrusive)
-
组件可以直接拿到另一个应用或框架之中使用
-
增加组件的可重用性(Reusability)
容器(Container)
-
管理对象的生成、资源取得、销毁等生命周期
-
建立对象与对象之间的依赖关系
-
启动容器后,所有对象直接取用,不用编写任何一行代码来产生对象,或是建立对象之间的依赖关系。
IoC
-
控制反转 Inversion of Control
-
依赖关系的转移
-
依赖抽象而非实践
DI
-
依赖注入 Dependency Injection
-
不必自己在代码中维护对象的依赖
-
容器自动根据配置,将依赖注入指定对象
AOP
-
Aspect-oriented programming
-
面向方面编程
-
无需修改任何一行程序代码,将功能加入至原先的应用程序中,也可以在不修改任何程序的情况下移除。
分层
表现层:提供服务,显示信息。
领域层:逻辑,系统中真正的核心。
数据源层:与数据库、消息系统、事务管理器及其它软件包通信。
——《企业应用架构模式》P.14
代码演示IoC
假设应用程序有储存需求,若直接在高层的应用程序中调用低层模块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();
}
}
/**
* 低层,软盘存储
*/