0

私はOpenCartとphpBBエンジンのソースを読んでいて、1つのパラメーターだけが異なる、コードが繰り返された文字列(フルスクリーンリストの場合もある)がたくさんあることに気づきました。そのような:

$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);

あなたはとにかくパラメータを書き出しているので、私が上に示したようなものよりもあなたのコードに1つの利点を見ることができません。さらに、これはわずか3行のコードであるのに対し、あなたのコードは11行であり、私のコードはすぐに読み取ることができます。

作成するコードの99.9%で、evalなしで作成できます。evalが理にかなっているいくつかのコーナーケースがありますが、これまでの5年間のphpのコーディングでは、おそらく1〜2回使用しました。コードに戻ると、おそらく書き直すことができたので、そうではありませんでした。

あなたが書いたコードでプロジェクトを維持しなければならないとしたら、私は髪を引き裂いてしまうでしょう。OpenCartが書いたものを見て、あなたが書いたものを見てください。どちらがわかりやすいですか?私は実際にあなたのコードを数回見て、それが何をしているのかを理解する必要があります。OpenCartコードをざっと見て、何が起こっているのかを即座に理解することができます。

于 2012-08-25T03:42:09.057 に答える
1

保守性(それが一言で言えば)は小さな懸念かもしれません。不必要に複雑に見えるので、私はそのような構成を軽蔑します。私は多くの--a--Web開発者として機能する不十分に設計されたphpサイトを継承しており、ほとんどの場合、上記のようなvar割り当てのリストをスプールしなければならないのは厄介だと考えられていることを思い出すことができます。しかし、繰り返し入力することの平凡さを逃れようとする奇妙な怠惰な関数に対処しなければならないことに、私は腹を立てるでしょう。

結局、あなたは処理のためにほんの一瞬について話しているので、それはこのようなことをするための議論ではほとんどありません。また、マイクロ秒が問題になる場合は、キャッシュメカニズムを使用してフラットテキストに書き込み、すべての冗長な処理をまとめて消去します。

ねえ、私の2セント。それがあなたのプロジェクトであり、他の誰かがそれを維持することを期待していない場合は、自分をノックアウトしてください。

于 2012-08-25T03:42:01.057 に答える