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

问题描述

| 假设我有一个注册的类加载器。
$loader = new ClassLoader;

$loader->register();
当第二次调用方法“ 1”时,我应该: 引发异常,表明类加载器已被注册 失败 返回布尔状态 如果我要使用选项#1,我还将提供
isRegistered()
方法,以便在第二次调用之前进行一些检查。 处理这种情况的最佳方法是什么? 还有其他更好的选择吗?     

解决方法

        您是否考虑过触发警告或通知之类的内容?
trigger_error(\"ClassLoader already registered\",E_USER_WARNING);
与异常不同,触发错误是在不停止程序执行的情况下查找代码中的缺陷/中断的好方法。您保留回溯并在错误日志中获得一个条目。如果这样的错误(两次注册一个类加载器)正在生产中,您希望它对用户透明(这不是关键),但是会通知程序员。     ,        这取决于该方法在做什么。在这种情况下,如果您正在加载一个类以访问静态方法,那么如果该类已经被加载,我将无提示地忽略该请求。 在这种情况下,无论该类之前是否已加载,程序都将保持相同的状态(要么加载该类,要么不执行任何操作;尽管如此,该类仍将加载)。 如果它是一个具有实例方法/属性的类,那么您就不会失败;相反,您将要创建一个新实例。 在这种情况下,当类已经注册时抛出Exception异常只会为开发人员使用您的代码带来麻烦。但是,如果确实选择引发Exception,则必须在加载类之前提供isRegistered()方法供它们调用。在这种情况下,我肯定会选择#2。     ,        这是我的经验法则: 如果您正在开发其他人可以使用的应用程序,则触发错误(或者更好的是,引发异常)是一种可以通知其他开发人员不必要地重新注册您的类的方法。 但是,如果该代码仅适合您或一小部分熟悉该代码的人,则触发错误似乎过于热情。除非调用寄存器函数需要占用大量处理器资源,否则我会说,只需在寄存器函数开始时通过快速检查返回false即可。     ,        单例或类似单例的方法怎么样?我用它来创建一个全局的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;   
}  
想法是,如果对象存在,则您将对该对象返回相同的引用。如果没有,则创建它。