Pergunta

Estou lendo programação melhores práticas e diz-se que ao criar uma função que devemos fazê-lo fazer um único single tarefa específica.

Eu tenho funções modelo que os dados recupera e é dados relacionados. Exemplo:

$ this-> Student> StudentAssignments ();

Atualmente esta função recupera atribuições do aluno mais a questão para cada atribuição e dados sobre o aluno. Eu usá-los todos. Meu dilema é se eu tentar fazer funções separadas que recupera os dados relacionados (datas de estudantes e pergunta) é tributar desde que eu estou produzindo mais chamadas para o DB.

O que vocês sugerem?

Foi útil?

Solução

Algo para se manter em mente ao fazer esse tipo de refatoração ...

Eu normalmente terá uma série de funções Modelo-> getSomethingAndSomethingElse em meus modelos. Estas funções são públicos e destina-se a ser chamado como um substituto para fazer complicado (ou qualquer) encontrar chamadas a partir do controlador.

O que eu normalmente irá fazer é, então, construir uma pequena coleção de funções privadas no modelo. No seu caso eu poderia ter algo ao longo das linhas de ...

Student> getStudentAssigmentsWithQuestions

que, em seguida, chama algumas funções privadas i.e.

Student> getStudent que possam pôr Student> joinStudentAssignment que por sua vez poderia chamar Assignment-> joinAssignmentQuestion etc.

Os prefixos sublinhado duplo foram removidos desde desejos remarcação para coisas ousadas por causa deles. Se você estiver usando php5 os sublinhados não são realmente importantes de qualquer forma, desde que você use as palavras-chave ou "proteced" "privadas".

Basicamente eu uso o método público como um recipiente para um grupo de edifício de consulta muito específico ou associação construção de funções privadas dentro dos modelos. Isso me permite ter uma API que tem dados complexos voltou, mas eu construir a consulta ou o conjunto de resultados (dependendo do tipo de dados, relações envolvidas ou complexidade consulta) a partir de pequenos pedaços - que pode ser idealmente propôs e usado em mais de uma chamada de função pública.

Outras dicas

Eu acho que você está indo bem. Mas você deveria reconsiderar renomear sua função para

$this->Student->getStudentAssignmentsWithQuestions

Ou o que você acha que se encaixam. Eu acho que um deve tentar fazer o menor número de chamadas para o banco de dados possível (eu suponho que você está realizando uma junção em algum lugar lá), em vez de buscar cada conjunto de elementos por métodos específicos. Isso pode levar ao fato de que você vai ter mais métodos (e, portanto, tem que escrever mais alguns testes), mas acho que este é o caminho certo para fazê-lo.

Para defender o argumento de design: Seu método faz apenas uma tarefa simples; ele busca atribuições dos alunos com perguntas de cada atribuição.

Não, se você está estritamente preocupados com código de refatoração você deve quebrar que blob em funções mais simples que realizam uma única tarefa, como você disse. Sim, você vai bater mais seu banco de dados, mas considerando o quão fácil é trabalhar com o cache em cakephp, o desempenho não deve ser um problema. E se é, então você não deve se preocupar com a refatoração de código neste momento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top