处理重复方法调用的最佳做法是什么?

问题描述:

假设我有一个类加载器,我想注册。处理重复方法调用的最佳做法是什么?

$loader = new ClassLoader; 

$loader->register(); 

当方法register()被称为第二次,我应该:

  1. 抛出一个异常,说明类装载器已经被注册
  2. 失败默默
  3. 返回一个布尔状态

如果我要选择#1,我还会提供一个在第二次调用之前,方法提供了一些检查的机会。

处理这种情况的最佳方式是什么?

还有其他更好的选择吗?

您是否认为触发了警告或通知?

trigger_error("ClassLoader already registered", E_USER_WARNING); 

与异常不同,触发错误是一种很好的方法,可以在不停止执行程序的情况下查找代码中的缺陷/中断。您保留回溯并在错误日志中获取条目。如果这样的错误(注册一个类加载器两次)投入生产,你会希望它对用户是透明的(这不是关键),但程序员得到通知。

+0

我决定采用您的解决方案,因为它不会影响程序,但确实为开发人员提供了一种找出问题的方法。 – 2011-06-04 18:13:53

单身人士或单身人士的方法如何?我使用了创建全球Smarty对象:

在config.php:

$GLOBALS['config']['SmartyObj']  = 0; 

在你utils.php中(或任何你想使用):

function smartyObject() 
{ 
    if ($GLOBALS['config']['SmartyObj'] == 0) 
    { 
     $smarty = new SmartyGame(); 
     $GLOBALS['config']['SmartyObj'] = $smarty; 
    } 
    else 
     $smarty = $GLOBALS['config']['SmartyObj']; 
    return $smarty; 
} 

的想法是如果该对象存在,则返回与该对象相同的引用。如果没有,你创建它。

这取决于该方法在做什么。在这种情况下,如果你正在加载一个类来访问静态方法,如果这个类已经被加载,我会默默地忽略这个请求。

在这种情况下,程序将保持相同的状态,无论该类是否在之前加载过(无论是加载类还是什么都不做,类将被加载)。

如果它是一个带有实例方法/属性的类,那么你不会想失败;相反,你会想创建一个新的实例。

在这种情况下,当类已经注册时抛出一个Exception只会为使用您的代码的开发人员造成麻烦。但是,如果你选择抛出一个异常,你提供一个isRegistered()方法让他们在加载类之前调用​​。尽管如此,我一定会和#2 一起在这种情况下使用

这是我的经验法则: 如果你正在开发一个别人将建立的应用程序,触发错误(或更好的是,抛出异常)是通知同伴开发者他们不必要地重新注册的可接受方式你的班。然而,如果代码只是为了你或者一小部分熟悉代码的人,触发错误似乎过分热衷。除非调用寄存器函数是处理器密集型的,否则我会说在返回寄存器函数开头的快速检查中返回false应该没问题。