5分钟阅读时间 (960字)

快速开发技术 - 防止代码碎片化

Rapid Development Techniques - Preventing Code Fragmentation

如果你在开发行业工作了一段时间,那么你可能有一个大量频繁使用的代码库。它是你的工作腰带,你的公文包,跟随你进入你正在工作的任何项目的附件。你知道,你信任并深爱你的代码库,因为你写了它,并且非常了解它。无论其他开发者是否认为它是符合标准的或 很漂亮,这都是无关紧要的——它工作,所以你可以在任何地方、任何时候使用它。它帮助你遵循我们所有人珍视的编程神圣信条,不要重复自己。

让我为你描绘一个情景

你一直在做一个项目,随着时间的推移,你已经开发了一个强大的代码库。随着时间的推移,你需要为另一个独立的网站创建一个独立的项目。突然间,你需要 两个 代码库的副本,每个项目一个!没问题,你可能会说——我会确保我在一个项目中做出的任何更改,都会在另一个项目中做出。第三个项目?第四个?不。现在,我明确地告诉你,这不会奏效。你可能可以维持几天,但根据我的经验,这很快就会崩溃(如果你添加另一个开发者,我甚至 不会 开始处理这个问题的复杂性——随着你添加的每个程序员的增加,问题呈指数级增长)。建筑崩塌,波形崩溃,海浪上升,国家衰落——你明白我的意思。你的库已经碎片化,变得无用了。

显而易见的解决方案是拥有一个所有项目都使用的单一代码库副本——问题是:我如何包含这些文件,而不会在各个地方都有复杂的require_once语句?如果你像我一样,那么你实际上喜欢使用jimport,这让我感觉我正在使用像Java或.NET这样的基于包的环境。这也清楚地表明了你正在使用哪些类文件以及它们的目录路径。

注意:纯理论派可能会争论jimport是一个全局函数,因此是错误的;确实,jimport不过是JLoader类的包装器,提供了一个快速路径来包含文件,而无需键入JLoader::import()。

您已经决定采用单库解决方案——如何安排以避免修改现有项目的代码以适应新的目录结构?首先,让我们看看您的项目是如何组织的(这里以Linux为例,尽管您也可以轻松地将此方法应用于Windows或Mac)。假设我的开发机器看起来是这样的

/var/www/AlphaProject
/var/www/BetaProject

这两个都是带有我自己自定义库MyLib的完整Joomla安装。

/var/www/AlphaProject/libraries/MyLib
/var/www/BetaProject/libraries/MyLib

注意:我在准备这些说明时使用的是Zend Studio。Eclipse用户应该可以轻松地跟上。

请复制您的库,然后从每个项目的目录结构中删除它。它很快就会有一个新家。在根目录结构中创建一个新的项目,命名为MyLib。为了简化,我将假设这将是我们唯一的库;如果您从多个自定义库中导入,当然可以创建一个通用的库项目,每个库都位于项目内部。

我们的库现在有了新的家——/var/www/MyLib——正等待着被使用。我们如何告诉jimport在必要时指向这个文件夹?为了做到这一点,我们需要进行一个小型的核心修改。

注意:在您因为建议核心修改而形成一支愤怒的群众队伍之前,请知道这个更改只需要在您的开发机器上执行。只要您的生产网站在/site/libraries/的常规目录结构中有库的副本,那么您的生产代码就不需要修改。

导航到joomla/libraries文件夹,打开“loader.php”。该文件负责Joomla!框架中的所有文件加载,因此我们需要教会它如何识别我们的自定义库并给出查找它的指示。我们还需要确保它没有在查找“joomla”库或默认安装中的其他库时遇到任何问题。

滚动到最底部,您会看到臭名昭著的“jimport”函数。jimport的调用如下所示

jimport( 'joomla.application.component.controller' );

第一个部分,“joomla”,是/joomla/libraries目录路径上的库名称。我们需要捕捉这个并检查我们是否在尝试调用自己的库。修改jimport,使其看起来像这样。

function jimport( $path ) {
$parts = explode('.', $path);
if($parts[0] == 'MyLib')
{
return JLoader::import($path, '/var/www');
}
else
{
return JLoader::import($path);
}
}

我们做了什么?

我们捕捉了所有传入的jimport调用并将它们拆分开来,以检查库调用是否针对MyLib。如果不是,我们就直接继续标准的操作程序。然而,如果第一个部分与“MyLib”匹配,我们就将JLoader指向我们的项目目录路径。

jimport( 'MyLib.Views.FormView' );

将被路由到

/var/www/MyLib/Views/FormView.php

注意:如果您想挑战一下,请将jimport()调用重写为保留在autoload注册表中。由于命名惯例不同,目前来自Joomla库之外加载的类没有保留在注册表中。

完成!访问您的开发网站并检查一切是否正常工作,并在将代码推送到生产时,别忘了将库复制回Joomla!安装的库目录。

在Joomla社区杂志上发表的一些文章代表了作者对特定主题的个人观点或经验,可能不代表Joomla项目的官方立场。

0
Joomla!在媒体中的报道/媒体 - 2010年12月
你听说过Joomla!吗?
 

评论

已经注册? 在此登录
尚未发表评论。成为第一个发表评论的人

通过接受,您将访问https://magazine.joomla.net.cn/外部第三方提供的服务