2

関数を複数行ではなく 1 行にすると害はありますか? たとえば、PDO データベース接続用のクラス ファイルを作成しました。私が書いたすべての関数は一行です。まだエラーは発生していませんが、ラグなどがあるとエラーが発生する可能性はありますか?

ここにいくつかの機能があります。

public function getObject($query, $object) {
  return $this->db->prepare("$query")->execute()->fetch(PDO::FETCH_OBJ)->$object;
}

public function getArray($query) {
  return $this->db->prepare("$query")->execute()->fetchAll(PDO::FETCH_NUM);
}

public function insertArray($query, $array) {
  return $this->db->prepare("$query")->execute($array);
}

これは最終的に問題に遭遇しますか?それとも、あたかも自分のラインにいるかのように、一度に 1 つのセクションに呼び出されますか?

ありがとう。

4

3 に答える 3

5

このように1行でチェーンメソッドを使用する

return $this->db->prepare("$query")->execute()->fetch(PDO::FETCH_OBJ)->$object;

これは、Robert MartinがClean Code (pg 98/99)で「Train Wrecks」と呼んでいるものです。読みにくく、「一般的にずさんであると考えられている」ため、より読みやすくするために避ける必要があります。

$statement = $this->db->prepare("$query");
$statement->execute();
$result = $statement->fetch(PDO::FETCH_OBJ);
return $result->$object;

上記のスニペットのコードを修正したことに注意してください。ブール値を返すため、ワンライナーが機能しないため、それを呼び出すことができません。executefetch

bool PDOStatement::execute ([ array $input_parameters ] )

つまり、とにかくこれを 1 行のステートメントとして記述することはできません。

また、メソッドチェーンは、次のように述べているデメテルの法則に違反することが非常に多いことに注意してください。

オブジェクト O のメソッド M は、次の種類のオブジェクトのメソッドのみを呼び出すことができます。

  • 〇そのもの
  • M のパラメーター
  • M 内で作成/インスタンス化されたオブジェクト
  • O の直接コンポーネント オブジェクト
  • M のスコープ内で、O からアクセスできるグローバル変数

通常、LoD に従わないと、UnitTests で Mockfest が発生し、アプリケーションが必要以上に多くのクラスに密結合されます。これにより、再利用性が損なわれ、変更に必要な時間が増加します (とりわけ)。

于 2012-05-13T10:55:19.867 に答える
1

命令型コードは、常に予想される順序で呼び出されます。コードが読めるかどうかを除いて、心配することは何もありません。行が非常に長い場合は、複数の行に折り返すことをお勧めしますが、表示されている例は私には問題ないように見えます。

于 2012-05-13T10:32:21.170 に答える
0

データベースへの接続が何らかの理由で失敗した場合、オブジェクトの 1 つが false を返すため、FATAL_ERROR が発生する可能性があります。

于 2012-05-13T10:34:03.247 に答える