Voici mes classes:Comment charger des données avec la composition de classe?
class PriceScale
-int ID
-float bookingFees
-Product product
-List<PricePeriod> periods
Class Product
-int ID
-string name
-List<PriceScale> priceScales
class PricePeriod
-DateTime begin
-DateTime end
-float price
-PriceScale scale
Comme vous pouvez le voir, je strictement appliqué les règles métier « Un produit autant de barèmes de prix, et une échelle de prix a beaucoup période ».
Mon problème: par exemple, lorsque je fais affaire avec la classe Product, je n'aime pas me demander "Est-ce que le prix est chargé?" (Parce que je ne vais pas le charger chaque fois que je besoin d'un produit)
Solution:
1/chargement Lazy: Je ne l'aime pas, parce que vous exécutez requête SQL sans même le savoir, et vous pouvez finir avec un problème de requête 1 + n (je travaille sur le système de calcul des prix, donc j'ai vraiment besoin de savoir quelle requête sql est exécutée)
2/Toujours charger: Je ne l'aime pas, parce que si j'applique cette logique à tout ce que je vais finir par charger la base de données entière.
3/Supprimer la composition (ie les priceScales membres), dans ce cas, quelle est la meilleure façon de traiter l'échelle des prix:
obtenir un Dictionnary < int, Liste <PriceScales> > où le clé est l'identifiant du produit?
autre chose?
4/Ajouter au début de ma méthode où je dois les priceScales
checkPriceScalesAreLoaded(productList);
On dirait que le chargement paresseux, mais il est plus explicite.
5/Autre chose que je ne pensais même pas :)
Merci
J'utilise un serveur de base de données SQL et C# .net, comme je l'ai dit que je voudrais éviter le chargement paresseux et ORM de fait parce que: cette partie du système est l'une des plus importantes et je ne sais pas comment utiliser parfaitement un ORM (tel que NHibernate) pour pouvoir éviter une requête n + 1, ou d'autres problèmes de perf (je l'ai essayé dans un panneau d'admin , mais ici je ne suis pas assez confiant). Donc, si vous pensez que ce n'est pas un problème de POO, suggérez-vous que la conception de ma classe est acceptable? –
@remi, oui, votre conception de classe semble fondamentalement OK du point de vue de la POO. La persistance est un problème différent cependant. Je ne connais pas votre plate-forme, donc je ne peux pas vous donner beaucoup de conseils concrets. Mais en général, je crois que développer la persistance pour une application plus grande sans ORM va être un lot de douleur. Donc, je pense qu'investir le temps d'apprendre NHibernate ou une alternative serait rembourser beaucoup au fil du temps. Mais d'autres pourraient avoir de meilleures idées spécifiquement pour votre plate-forme. –
Je ne suis pas d'accord, ce n'est pas seulement un problème de persistance. C'est aussi un problème de mémoire, je ne veux pas mettre 500 Mo de données en mémoire si je veux utiliser seulement 50 Mo. Dans cette partie du logiciel, la requête SQL est peut-être à 75% du temps d'exécution, donc je veux vraiment tout gérer (c'est peut-être une façon de penser d'un orm-noob, et je me trompe certainement). Je vais donc essayer d'améliorer mes connaissances sur NHibernate avec des choses moins importantes, mais pour l'instant je ne veux pas prendre le risque. –