Comment résoudre les violations de la Loi de Demeter?

un collègue et moi avons conçu un système pour notre client, et à notre avis nous avons créé un design propre. Mais j'ai des problèmes avec un couple que nous avons introduit. Je pourrais essayer de créer un exemple de conception qui inclut les mêmes problèmes que notre conception, mais si vous me pardonnez je vais créer un extrait de notre conception pour soutenir la question.

nous sommes en train de mettre au point un système d'enregistrement de certains traitements pour les patients. Pour éviter d'avoir un lien brisé avec l'image je vais décrivez le diagramme de classe UML conceptuel comme une définition de Classe C# style.

class Discipline {}
class ProtocolKind 
{ 
   Discipline; 
}
class Protocol
{
   ProtocolKind;
   ProtocolMedication; //1..*
}
class ProtocolMedication
{
   Medicine;
}
class Medicine
{
   AdministrationRoute;
}
class AdministrationRoute {}

je vais essayer d'expliquer un peu sur la conception, un protocole est le modèle pour un nouveau traitement. Et un protocole est d'un certain Type et a des médicaments qui doivent être administrés. Selon le protocole, la dose peut différer pour le même médicament (entre autres choses), de sorte que c'est stocké dans la classe de ProtocolMedication. La voie d'administration est la façon dont le médicament est administré et estcréééé/mis à jour. séparément de la gestion du protocole.

j'ai trouvé les endroits suivants que nous aurons une violation de la Loi de Demeter:

Violations de la Loi de Démeter

à l'Intérieur de la BLL

par exemple, à l'intérieur de la logique commerciale du protocole, il y a des règles qui dépendent de la procédure administrative.Propriété Soluble du médicament. Le code deviendrait

if (!Medicine.AdministrationRoute.Soluble)
{
   //validate constrains on fields
}

à l'Intérieur de l'référentiels

Un méthode qui énumérerait tous les protocoles dans une certaine Discipline serait écrite comme:

public IQueryable<Protocol> ListQueryable(Discipline discipline)
{
    return ListQueryable().Where(p => (p.Kind.Discipline.Id == discipline.Id)); // Entity Frameworks needs you to compare the Id...
}

à l'intérieur de l'Interface utilisateur

nous utilisons ASP.NET (no MVC) pour l'interface de notre système, à mon avis, cette couche présente actuellement les plus graves violations. La Banque de données d'une gridview (une colonne qui doit afficher la Discipline d'un protocole doit se lier à Kind.Discipline.Nom), qui sont des chaînes,donc pas de temps de compilation des erreurs.

<asp:TemplateField HeaderText="Discipline" SortExpression="Kind.Discipline.Name">
   <ItemTemplate>
      <%# Eval("Kind.Discipline.Name")%>
   </ItemTemplate>
</asp:TemplateField>

Donc J'Ai pensez à la question actuelle pourrait être, quand serait-il bon de le regarder plus comme la Suggestion de Demeter, et ce qui peut être fait pour résoudre les violations de la Loi de Demeter?

j'ai quelques idées de moi-même mais je les posterai comme réponses pour qu'elles puissent être commentées et votées séparément. (Je ne suis pas sûr que ce soit la façon de le faire, sinon, je vais supprimer mes réponses et les ajouter à la question).

34
demandé sur DGM 2009-01-22 13:16:59

10 réponses