1

私はtry-catchを初めて使用し、DRYの原則に対応するために、最近多くのコードをリファクタリングしています。ただし、まだうまくいかないシナリオがいくつかあります。たとえば、私が取り組んでいる多言語アプリケーションでは、URLのクエリ文字列に2文字の国コードを渡してユーザーがインターフェイス言語を設定できるようにしたい、またはアプリケーションがデフォルトの言語を使用できるようにしたい場合ユーザーがリクエストしていません:

// 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()問題は、ユーザーが言語をまったく要求していないときにブロックを繰り返したことです。アプリケーションでそのメソッドを1回だけ呼び出すように、コードをリファクタリングするにはどうすればよいですか?ありがとう!

4

2 に答える 2

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

于 2013-02-27T22:39:59.220 に答える
2

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');
}
于 2013-02-27T22:40:25.180 に答える