Php 你会在这里使用战略模式吗?
此代码是否适合策略模式Php 你会在这里使用战略模式吗?,php,design-patterns,Php,Design Patterns,此代码是否适合策略模式 public function isValidEmail($email, $organization) { switch ($organization) { case 'USAF': case 'Army': case 'USMC': case 'Navy': case 'SOCOM': return (preg_match('/[.]mil$/i', $
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而不返回电子邮件逻辑的两个奇怪的情况有点困惑
interface ValidInterface
{
public function isValid($email);
}
您的验证器界面走上了正确的轨道(我会给它起个更有意义的名字,比如
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;
}
我认为这里的相关设计模式是责任链。它本质上是switch语句的面向对象版本。您有一个对象列表(或树)。他们每个人都有能力决定是否应该处理问题(相当于“案例”陈述)。如果他们不这样做,决策将传递给继任者(下一个“案例”陈述)。您可能有也可能没有一个catch-all,相当于“default:”语句 那么,为什么要使用责任链而不是switch语句或提议的字符串到对象的映射呢
我认为它们是实现相同目标的具体实现。更通用的实现可能会为您提供更多的自由度或类型安全性。switch解决方案对每种情况下可以放入的代码数量/可以可靠地处理和维护的情况数量施加了非常实际的限制。举个例子:在你的代码中,state/gov的分支相当复杂,把它放在一个对象或一个方法中会清除大量的代码。你不需要在
返回后中断。使用\.
而不是[.]
。我很抱歉地说,责任链与此无关,我想进一步说明你为什么这么认为?这是这类问题的一般解决方案,但由于我所说的原因,它可能有些过分。您的TrueEmailValidator::isValid()
和false EmailValidator::isValid()
方法看起来如何?他们是否仍然遵循界面并接受$email
参数,然后忽略它并分别返回true/false?这就是我最初所走的道路,但我质疑这种忽略这些参数的非常具体的方法。这被认为是好的做法吗?@veilig:是的,他们会忽略$email
。这种方法没有本质上的错误——拥有接口的整个想法是,你不在乎它是如何实现的。