Re: [心得] 用GUARD CLAUSES与EAFP写code。

楼主: rickysu (Ricky)   2014-03-24 10:59:01
当叙述中越来越多 if else 或是充斥一堆 switch case时,debug 上是相当困难的。
要实作 unit test 也会增加不少困难度。
要解决这样的问题会比较建议采用 Chain of Responsibility 模式(责任链模式)
<?php
abstract class Handler
{
protected $nextHandler;
abstract function handle($number);
public function __construct(Handler $handler = null)
{
if($handler !== null){
$this->addNextHandler($handler);
}
}
public function addNextHandler(Handler $handler)
{
$this->nextHandler = $handler;
}
protected function handleNext($number)
{
if($this->nextHandler !== null){
$this->nextHandler->handle($number);
}
}
}
class lessThan extends Handler //负责处理小于的状况
{
function handle($number)
{
if($number < 5)
{
echo "$number < 5\n";
return;
}
$this->handleNext($number);
}
}
class equal extends Handler //负责处理等于的状况
{
function handle($number)
{
if($number == 5)
{
echo "$number == 5\n";
return;
}
$this->handleNext($number);
}
}
class greaterThan extends Handler //负责处理大于的状况
{
function handle($number)
{
if($number > 5)
{
echo "$number > 5\n";
return;
}
$this->handleNext($number);
}
}
$handler = new lessThan(new equal(new greaterThan()));
$handler->handle(1); //输出 1 < 5
$handler->handle(5); //输出 5 == 5
$handler->handle(6); //输出 6 > 5
责任炼顾名思义如果我能处理就接下来处理,如果不能处理就继续往下丢,
直到处理完成为止。
这样的好处是可以针对个别的 handler 做 unit test,另外当我要新增或是移除某个
handler 时也相当简单不需要大幅度的变动整个 code。
作者: dlikeayu (太阳拳vs野球拳)   2014-03-26 08:58:00
推CoR模式

Links booklink

Contact Us: admin [ a t ] ucptt.com