0

このコードは戦略パターンに適していますか?

public function isValidEmail($email, $organization)
{   
    switch ($organization) {
        case 'USAF':
        case 'Army':
        case 'USMC':
        case 'Navy':
        case 'SOCOM':
            return (preg_match('/[.]mil$/i', $email) === 1);
            break;

        case 'Federal Gov.':
            return (preg_match('/[.]gov$/i', $email) === 1);
            break;

        case 'State/Local Gov.':
            $regionCollection = Mage::getModel('directory/region')
                ->getResourceCollection()
                ->addCountryFilter(array('US'))
                ->load();

            $stateAbbr = array();

            // Cycle through state abbreviations for match
            foreach ($regionCollection as $region) {
                $stateAbbr[] = strtolower($region->getCode());
            }
            $states = implode('|', $stateAbbr);

            return (preg_match("/[\.|@]{1}($states){1}\.us$/i", $email) ===
            break;

        case 'USCG':
        case 'DOD':
        case 'Defense Industry':
            return true;
            break;

        default:
            return false;
            break;
    }
    // It got past somehow?
    return false;
}

検証メソッドを定義するための単純なインターフェイスを使用できると想定していましたが、switch ステートメントで true/false を返し、電子メール ロジックがない場合の 2 つの奇妙なケースを処理する方法について少し混乱しています。

interface ValidInterface
{
    public function isValid($email);
}
4

2 に答える 2

2

あなたはバリデーターインターフェースで正しい軌道に乗っています(私はそれをより意味のある名前にしますEmailValidator). 次に、バリデーターへの組織のマッピングを作成し、検証の実行時にこれを検索できます。

private $validators = array(
  'USAF' => new MilitaryEmailValidator(),
  'Army' => new MilitaryEmailValidator(),
  ...
  'Defense Industry' => new TrueEmailValidator()
);

public function isValidEmail($email, $organization) {
  if (isset($this->validators[$organization]))
    return $this->validators[$organization])->isValid($email);

  // default return
  return false;
}
于 2012-08-28T02:33:47.820 に答える
0

ここで関連するデザインパターンはChainofResponsibilityだと思います。これは本質的に、switchステートメントのオブジェクト指向バージョンです。オブジェクトのリスト(またはツリー)があります。それぞれに、問題を処理する必要があるかどうかを判断する機能があります(「case」ステートメントと同等)。そうでない場合、決定は後継者に渡されます(次の「case」ステートメント)。「default:」ステートメントと同等のキャッチオールがある場合とない場合があります。

では、switchステートメントや提案された文字列からオブジェクトへのマップの代わりにChain of Responsibilityを使用するのはなぜですか?

私は、それらが同じことを達成する特定の実装であることを提出します。より一般的な実装では、より多くの自由度または型の安全性が得られる可能性があります。スイッチソリューションは、各ケースに配置できるコードの量/確実に処理および保守できるケースの数に非常に現実的な制限を課します。適切な例:コードでは、state / govのブランチは非常に複雑であり、それをオブジェクトまたはメソッドに配置すると、コードがかなりクリーンアップされます。

于 2012-08-28T05:08:57.913 に答える