Question

Je lis les meilleures pratiques de programmation et il est dit que lors de la création d'une fonction que nous devons faire faire une seule tâche spécifique unique.

Je suis fonctions modèle qui récupère les données et ses données connexes. Exemple:

$ this-> Student-> StudentAssignments ();

Actuellement, cette fonction récupère les affectations des élèves plus la question pour chaque mission et des données sur l'étudiant. Je les utilise tous. Mon dilemme est de savoir si j'essaie de faire des fonctions distinctes qui récupère les données connexes (données étudiants et question), il est depuis taxant je produis plus d'appels à la DB.

Qu'est-ce qui vous les gars suggérer?

Était-ce utile?

La solution

Quelque chose à garder à l'esprit lorsque vous faites ce genre de refactoring ...

En général, je vais avoir une fonction Modèle-> getSomethingAndSomethingElse dans mes modèles. Ces fonctions sont publiques et destinées à être appelé comme substitut pour le faire compliqué (ou tout autre) trouver des appels du contrôleur.

Ce que je vais généralement faire est de construire alors une petite collection de fonctions privées dans le modèle. Dans votre cas, je pourrais avoir quelque chose le long des lignes de ...

Student-> getStudentAssigmentsWithQuestions

qui appelle ensuite certaines fonctions privées i.e..

Student-> getStudent qui pourrait appeler Student-> joinStudentAssignment qui à son tour pourrait appeler Assignment-> joinAssignmentQuestion etc.

Les doubles préfixes underscore ont été enlevés depuis démarquage veut des choses audacieuses à cause d'eux. Si vous utilisez php5 les underscores ne sont pas vraiment important de toute façon aussi longtemps que vous utilisez les « privés » ou « proteced » mots-clés.

En fait, j'utiliser la méthode publique en tant que conteneur pour un groupe de construction ou d'une association de recherche très spécifique construction des fonctions privées dans les modèles. Cela me permet d'avoir une api qui a des données complexes sont revenus, mais je construire la requête ou le jeu de résultats (en fonction du type de données, les relations en cause ou de la complexité de la requête) de petits morceaux - qui peuvent idéalement être purposed et utilisé dans plus de un appel de fonction publique.

Autres conseils

Je pense que vous faites bien. Mais vous devriez revoir renommer votre fonction

$this->Student->getStudentAssignmentsWithQuestions

Ou tout ce que vous jugerez. Je pense que l'on devrait essayer de faire comme quelques appels à la base de données que possible (je suppose que vous effectuez une jointure quelque part là-dedans), au lieu d'aller chercher chaque ensemble d'éléments par des méthodes spécifiques. Cela peut conduire au fait que vous aurez plus de méthodes (et doivent donc écrire d'autres tests), mais je pense que cela est la bonne façon de le faire.

Pour défendre l'argument de la conception: Votre méthode ne fait qu'une seule tâche; il va chercher les missions des élèves aux questions chaque affectation.

Non, si vous êtes strictement préoccupé par le code que vous refactorisation devez briser cette blob en fonctions plus simples qui effectuent une seule tâche que vous avez dit. Oui, vous frapperez plus votre base de données, mais compte tenu de la facilité est de travailler avec la mise en cache dans CakePHP, la performance ne devrait pas être un problème. Et si elle est, alors vous ne devriez pas vous soucier de refactorisation de code à ce stade.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top