4

私はプログラミングのベストプラクティスを読んでいます.関数を作成するときは、特定のタスクを1つだけ実行する必要があると言われています.

データとそれに関連するデータを取得するモデル関数を取得しました。例:

$this->Student->StudentAssignments();

現在、この関数は、生徒の課題に加えて、各課題の質問と生徒に関するデータを取得します。私はそれらすべてを使用します。私のジレンマは、関連するデータ (学生と質問のデータ) を取得する別の関数を作成しようとすると、DB への呼び出しが増えるため、負担が大きくなることです。

あなたたちは何を提案しますか?

4

3 に答える 3

1

この種のリファクタリングを行うときに覚えておくべきことがあります...

通常、モデルにはModel->getSomethingAndSomethingElse関数があります。これらの関数は公開されており、コントローラーからの複雑な(または任意の)検索呼び出しを行う代わりに呼び出されることを意図しています。

次に、私が通常行うことは、モデル内にプライベート関数の小さなコレクションを構築することです。あなたの場合、私は次のようなものを持っているかもしれません...

Student-> getStudentAssigmentsWithQuestions

次に、いくつかのプライベート関数を呼び出します。

Student->getStudentはStudent->joinStudentAssignmentを呼び出し、次にAssignment->joinAssignmentQuestionなどを呼び出します。

マークダウンがそれらのために物事を太字にしたいので、二重アンダースコアプレフィックスは削除されました。php5を使用している場合、「private」または「proteced」キーワードを使用している限り、アンダースコアは重要ではありません。

基本的に、私はpublicメソッドを、モデル内の非常に特殊なクエリ構築または関連付け構築プライベート関数のグループのコンテナとして使用します。これにより、複雑なデータが返されるAPIを使用できますが、クエリまたは結果セット(データのタイプ、関連する関係、またはクエリの複雑さに応じて)を小さな断片から構築します。これは、理想的には、 1つのパブリック関数呼び出し。

于 2009-12-07T19:42:22.273 に答える
1

私はあなたがうまくやっていると思います。ただし、関数の名前を次のように変更することを再検討する必要があります

$this->Student->getStudentAssignmentsWithQuestions

または、あなたが適切だと思うものは何でも。特定のメソッドで要素の各セットを取得するのではなく、データベースへの呼び出しをできるだけ少なくするようにすべきだと思います (そこのどこかで結合を実行していると思います)。これにより、より多くのメソッドを取得する (したがって、さらにいくつかのテストを作成する必要がある) という事実につながる可能性がありますが、これが正しい方法だと思います。

設計上の議論を弁護するには: あなたのメソッドはただ 1 つのタスクを実行します。各課題の質問で学生の課題を取得します。

于 2009-12-06T12:08:29.143 に答える
0

いいえ、コードのリファクタリングについて厳密に懸念している場合は、そのブロブを、あなたが言ったように単一のタスクを実行するより単純な関数に分解する必要があります。はい、あなたはより多くのデータベースをヒットしますが、cakephp でのキャッシングの操作がいかに簡単かを考えると、パフォーマンスは問題になりません。そうであれば、この時点でコードのリファクタリングについて心配する必要はありません。

于 2009-12-06T22:25:59.920 に答える