一个庞大的类来容纳所有全局范围的变量,还是为"non-atomic"成员分成多个类?



我正在从事我从事过的最大个人项目 - 一个原因是学习该应用程序如何从小型的非目标项目演变为一个庞大的项目 - 依靠必要,并更透彻地了解为什么不同的应用需要某些架构。

我最初认为处理全球范围变量的最佳方法是维护一个整体类实例化所有这些var。

class publicValues {
    public static $globalBoolean = false;
    .
    .
    public static $globalCounter = 0; // roughly 600 variables total at this point
}

这个想法是将所有全局镜变量保持"原子",但我已经遇到了非静态数组的不确定性。(将在下面的虚拟示例中演示)

public static $allAmericanStates = array('Alaska', .....); // atomic array including all states in the U.S.
public static $allCanadianProvinces = array('Alberta',.....); // atomic array including all provinces in Canada
//here's the problem
public static $allAmericanStates_UNION_allCanadianProvinces = array_merge($allCanadianProvinces, $allAmericanStates); // CAN'T DO THIS

因此,我的解决方案是初始化工会(array_merge),交叉点(array_intersection),减法(array_diff),内爆式等。以上):

public static $allAmericanStates_UNION_allCanadianProvinces = '';

然后随后调用一个函数以在原子数组上执行相关操作(覆盖其初始化的空字符串值AS):

function synthesize_remaining_static_vars() {
    publicValues::$allAmericanStates_UNION_allCanadianProvinces = array_merge($allCanadianProvinces, $allAmericanStates); // so if California secedes I only need to remove CA from publicValues::$allAmericanStates
    publicValues::$implodedAllAmericanStates = implode("|", publicValues::$allAmericanStates); // e.g., for use in preg_match()
    //etc.
}

因此,这样的方式可以在一个位置启动所有全局范围var,并且可以使用1个类访问它们(例如, publicValues ,而不是多个非静态类别使用其他类引用VAR)。此外,工会,交叉路口等不需要维护,因为它们只是原子阵列操作的结果。

这可能是一个意见问题,所以我很抱歉。有人在使用一个公共访问类保存所有全球范围变量的方法中看到了任何严重的问题?(WRT代码可维护性,"未来防止"等)

我的建议是为此使用数据库(例如sqlite),因为这本质上是您要模拟的。

虽然我有一些包含这样的整体静态注册表的项目,但维护最终变得不现实 - 尤其是约600个变量。

适当的数据库设置也将缓存中间结果 - 就像您尝试使用$allAmericanStates_UNION_allCanadianProvinces一样。为此,您应该阅读存储过程。这样,您可以将所有优化委托给数据库提供商,并在需要时使用标准命令检索数据。

我经常有一个单身助手类,可以将数据库命令从代码中抽象出来以进行简单检索。

您所描述的是单人:https://en.wikipedia.org/wiki/singleton_pattern

我建议阅读有关设计模式的阅读,以查看Singleton模式的优缺点。将全球变量分布在许多类中并不能减轻具有全局变量的弊端,因此,在这种情况下,如果您必须具有全球变量,那么处理它们的单身人士可能是个好主意。至于您的合并和相交变量,可以在单顿的__ -construct中初始化这些变量,并通过getters访问,或者通过返回合并结果的静态函数。

相关内容

最新更新