Un collègue et j'ai conçu un système pour nos clients, et à notre avis, nous avons créé un design agréable et très propre. Mais je vais avoir des problèmes avec certains de couplage que nous avons introduit. Je pourrais essayer de créer un exemple de conception qui comprend les mêmes problèmes que notre conception, mais si vous ne pardonnez moi, je vais créer un extrait de notre conception à l'appui de la question.
Nous sommes en train de développer un système pour l'enregistrement de certains traitements pour les patients. Pour éviter d'avoir un lien rompu à l'image que je vais décrire les concepts UML diagramme de classes c# style de la définition de la classe.
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 plus sur le design, 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, le dosage peut varier pour le même médicament (entre autres choses), donc c'est stockée dans le ProtocolMedication classe. AdministrationRoute est la manière dont le médicament est administré et iscreated/mis à jour indépendamment de la gestion du protocole.
J'ai trouvé les endroits suivants que nous allons avoir une violation de la Loi de Déméter:
Les Violations de la Loi de Déméter
À l'intérieur de la BLL
Par exemple, à l'intérieur de la logique métier de l'ProtocolMedication il y a des règles qui dépendent de la AdministrationRoute.Soluble propriété de la médecine. Le code pourrait devenir
if (!Medicine.AdministrationRoute.Soluble)
{
//validate constrains on fields
}
À l'intérieur de l'dépôts
Une méthode qui serait la liste de tous les protocoles dans une certaine Discipline devrait être é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 (pas de MVC) pour l'interface de notre système, à mon avis, cette couche a actuellement les pires violations. Le databinding d'un gridview (une colonne qui doit afficher la Discipline d'un protocole doit se lier à la Nature.De la Discipline.Nom), qui sont des chaînes de caractères, donc pas le temps de compilation des erreurs.
<asp:TemplateField HeaderText="Discipline" SortExpression="Kind.Discipline.Name">
<ItemTemplate>
<%# Eval("Kind.Discipline.Name")%>
</ItemTemplate>
</asp:TemplateField>
Donc, je pense que la véritable question qui est peut-être, quand serait-il bon de regarder cela de plus que la Suggestion de Déméter, et ce qui peut être fait pour résoudre les violations de la Loi de Déméter?
J'ai un peu l'idée de moi-même, mais je vais les poster que des réponses de sorte qu'ils peuvent être commentés et voté separemment. (Je ne suis pas sûr que c'est la façon de le faire, si non, je vais supprimer mes réponses et de les ajouter à la question).