9
votes

C # Principes de base faisant des propriétés atomiques

Il a été donné par Microsoft comme une directive de conception de structure qui Propriétés devrait être indépendant l'un de l'autre et ne pas compter sur une commande spécifique.

Supposons que vous avez une classe triangle qui doit prendre en charge les dimmansions et un calcul de la zone. Comment manifesteriez-vous cela? P>

Ceci est bien sûr la conception considérée comme Gauche car la zone dépend de la base et de la hauteur définie en premier: p> xxx pré>

En supposant que vous utilisiez un constructeur, vous pouvez assurer des valeurs par défaut pour ce cas, mais c'est la bonne approche? P>

class Triangle{
    public Triangle(double b, double h){
        Base = b;
        Height = h;
    }

    public double Base {get;set;}
    public double Height {get;set;}
    public double Area {
        get{
            return (Base * Height) / 2;
        }
    }
}


0 commentaires

5 Réponses :


15
votes

Microsoft essaie vraiment de dire "Ne concevez pas votre classe de telle manière que l'appel des propriétés d'un ordre arbitraire entraînera un comportement inattendu." Les utilisateurs de votre classe ne vous attendent pas à demander une valeur (à l'aide d'une propriété) pour avoir des effets secondaires maladroits.

Cela tombe sous le principe de la moins surprise.

Je pense que c'est une ligne directrice complètement pratique à suivre. Les propriétés ne doivent pas avoir d'effets secondaires inattendus.

Vous montrez une excellente question: "Comment gérez-vous garder vos propriétés indépendantes les unes des autres?". Très soigneusement! J'élimine l'état (et réduisez le nombre de propriétés en conséquence) autant que possible. En outre, l'état de partitionnement en brisant des cours est une autre tactique. Cela ferait une excellente question à lui-même ...

En termes de classe Triangle, je pense que les deux solutions que vous avez présentées dans le code sont valides. Si c'était à moi, je concevrais le triangle de manière à ce qu'il soit immuable et prenait la largeur et la hauteur du constructeur.


0 commentaires

3
votes

Le moyen le plus simple serait d'accepter les valeurs de base et de hauteur uniquement sur le constructeur, puis d'exposer toutes les propriétés en lecture seule: xxx


3 commentaires

Pourquoi voudriez-vous les exposer comme réadonnant? Ensuite, vous ne pouvez pas changer le triangle ... bien sûr, si vous voyez le triangle comme étant un type de valeur (et donc immuable), vous avez un point, mais est-il nécessaire dans cet exemple de faire une valeur de triangle taper ? ... Je pense que le Topicstarter vient d'interpréter mal la ligne directrice. :)


Faites toujours des objets immuables à moins que vous n'ayez une raison impérieuse de ne pas le faire. Triangle est un bon exemple - pourquoi sur Terre voudriez-vous le changer au lieu de créer un nouveau? Ce n'est pas que des objets mutables sont initialement horribles, mais laissez-le tomber un dans un scénario multi-fileté et que vous souhaitez tout d'un coup besoin de la synchronisation sans bonne raison, sauf que le programmeur de l'objet «Triangle» a décidé de programmer avec des setters.


Vous ne pouvez pas utiliser la base comme nom de variable, c'est un mot clé. Il ne peut également pas être un nom de paramètre et un nom de variable de classe



2
votes

Je pense que je voudrais aller pour une classe triangle qui dispose d'un constructeur qui prend la base et la hauteur en tant que paramètres, puisqu'un triangle ne peut pas exister (IMHO) sans base ni taille.

Halledcourse, la propriété de la région a une dépendance à la base et à la hauteur, mais je ne vois pas de problème dans cela? Je pense que la directive MS devrait être interprétée comme suit:

Les propriétés doivent être indépendantes de les uns les autres et ne pas compter sur l'être définir dans n'importe quel ordre spécifique.

SIGNIFICHO - QUE VOUS NE DEVEZ PAS DE LA CONTRAINTE QUE VOUS DEVEZ PREMIER PREMIER DOIT définir la propriété de base, et uniquement lorsque la propriété de base a été définie, vous pouvez définir la propriété Height.
Je pense que c'est ce que c'est ce que l'on entend par la directive ci-dessus.

À côté de cela, votre propriété de votre région n'est pas réglée, il n'y a donc aucun problème à cela. :)


0 commentaires

0
votes

Certaines propriétés seront intrinsèquement liées et codépendantes. Le point est que la base de réglage d'abord, puis la hauteur doit avoir le même effet que la hauteur de réglage, puis la base. Ne pas en configurer l'un d'entre eux, alors la vérification de la zone n'aurait aucun sens.


0 commentaires

0
votes

Choisissez l'option 2. Faites une zone une méthode et appelez-la Calculatearea. Les propriétés doivent être utilisées pour encapsuler l'état et non le comportement. Cette zone peut être calculée à partir de la base et de la hauteur ne signifie pas qu'elle devrait elle-même être l'état; au contraire, il s'agit d'un argument fort que la zone devrait pas em> l'état.

class Triangle
{
    public Triangle(double b, double h)
    {
        Base = b;
        Height = h;
    }

    public double Base { get; set; }
    public double Height { get; set; }

    public double CalculateArea()
    {
        return (Base * Height) / 2;
    }
}


0 commentaires