Pregunta

Estoy leyendo mejores prácticas de programación y se dice que cuando se crea una función que deberíamos hacer que haga una única tarea específica sola.

Tengo funciones modelo que recupera datos y está relacionado con los datos. Ejemplo:

$ this-> Student> StudentAssignments ();

Actualmente esta función recupera las tareas del estudiante, además de la cuestión para cada asignación y datos sobre el estudiante. Yo los utilizo. Mi dilema es que si trato de hacer que las funciones separadas que recupera los datos relacionados (datas más de los estudiantes y de interrogación) se gravan ya que estoy produciendo más llamadas a la base de datos.

¿Qué le sugeriría chicos?

¿Fue útil?

Solución

Algo a tener en cuenta a la hora de hacer este tipo de refactorización ...

Me normalmente tendrá un Modelo-> getSomethingAndSomethingElse funciones en mis modelos. Estas funciones son públicas y destinado a ser llamado como un sustituto para hacer complicado (o cualquier) encontrar las llamadas desde el controlador.

Lo que por lo general voy a hacer es entonces construir una pequeña colección de eventos privados en el modelo. En su caso puede ser que tenga algo en la línea de ...

Student> getStudentAssigmentsWithQuestions

a continuación, que llama a algunos funciones es decir privado.

Student> getStudent que pudiera poner Student> joinStudentAssignment que a su vez podría llamar Asignación del> joinAssignmentQuestion etc.

Los prefijos doble guión se han retirado ya de rebajas quiere cosas audaces a causa de ellos. Si está usando php5 los guiones no son realmente importantes de todos modos, siempre y cuando se utilizan las palabras clave o "privadas" "proteced".

Básicamente utilizo el método público como contenedor de un grupo de construcción de consultas muy específicas o asociación construir funciones privadas dentro de los modelos. Esto me permite tener una API que ha regresado de datos complejas, pero la construcción de la consulta o el conjunto de resultados (en función del tipo de datos, relaciones involucradas o la complejidad de la consulta) a partir de piezas pequeñas - que idealmente puede ser propuesto y utilizado en más de una llamada a la función pública.

Otros consejos

Creo que lo estás haciendo bien. Pero se debe reconsiderar el cambio de nombre de su función para

$this->Student->getStudentAssignmentsWithQuestions

o lo que crea conveniente. Creo que hay que tratar de hacer el menor número de llamadas a la base de datos como sea posible (supongo que se está realizando una unión en algún lugar de allí), en lugar de ir a buscar cada conjunto de elementos por métodos específicos. Esto puede conducir al hecho de que usted va a obtener más métodos (y por lo tanto tiene que escribir algunas pruebas más), pero creo que esta es la forma correcta de hacerlo.

Para defender el argumento del diseño: Su método no sólo una sola tarea; se obtiene asignaciones de los estudiantes con preguntas de cada asignación.

No, si usted es estrictamente preocupados por código de refactorización debe romper esa burbuja en funciones más simples que realizan una sola tarea como usted ha dicho. Sí, puede golpear más su base de datos pero teniendo en cuenta lo fácil que es trabajar con el almacenamiento en caché en cakephp, el rendimiento no debería ser un problema. Y si lo es, entonces usted no debe preocuparse por la refactorización de código en este punto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top