2009-10-17 7 views
0

Lorsque vous traitez de grandes collections, laquelle des approches suivantes est la meilleure?C#: objets simples et complexes et utilisation de la mémoire

Classe SimpleObject avec uniquement des champs/propriétés et classe SimpleObjectController qui contient toutes les implémentations de méthode requises par SimpleObject. Au moment de l'exécution, je construis une collection de SimpleObjects, instancie un SimpleObjectController et appelle ses méthodes, passant le SimpleObject avec lequel je veux travailler.

ou

classe "ComplexObject" qui regroupe les SimpleObject et SimpleObjectController dans l'approche traditionnelle OO. Au moment de l'exécution, j'ai une collection de ComplexObjects, parcourez-les, appelez leurs méthodes selon les besoins.

Il m'a été suggéré que la première approche est préférable en termes d'utilisation de la mémoire car tout le code de poids lourd est seulement dans un objet au lieu de chacun dans la collection. Ma compréhension était que si nous avions 1000 de ces objets dans une collection, cela ne signifie pas qu'il y a 1000 implémentations de la même méthode en mémoire. Il y aurait 1000 instances de données, mais elles partageraient l'instance de code (segment de code x86 & segment de données?). Il semble également aller à l'encontre des principes généraux de l'OO et de l'encapsulation.

Répondre

1

Je n'imagine pas qu'il y aurait une différence, en plus d'avoir deux définitions de classe au lieu d'une.

Vous avez raison de penser qu'il n'y a pas 1000 instances des implémentations de méthodes. Une fois compilées, toutes les méthodes deviennent des méthodes "globales" qui ont un argument ComplexObject masqué qui est mappé au mot-clé this en C#.

4

Vous devriez prendre la deuxième approche. Le code n'a pas de coût par instance: il y a une copie du code pour chaque classe, et non chaque instance. Il n'y a donc pas de bénéfice de mémoire pour la première approche. Et vous avez raison, le style OO consiste à mettre les fonctions dans les données, afin de les encapsuler; Si vous avez pris la première approche, quelqu'un pourrait facilement mal manipuler un SimpleObject en travaillant directement avec lui au lieu de passer par les méthodes du contrôleur.