快速业务通道

在PHP中养成7个面向对象的好习惯

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
;
?>

在 环境发生更改之前,从数据库中装入 Person 的代码都可以正常运行。例如,从 数据库装入 Person 可能适用于第一个版本的应用程序,但是对于第二个版本, 可能需要添加从 Web 服务装入人员的功能。其实,该类已经变成 “石头 ”,因为它在直接使用实现类并且现在能做的更改十分有限。

好习 惯:使用接口

清单 7 显示了一个代码示例,在实现了加载用户的新方法 后并没有进行更改。该示例显示了一个名为 PersonProvider 的接口,该接口将 声明单个方法。如果任何代码使用 PersonProvider,代码都禁止直接使用实现 类。相反,它就像是一个实际对象一样使用 PersonProvider。

清单 7. 使用接口的好习惯

<?php
interface PersonProvider
{
  public function getPerson($givenName, $familyName);
}
class DBPersonProvider implements PersonProvider
{
  public function getPerson($givenName, $familyName)
  {
    /* pretend to go to the database, get the person... */
    $person = new Person();
    $person->setPrefix ("Mr.");
    $person->setGivenName ("John");
    return $person;
  }
}
class PersonProviderFactory
{
  public static function createProvider($type)
  {
    if ($type == ''database'')
    {
      return new DBPersonProvider();
    } else {
      return new NullProvider();
    }
  }
}
$config = ''database'';
/* I need to get person data... */
$provider = PersonProviderFactory::createProvider($config);
$person = $provider->getPerson("John", "Doe");
echo($person->getPrefix());
echo ($person->getGivenName());
?>

在使用接口时,尝 试避免直接引用实现类。相反,使用对象外部的内容可以提供正确的实现。如果 您的类将装入基于某些逻辑的实现,它仍然需要获取所有实现类的定义,并且那 样做也无法取得任何效果。

您可以使用 Factory 模式来创建实现接口的 实现类的实例。根据约定,factory 方法将以 create 为开头并返回接口。它可 以为您的 factory 获取必要的参数以计算出应当返回哪个实现类。

在清 单 7 中,createProvider() 方法只是获取 $type。如果 $type 被设为 database,工厂将返回 DBPersonProvider 的实例。从数据库中装入人员的任何 新实现都不要求在使用工厂和接口的类中进行任何更改。DBPersonProvider 将 实现 PersonProvider 接口并且拥有 getPerson() 方法的实际实现。

利用最弱的链接

将模块松散耦合 在一起是件好事情;它是允许您封装更改 的属性之一。另外两个习惯 — “保持谨慎” 和 “避免 看到美杜莎” — 可帮助您构建松散耦合的模块。要实现松散耦合的 类,可通过养成降低类依赖关系的习惯实现。

坏习惯:紧密耦合

在清单 8 中,降低依赖关系并不是必须降低使用对象的客户机的依赖关系。相 反,该示例将演示如何降低与正确类的依赖关系并最小化这种依赖关系。

清单 8. Address 中紧密耦合的坏习惯

<?php
require_once "./AddressFormatters.php";
class Address
{
  private $addressLine1;
  private $addressLine2;
  private $city;
  private $state; // or province...
  private $postalCode;
  private $country;
  public function setAddressLine1($line1)
   {
    $this->addressLine1 = $line1;
  }
     /* accessors, etc... */
  public function getCountry()
  {
    return

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号