快速业务通道

静态类的原罪

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

  黑格尔有句名言:存在即合理。以此为论据的话,静态类的存在自然有其合理性。不过物极必反,一旦代码过于依赖静态类,其劣化的结局则不可避免。这就好比罂粟作为一种草本植物,有其在药理上的价值,但如果肆无忌惮的大量使用,它就变成了毒品。

  什么是静态类

  所谓静态类指的是无需实例化成对象,直接通过静态方式调用的类。代码如下:

  1. <?php  
  2.  
  3. class Math  
  4. {  
  5.     public static function ceil($value)  
  6.     {  
  7.         return ceil($value);  
  8.     }  
  9.  
  10.     public static function floor($value)  
  11.     {  
  12.         return floor($value);  
  13.     }  
  14. }  
  15.  
  16. ?> 

  此时类所扮演的角色更像是命名空间,这或许是很多人喜欢使用静态类最直接的原因。

  静态类的问题

  本质上讲,静态类是面向过程的,因为通常它只是机械的把原本面向过程的代码集合到一起,虽然结果是以类的方式存在,但此时的类更像是一件皇帝的新衣,所以可以说静态类实际上是披着面向对象的皮儿,干着面向过程的事儿。

  面向对象的设计原则之一:针对接口编程,而不是针对实现编程。这有什么不同?打个比方来说:抛开价格因素,你喜欢独立显卡的电脑还是集成显卡的电脑?我想绝大多数人会选择独立显卡。独立显卡可以看做是针对接口编程,而集成显卡就就可以看做是针对实现编程。如此说来针对实现编程的弊端就跃然纸上了:它丧失了变化的可能性。

  下面杜撰一个文章管理系统的例子来具体说明一下:

  1. <?php  
  2.  
  3. class Article  
  4. {  
  5.     public function save()  
  6.     {  
  7.         ArticleDAO::save();  
  8.     }  
  9. }  
  10.  
  11. ?> 

  Article实现必要的领域逻辑,然后把数据持久化交给ArticleDAO去做,而ArticleDAO是一个静态类,就好像焊在主板上的集成显卡一样难以改变,假设我们为了测试代码可能需要Mock掉ArticleDAO的实现,但因为调用时使用的是静态类的名字,等同于已经绑定了具体的实现方式,Mock几乎不可能,当然,实际上有一些方法可以实现:

  1. <?php  
  2.  
  3. class Article  
  4. {  
  5.     private static $dao = ''ArticleDAO'';  
  6.  
  7.     public static funciton setDao($dao)  
  8.     {  
  9.         self::$dao = $dao;  
  10.     }  
  11.  
  12.     public static function save()  
  13.     {  
  14.         $dao = self::$dao;  
  15.  
  16.         $dao::save();  
  17.     }  
  18. }  
  19.  
  20. ?> 

  有了变量的介入,可以在运行时设定具体使用哪个静态类:

  1. <?php  
  2.  
  3. Article::setDao(''MockArticleDAO'');  
  4.  
  5. Article::save();  
  6.  
  7. ?> 

  虽然这样的实现方式看似

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