我是try-catch的新手,最近一直在重构很多代码以跟上DRY的原则。但是,我仍然有一些我无法解决的场景。例如,在我正在处理的多语言应用程序中,我想让用户通过在URL的查询字符串中传递双字母国家代码来设置界面语言,或者让应用程序使用默认语言用户没有请求一个:
// Which language shall we use?
$language = new language();
if(isset($_GET['language_code'])){
try {
$language->set_by_language_code($_GET['language_code']);
} catch(e_language_not_found $e){
try {
$language->set_default_language();
// TODO - use 'e_language_not_found' to display an error in the default language
} catch(Exception $e){
exit('No default language found');
}
}
} else {
try {
$language->set_default_language();
} catch(Exception $e){
exit('No default language found');
}
}
问题是,当用户根本没有请求任何语言时,我重复了set_default_language()
块。我怎样才能重构代码,以便在应用程序中只调用一次该方法?谢谢!
答案 0 :(得分:3)
在我看来,您应该在language
类中实现这些方法:
language::hasLanguage()
返回一个布尔值,表示存在语言(不会抛出异常!)
language::getDefLang()
,返回默认语言标识符。
// Which language shall we use?
$language = new language();
// fallback
$langToSet = $language->getDefLang();
// use the passed language identifier if it exists
$passedLangId = isset($_GET['language_code']) ? $_GET['language_code'] : NULL;
if ($passedLangId !== NULL && $language->hasLanguage($passedLangId)) {
$langToSet = $passedLangId;
}
try {
$language->set_by_language_code($langToSet);
}
catch(Exception $e){
exit('No default language found');
}
您还应为Exception
块指定更详细的catch
类型。
您还可以在try...catch
声明中使用language::hasLanguage()
替换if
块。
答案 1 :(得分:2)
你在两个地方调用这个功能的事实本身并不坏。它不会影响性能,重构它可能会降低代码的可读性。
这就是我为你的代码提出的:
// Which language shall we use?
$language = new language();
try {
try {
if(isset($_GET['language_code'])){
$language->set_by_language_code($_GET['language_code']);
} else {
$language->set_default_language();
}
} catch(e_language_not_found $e){
$language->set_default_language();
}
} catch (Exception $e){
exit('No default language found');
}