处理重复方法调用的最佳做法是什么?
假设我有一个类加载器,我想注册。处理重复方法调用的最佳做法是什么?
$loader = new ClassLoader;
$loader->register();
当方法register()
被称为第二次,我应该:
- 抛出一个异常,说明类装载器已经被注册
- 失败默默
- 返回一个布尔状态
如果我要选择#1,我还会提供一个在第二次调用之前,方法提供了一些检查的机会。
处理这种情况的最佳方式是什么?
还有其他更好的选择吗?
您是否认为触发了警告或通知?
trigger_error("ClassLoader already registered", E_USER_WARNING);
与异常不同,触发错误是一种很好的方法,可以在不停止执行程序的情况下查找代码中的缺陷/中断。您保留回溯并在错误日志中获取条目。如果这样的错误(注册一个类加载器两次)投入生产,你会希望它对用户是透明的(这不是关键),但程序员得到通知。
单身人士或单身人士的方法如何?我使用了创建全球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应该没问题。
我决定采用您的解决方案,因为它不会影响程序,但确实为开发人员提供了一种找出问题的方法。 – 2011-06-04 18:13:53