快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
证提供的 $val 变量是否为空、是否是零长度字符串或者字符串是否使用无法解 析的格式。parsePersonName() 方法不返回 Person 对象,但是返回 null。使 用这种方法的管理员或程序员可能会觉得很麻烦 — 至少他们现在需要开 始设置断点并调试 PHP 脚本。

清单 4. 不抛出或处理错误的坏习惯

class PersonUtils
{
  public static function parsePersonName($format, $val)
  {
    if (strpos (",", $val) > 0) {
      $person = new Person ();
      $parts = split(",", $val); // Assume the value is last, first
      $person->setGivenName ($parts[1]);
      $person->setFamilyName($parts[0]);
    }
    return $person;
  }
}

清单 4 中的 parsePersonName() 方法可以修改为在 if 条件外 部初始化 Person 对象,确保总是获得有效的 Person 对象。但是,您得到的是 没有 set 属性的 Person,这仍然没有很好地改善您的困境。

好习惯: 每个模块都处理自己的错误

不要让调用方凭空猜测,而是对参数进行预 先验证。如果未设置的变量无法生成有效的结果,请检查变量并抛出 InvalidArgumentException。如果字符串不能为空或者必须为特定格式,请检查 格式并抛出异常。清单 5 解释了如何在演示一些基本验证的 parsePerson() 方 法中创建异常以及一些新条件。

清单 5. 抛出错误的好习惯

<?php
class InvalidPersonNameFormatException extends LogicException {}
class PersonUtils
{
   public static function parsePersonName($format, $val)
  {
    if (! $format) {
      throw new InvalidPersonNameFormatException("Invalid PersonName format.");
    }
    if ((! isset($val)) || strlen($val) == 0) {
      throw new InvalidArgumentException("Must supply a non-null value to parse.");
    }
  }
}
? >

最终目的是希望人们能够使用您的类,而不必了解其中的工 作原理。如果他们使用的方法不正确或者不是按照期望的方法使用,也不需要猜 测不能工作的原因。作为一个好邻居,您需要知道对您的类进行重用的人并没有 特异功能,因此您需要解决猜测的问题。

避免看到美杜莎

在我最 初了解 OO 概念时,我十分怀疑接口是否真正有帮助。我的同事给我打了个比方 ,说不使用接口就好像看到美杜莎的头。在希腊神话中,美杜莎是长着蛇发的女 怪。凡是看了她一眼的人都会变成石头。杀死美杜莎的珀尔休斯通过在盾上观察 她的影子,避免了变成石头而得以与她对抗。

接口就是对付美杜莎的镜 子。当您使用一个特定的具体实现时,代码也必须随着实现代码的更改而更改。 直接使用实现将限制您的选择,因为您已经在本质上把类变成了 “石头 ”。

坏习惯:不使用接口

清单 6 显示了从数据库中装入 Person 对象的示例。它将获取人员的姓名并返回数据库中匹配的 Person 对象 。

清单 6. 不使用接口的坏习惯

<?php
class DBPersonProvider
{
  public function getPerson($givenName, $familyName)
  {
    /* go to the database, get the person... */
    $person = new Person();
     $person->setPrefix("Mr.");
    $person- >setGivenName("John");
    return $person;
  }
}
/* I need to get person data... */
$provider = new DBPersonProvider();
$person = $provider->getPerson ("John", "Doe");
echo($person->getPrefix ());
echo($person->getGivenName())

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