快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
$this->country;
  }
   public function format($type)
  {
    if ($type == "inline") {
      $formatter = new InlineAddressFormatter();
    } else if ($type == "multiline") {
      $formatter = new MultilineAddressFormatter();
    } else {
       $formatter = new NullAddressFormatter();
    }
     return $formatter->format($this->getAddressLine1(),
       $this->getAddressLine2(),
      $this->getCity (), $this->getState(), $this->getPostalCode(),
       $this->getCountry());
  }
}
$addr = new Address ();
$addr->setAddressLine1("123 Any St.");
$addr->setAddressLine2("Ste 200");
$addr- >setCity("Anytown");
$addr->setState ("AY");
$addr->setPostalCode("55555- 0000");
$addr->setCountry("US");
echo ($addr->format("multiline"));
echo ("\n");
echo($addr->format("inline"));
echo("\n");
?>

在 Address 对象上调用 format() 方法的代码可能看上去很棒 — 这段代码所做的是使用 Address 类,调用 format() 并完成。相反,Address 类就没那么幸运。它需要了解用于 正确格式化的各种格式化方法,这可能使 Address 对象无法被其他人很好地重 用,尤其是在其他人没有兴趣在 format() 方法中使用格式化方法类的情况下。 虽然使用 Address 的代码没有许多依赖关系,但是 Address 类却有大量代码, 而它可能只是一个简单的数据对象。

Address 类与知道如何格式化 Address 对象的实现类紧密耦合。

好习惯:在对象之间松散耦合

在构建优秀的 OO 设计时,必须考虑称为关注点分离(Separation of Concerns ,SoC)的概念。SoC 指尝试通过真正关注的内容分离对象,从而降低耦合度。 在最初的 Address 类中,它必须关注如何进行格式化。这可能不是优秀的设计 。然而,Address 类应当考虑 Address 的各部分,而某种格式化方法应当关注 如何正确格式化地址。

在清单 9 中,格式化地址的代码被移到接口、实 现类和工厂中 — 养成 “使用接口” 的习惯。现在, AddressFormatUtils 类负责创建格式化方法并格式化 Address。任何其他对象 现在都可以使用 Address 而不必担心要求获得格式化方法的定义。

清单 9. 在对象之间松散耦合的好习惯

<?php
interface AddressFormatter
{
  public function format($addressLine1, $addressLine2, $city, $state,
    $postalCode, $country);
}
class MultiLineAddressFormatter implements AddressFormatter
{
  public function format($addressLine1, $addressLine2, $city, $state,
    $postalCode, $country)
  {
    return sprintf("%s\n%s\n%s, %s %s\n%s",
      $addressLine1, $addressLine2, $city, $state, $postalCode, $country);
  }
}
class InlineAddressFormatter implements AddressFormatter
{
   public function format($addressLine1, $addressLine2, $city, $state,
    $postalCode, $country)
  {
    return sprintf("%s %s, %s, %s %s %s",
       $addressLine1, $addressLine2, $city, $state, $postalCode, $country);
  }
}
class AddressFormatUtils
{
  public static function formatAddress($type, $address)
   {
    $formatter = AddressForma

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号