2010-10-27 8 views
0

Lors du développement de mon modèle de données, je n'ai pas prêté attention au niveau de base de données sous-jacent. J'ai encapsulé de la logique dans les propriétés de mes classes de domaines (exemple: méthode qui compte le profit de l'ordre). Tout fonctionne bien jusqu'à ce que j'ai besoin de trier les données. Le tri est une fonctionnalité purement basée sur la base de données (principalement en raison des performances que je ne peux pas récupérer toutes les lignes de la table et les trier au niveau de mon domaine).
Il s'avère que je dois répéter la logique, précédemment encapsulée dans mon niveau de domaine au niveau de la base de données (non seulement répéter, mais traduisez-le en langage de base de données).
Cela semble très mauvais et je ne veux pas le faire.
Y at-il un moyen de contourner un tel problème?Tri des données lors d'un développement piloté par domaine

Modifier
exemple de ce que je suis en train de faire:
mon domaine:

class Order { 
    var lines; 

    profit() { 
    return lines.sum(line => line.sellPrice * line.quantity) - 
     lines.takeAllOutcomesAndSum(outcome => outcome.buyPrice * outcome.quantity) 
    } 
} 

class Line { 
    var outcomes; 
    var sellPrice 
} 

class Outcome { 
    var buyPrice; 
    var quantity; 
} 

le problème est quand je veux trier les commandes par le profit, il se trouve à plusieurs jointures et calculs en code sql (qui répète la logique déjà écrite dans la méthode Order.profit()).
Je suis venu en fait idée de stocker des valeurs calculées dans la base de données au lieu de les calculer

+0

vous avez besoin de trier des valeurs différentes? un exemple de simulation de ce que vous faites? – fabrizioM

+0

J'ai ajouté un exemple à mon article – kilonet

+0

Pourquoi ne pas implémenter un calque qui a l'implémentation? Je veux dire, vous pouvez utiliser l'injection de dépendance pour séparer la logique du domaine. – VitorCioletti

Répondre

0

Au lieu de cela:

class Order { 
    lines; 

    profit() { 
    return lines.sum(line => line.sellPrice * line.quantity) - 
     lines.takeAllOutcomesAndSum(outcome => outcome.buyPrice * outcome.quantity) 
    } 
} 

class Line { outcomes; sellPrice }  
class Outcome { buyPrice; quantity; } 

écrire ceci:

class Order { 
    lines; profit; 
    void Order(lines){ 
    profit = lines.sum(line => line.sellPrice * line.quantity) - 
     lines.takeAllOutcomesAndSum(outcome => outcome.buyPrice * outcome.quantity) 
    } 
} 

class Line { outcomes; sellPrice; }  
class Outcome { buyPrice; quantity; } 

Assurez Assurez-vous de le garder valide (mettez-le à jour chaque fois que vous commandez.) et ça devrait aller.

+0

c'est exactement ce que j'ai déjà implémenté. Rédaction de requêtes maintenant facile et directe. Une petite note: j'ai rendu ces objets immuables pour éviter d'éventuelles collisions de données – kilonet

0

Une solution générale consiste à déclarer ce dont vous avez besoin au niveau du domaine et à générer à partir de celui-ci le code de base de données pertinent. Pourquoi vous avez besoin de répéter la logique?