0

我正在阅读 OpenCart 和 phpBB 引擎的源代码,并注意到有很多字符串(有时是全屏列表)带有重复的代码,它们仅在一个参数上有所不同。如:

$this->data['button_cart'] = $this->language->get('button_cart');
$this->data['button_wishlist'] = $this->language->get('button_wishlist');
$this->data['button_compare'] = $this->language->get('button_compare');
$this->data['button_continue'] = $this->language->get('button_continue');

我正在考虑使用函数来使用模式生成代码,然后eval()是它。

一些这样的功能:

function CodeGenerator($patern, $placements_arr){
    $echo_str = '';
    foreach($placements_arr as $placement){
        $echo_str .= str_replace('=PATERN=', $placement, $patern);
    }
    if(substr($echo_str, -1)!==';'){
        $echo_str .= ';'; # for correct eval() working
    }
    return $echo_str;
}

然后对于具有相同模式的大量重复代码块:

$patern = "$this->data['=PATERN='] = $this->language->get('=PATERN=');";
$placements_arr = array('button_cart', 'button_wishlist', 'button_compare', 'button_continue');
$echo_str = CodeGenerator($patern, $placements_arr);
eval($echo_str);

我想了解这种设计的PRO和CONTRA,因为我正在考虑在我未来的发展中使用这种设计。

我现在在这里看到的唯一问题 - 执行速度有点慢。还有其他人吗?

4

2 回答 2

3

好吧,对于您展示的代码块,您可以像这样重写它

$params = array('button_cart', 'button_wishlist', 'button_compare', 'button_continue');

foreach($params as $param)
   $this->data[$param] = $this->language->get($param);

无论如何,您都在写出参数,因此我看不出您的代码比我上面显示的代码有什么好处。另外,这只有 3 行代码,而你的代码只有 11 行,而且我的代码可以立即阅读

在你编写的 99.9% 的代码中,你可以在没有 eval 的情况下编写它。在某些极端情况下 eval 是有意义的,但到目前为止,在我 5 年的 php 编码中,我可能已经使用过一两次,如果我回到代码中,我可能会重写它,所以它没有。

如果我必须使用您编写的代码来维护一个项目,那我会抓狂的。看看 OpenCart 写了什么,看看你写了什么。哪一个更容易理解?实际上,我必须多次查看您的代码才能了解它在做什么,我可以浏览 OpenCart 代码并立即了解正在发生的事情。

于 2012-08-25T03:42:09.057 回答
1

可维护性 - 如果这是一个词 - 可能是一个小问题。我会鄙视这样的结构,因为它看起来不必要地复杂。作为 Web 开发人员,我继承了许多设计不佳的 php 站点,并且在几乎为零的情况下,我记得必须通过上面的 var 分配列表进行假脱机被认为是一件令人讨厌的事情。然而,我会因为不得不处理奇怪的懒惰函数而变得愤怒,这些函数试图逃避重复输入的陈词滥调。

最后,您谈论的是几分之一秒的处理时间,因此这几乎不是做这样的事情的论据。如果微秒是一个问题,请使用缓存机制写入纯文本并一起消除所有冗余处理。

嘿,我的 2 美分。如果这是您的项目,并且您不希望其他人来维护它,那么请自己淘汰。

于 2012-08-25T03:42:01.057 回答