通过基于测试驱动的开发方式,你可以编写尽可能少的代码来符合你现阶段的测试需求,你也可以增加测试——如果你还未满足这个类的需求。
以下为满足前述测试要求的最简单的代码:
代码:
class Registry {function isValid() {return false;} function get() {} function &getInstance() {static $instance = array(); if (!$instance) $instance[0] =& new Registry; return $instance[0]; } }
确实,isValid() 和 get()方法的代码片断并不是非常好,但是所有的测试通过了!下面我们添加更丰富的测试用例。
代码:
class RegistryPHP4TestCase extends UnitTestCase {function testRegistryIsSingleton() { /*...*/ } function testEmptyRegistryKeyIsInvalid() { /*...*/ } function testEmptyRegistryKeyReturnsNull() { /*...*/ } function testSetRegistryKeyBecomesValid() {$reg =& Registry::getInstance(); $test_value = 'something';$reg->set('key', $test_value); $this->assertTrue($reg->isValid('key')); } }
为了满足testSetRegistryKeyBecomesValid()方法,“注册模式”类必须要有追踪(tracking)的功能——如果特定的属性用set()方法设置了。 很明显的一种实现方式是利用PHP4中的联合数组作为实例变量,并利用PHP的array_key_exists()函数来检测我们想要的索引是否被创建了。
下面是“注册模式类”更进一步的实现。
代码:
class Registry {var $_store = array(); function isValid($key) {return array_key_exists($key, $this->_store);} function set($key, $obj) {$this->_store[$key] = $obj;} function get() {} function &getInstance() {static $instance = array(); if (!$instance) $instance[0] =& new Registry; return $instance[0]; } }
通过在声明时初始化$_store变量,就没有设置构造函数的必要了。(注:在PHP4中没有适当的访问控制标记,以下代码遵循私有变量以下划线作前缀的约定)
出处:phpchina
责任编辑:bluehearts
上一页 php设计模式介绍之注册模式 [1] 下一页 php设计模式介绍之注册模式 [3]
◎进入论坛网络编程版块参加讨论
|