D'écrire des noms, des verbes, des adjectifs, est une bonne approche, mais je préfère penser que la classe de la conception que de poser la question de quelles données doivent être cachés?
Imaginez que vous avez un Query
objet et un Database
objet:
L' Query
objet de vous aider à créer et stocker une requête -- magasin, est la clé ici, car une fonction peut vous aider à créer un tout aussi facilement. Peut-être que vous pourriez rester: Query().select('Country').from_table('User').where('Country == "Brazil"')
. Il n'importe pas exactement la syntaxe -- c'est votre travail! - la clé est l'objet est de vous aider à cacher quelque chose, dans ce cas, les données nécessaires au stockage et à la sortie d'une requête. La puissance de l'objet vient de la syntaxe de l'utiliser (dans ce cas, certaines intelligent chaînage) et n'ayant pas besoin de savoir ce qu'il stocke pour le faire fonctionner. Si c'est bien fait l' Query
objet peut en sortie de requêtes pour plus d'une base de données. En interne serait de stocker un format spécifique, mais pourrait facilement convertir vers d'autres formats lors de la sortie (Postgres, MySQL, MongoDB).
Maintenant, nous allons réfléchir à l' Database
objet. Qu'est-ce cacher et de les stocker? Bien évidemment il ne peut pas stocker la totalité du contenu de la base de données, depuis c'est pourquoi nous avons une base de données! Alors quel est le point? Le but est de cacher la façon dont la base de données fonctionne de personnes qui utilisent l' Database
objet. Bon les classes de simplifier le raisonnement lors de la manipulation de l'état interne. Pour cette Database
objet, vous pouvez le cacher comment la mise en réseau des appels, ou un lot de requêtes ou de mises à jour, ou de fournir une couche de mise en cache.
Le problème, c'est ce Database
objet est ÉNORME. Il représente l'accès à une base de données, sous les couvertures, il pourrait faire tout et n'importe quoi. Clairement mise en réseau, la mise en cache, et le dosage sont très difficiles à traiter en fonction de votre système, afin de les cacher loin serait très utile. Mais, comme beaucoup de gens remarque, une base de données est incroyablement complexe, et la poursuite de la crue DB appels que vous obtenez, plus il est difficile d'optimisation de performances et de comprendre comment les choses fonctionnent.
C'est la base de compromis de la programmation orientée objet. Si vous choisissez le bon abstraction il rend la programmation plus simple (String, Array, Dictionnaire), si vous choisissez une abstraction qui est trop gros (Base de données, EmailManager, NetworkingManager), il peut devenir trop complexe pour vraiment comprendre comment il fonctionne, ou à quoi s'attendre. Le but est de masquer la complexité, mais une certaine complexité est nécessaire. Une bonne règle de base est de commencer en évitant Manager
objets, et, au lieu de créer des classes qui sont comme structs
-- tout ce qu'ils font est de maintenir des données, avec certaines méthodes d'aide à la création/manipuler les données pour rendre votre vie plus facile. Par exemple, dans le cas d' EmailManager
commencer avec une fonction appelée sendEmail
qui prend un Email
objet. C'est un point de départ simple et le code est très simple à comprendre.
Quant à votre exemple, pensez à ce que les données doivent être ensemble pour calculer ce que vous cherchez. Si vous avez voulu savoir dans quelle mesure un animal était en train de marcher, par exemple, vous pourriez avoir AnimalStep
et AnimalTrip
(collection de AnimalSteps) des classes. Maintenant que chaque Voyage a tous les Étape de données, alors il devrait être en mesure de comprendre des choses sur elle, peut - AnimalTrip.calculateDistance()
de sens.