0 votes

Comment introduire des valeurs dénormalisées dans vos Business Objects ?

J'ai deux tableaux.

Commande - Avec les colonnes OrderID, OrderStatusID
OrderStatus - Avec les colonnes OrderStatusID, Description

J'ai un Order Object qui appelle la base de données et remplit ses propriétés pour les utiliser dans mon code. Actuellement, j'ai accès à Order.OrderStatusID, mais dans mon application, j'ai vraiment besoin d'accéder au champ "Description".

Comment gérer cela de manière élégante avec une bonne conception OO ?

2voto

Panos Points 11429

En général, je préfère traiter les recherches comme Objets de valeur . J'utilise également Modèle d'objet nul .

public class Order {
  private int statusID;

  public OrderStatus Status {
    get {
      return OrderStatus.Resolve(statusID);
    }
    set {
      statusID = value != null ? value.ID : null;
    }
  }
}

public class OrderStatus {
   public static OrderStatus Resolve(int statusID)
   {
     OrderStatus status = null;
     // read from cache or DB
     ...
     // if not found return Null object
     if (status == null)
       status = new OrderStatus(null, string.Empty);
     return status;
   }
}

1voto

dragonjujo Points 148

Le système avec lequel je travaille actuellement crée une instance de l'autre objet de gestion et définit l'Id. L'autre objet métier est ensuite récupéré lorsqu'il est utilisé, par exemple

Propriétés de la commande

int OrderId = 5
int OrderStatusId = 3
OrderStatus OrderStatus_ref
{
get
{
    if OrderStatus_ref == null
        OrderStatus_ref = new OrderStatus(OrderStatusId)
    return OrderStatus_ref
}
}

C'est l'idée générale en tout cas.

0voto

Charles Bretana Points 59899

Vous pouvez utiliser une instruction SQL select avec une jointure à la table OrderStatus, et inclure les colonnes que vous voulez de chaque table ...

Select O.OrderId, O.OrderStatusId, S.Descriptiuon
From Order O
    Join OrderStatus S 
        On S.OrderStatusId = O.OrderStatusId
Where OrderId = 23 -- or whatever

0voto

Y a-t-il une relation biunivoque entre Order et OrderStatus ? Je suppose que cela dépend de la raison pour laquelle vous avez une table OrderStatus car je dirais qu'il n'y a pas vraiment besoin d'une table OrderStatus séparée ?

En fait, tout ce que ce tableau vous donne, c'est la possibilité de modifier la description du statut de la commande. Dans le code, vous écrirez alors le code en fonction d'un OrderStatusID prédéfini (à partir des données d'origine ?) ou de la description. Si c'est le cas, pourquoi la table Order ne contient-elle pas une colonne OrderStatus qui est un nombre entier et qui peut correspondre à un type enum ?

0voto

Giovanni Galbo Points 8139

Mon objet Ordre inclurait probablement le champ de description du statut (en lecture seule [pour les classes non internes]), ainsi que tout autre champ similaire.

Sous le capot, mes getters (par exemple LoadByID, LoadAll, etc.) utiliseraient probablement une vue (par exemple OrdersView) qui contient tous ces champs descriptifs. Ces champs de description sont en lecture seule afin d'éviter que vous ne les définissiez accidentellement en pensant pouvoir enregistrer les modifications dans la base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X