快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰集团官网:php设计模式介绍之规范模式



在一个利用软件的成型历程中,一些意想不到的商业逻辑到处呈现。比如,基于价格的斟酌,这个任 务必须削减项目;而那个义务也由于贩卖税而必须选择相宜的比率;而其它的义务也必须由于其他的特 别前提而终止。一些商业规则是简单的,只必要不到一两个布尔对照关系就够了,然而它的规则可能需 要费时的预计,必要查询数据库或者用户输入数据来向导。

经由过程书写代码可以把抽象(比如一条 商业规则)转化为详细可见的器械。然则抽象物(比如购物要领,税率,或者谋略海运费等等)都有其 进化的要领,而且这些改变很轻易难倒一个不幸运的开拓职员。为了包管安然靠得住——到目 前为止你在这本书所看到的——尽可能的分离封装那些轻易改变的模块是个很完美的设法主见。 而且,这切实着实也一个明智的应对商业规则的策略。

问题描述

有没有明确的要领来封装商 业逻辑呢?有没有一个轻易改写和重用的技巧呢?

办理规划

规范模式是为验证和选择而 开拓的:

确认一个特殊的工具是否满意必然的标准

从聚拢中选择出满意给定标准的元素 。

规范模式能让你有效的组织这些标准,并在你的利用法度榜样中机动的应用他们。

代码重 构技巧已经引发你的兴趣,你抉择应用它来提升代码的清晰度和重用性。规范模式经由过程系统化进一步的 深化了这一步,它系统把这个布局分化成一个个零丁的工具,这些工具能够很方便的插入到你的利用程 序的相宜地方。很多环境下,在你的利用法度榜样澳门新葡亰集团官网里,规范工具是参数化的,而且常常被组合在一路来构建 繁杂的合乎逻辑的表达式。

相关常识

Eric Evans 和 Martin Fowler 颁发过一篇关于规 范模型的文章,地址是:http://www.martinfowler.com/apsupp/spec.pdf

这个模式在Eric Evans的书籍《动态驱动设计》(“Domain Driven Design”)的第224到273页有具体的先容。

为了合理的周全覆盖这个模式,这章被组织成合乎逻辑的三部分。第一部分经由过程一个纯挚的实例 来阐明基础的模式观点。(E澳门新葡亰集团官网vans 和 Fowler 把这个称为为“硬编码规范Hard Coded Specification”)。接下来的部分演示了若何构建一个参数化规范模型,它供给了一个加倍动态 和机动的框架来实现规范模式(或者是以而称为“参数化规范”)的重用。着末一部分,我 们开拓了一个“规划工厂”(Policy Factory),它把许多规范工具集中成一个易于应用的包 (package)。

Traveling to Warm Destinations(到温暖的目的地去旅行)

近来,我和我 的家人计划去度一个假期,我的妻子想去一个“温暖的地方”。虽然有无数旅行相关的站点 ,然则在我们造访过的站点中没有一个站点能够为每一个目的地供给具体的气象信息。没法子,我们不 得不转到weather.com然后开始搜索,这是十分的未方便的。现在让我们来改变这种环境,为一个假定的 旅行站点增添一个气象搜索功能澳门新葡亰集团官网。在这里我们是用规范模式这个指南来向导你编码,从而对照旅行者期 望的最低温度和许多目的地的匀称温度

首先,我们创建一些异常简单的工具。第一个是旅行者( a Traveler),它存储了首选的最低温度。

// PHP5

class Traveler {

public $min_temp;

}

接下来我们创建一个工具来表示目的地(Destination)。 因为匀称温度是一个关键的标准,目的地的构建函数(__constructor)应该获得一个十二维的数组,该 数组的每一个值对应一年里面每个月的匀称温度。

class Destination {

protected $avg_temps;

public function __construct($avg_temps) {

$this->avg_temps = $avg_temps;

}

}

目的地(Destination)同样也还要一个措施,经由过程调用这 个措施能够获得这个目的地在指定月份的匀称温度。

class Destination {

//...

public function getAvgTemPByMonth($month) {

$key = (int)$month - 1;

if (array_key_exists($key, $this->avg_temps)) {

return $this->avg_temps [$key];

}

}

}

着末,一次旅行(类Trip)就由一个旅行者(类 Traveler),一个目的地(类Destination)和一个日期(a Date)联合组成。

class Trip {

public $date;

public $traveler;

public 澳门新葡亰集团官网$destination;

}

给出上面这些工具,你就可以经由过程Trip::date获得旅行的月份,并且你能够对照目的 地的月匀称温度和旅行者期望的最低温度。(这个对照可能不是特其余繁杂,然则你照样必要你自己亲 自去实现)

让我们看看若何用规范模式实现“温暖目的地”的商业逻辑,并且看看如 何利用这个模式来验证每一个目的地并选择出所有相宜的目的地。

样本代码

规范模式的 核心是一个带有IsSatisfiedBy()措施的工具,IsSatisfiedBy()措施接管一个变量来评估并且返回一个 基于规范标准的布尔值。

“目的地是足够温暖的”的标准可能便是:

class TripRequiredTemperatureSpecification {

public function isSatisfiedBy($trip) {

$trip_te澳门新葡亰集团官网mp = $trip->destination->getAvgTemPByMonth(

date(‘m’, $trip->date));

return ($trip_temp >= $trip->traveler ->min_temp);

}

}

您可能还会对下面的文章感兴趣: