4

私はCode Completeを読んでいますが、その中には、変数を二重の目的で使用しないように警告するステートメントがあります。たとえば、次のようになります。

1) If a variable is a number, it contains error code.
2) If a varibale is array, it contains data.

$text以下のコード スニペットの変数を使用して、プログラムで行っていることはまさにそれです。

$text = $editor->getTextForLinking($data_array['idText']);
if (Arr::is_array($text)) {
    ...
} else {
    Log::instance()->add(Log::Error, $text);
    $this->response->body("Text can't be retrieved");
}

メソッド getTextForLinking() にアクセスできるので、変更できます。二重の目的で望ましくない状況を排除するために、どのように変更できますか?

次のような例外を使用したくありません。

$text = Array();
try {
    $text = $editor->getTextForLinking($data_array['idText']);
} catch(SomeException $e) {
    Log::instance()->add(Log::Error, $text);
    $this->response->body("Text can't be retrieved");
}
4

2 に答える 2

1

getTextForLinking()配列ではない によって返されたものがエラー(ログに記録)と見なされるべきであることは明らかだと思います-したがって、あなたの例がそのような変更を保証することを完全には確信していません。

そうは言っても、送信するデータに関係なく、関数の戻りシグネチャを同じデータtype(配列)に保つことは改善になるかもしれません。このようにして、一貫性が保たれ( の必要性がなくなります$text = Array();)、エラーかどうかに応じて特別なケースを作成する必要がなくなります。

$results = $editor->getTextForLinking($data_array['idText']);
if (empty($results)) { 
  Log::instance()->add(Log::Error, $data_array['idText']);
} else {
  // Handle results array 
}

アップデート

関数内でエラー メッセージを設定している場合、これは単一責任の原則(関数/メソッドは 1 つのジョブのみを持つ必要がある) に違反しています。に関する限り$editor->getTextForLinking()、エラーの戻りを処理せずに、常にテキストの配列を返します。

エラー メッセージは、コンテキスト(メソッドが使用される場所) によって異なります。ある時点で空の配列が無効な場合は、上に示したように、関数の外側でエラー (メッセージ) を処理/設定します。

このようにする$editorと、返された結果の有効性を認識できなくなり、空の配列がエラーと見なされない他の場所で関数を再利用できるようになります。

于 2013-10-07T10:13:00.057 に答える