8
votes

Est-ce que cela brise mon principe solide?

J'essaie d'apprendre de meilleures pratiques de programmation en utilisant des principes solides. Ici, je travaille sur un exemple d'application de formes. Je veux juste savoir, suis-je brisant le principe n'importe où.below est des cours et son code.

1. Classe de base - forme xxx

2. Classes pour formes comme rectangle, triangle, etc. Mise en œuvre de la forme de la classe de base. xxx

3. Une classe d'usine qui retourne la forme. xxx

jusqu'à ce que tout semble bien et c'est bien, mais le problème se produit lorsque je l'ai impliqué. Je suis peu confus ici. Permet de voir le code avant d'abord: xxx

questions

  1. Différentes formes a des propriétés différentes comme le cercle a un rayon, le triangle a une base et une hauteur, etc., j'ai donc décidé de garder mes propriétés en classe enfant. Je savais que je peux avoir cela comme membre virtuel de ma classe de base. Alors, y a-t-il un moyen autre que codé ci-dessus.

  2. sinon, alors quelle est l'utilisation de la classe abstraite, si je suis toujours en train de taper mon objet de forme pour encercler l'objet? Je peux utiliser simple cercle c = nouveau cercle (). Je ne veux pas de chèques indésirables comme (si c est Circle) et tout.

  3. Et si, je suis invité à mettre en œuvre une nouvelle méthode pour obtenir la circonférence d'un cercle. Dois-je créer une nouvelle classe abstraite ou la mettre en classe de cercle. Mais si je mets ça cercle, je pense qu'il va briser tout premier principe de Solid I.e. SRP . Veuillez noter que ma classe abstraite n'est pas une classe de graisse ayant des propriétés inutiles ou répétées.

    Merci d'avance


1 commentaires

codereview.stackexchange.com serait mieux adapté à cette question


4 Réponses :


0
votes
  1. Différentes classes d'enfants auront des propriétés différentes, celles attendues et d'accord. Normalement, toutes les classes dérivées ne présentent pas exactement les mêmes propriétés que leur classe de base. Il n'y a aucune raison de forcer code> la forme code> pour avoir un radius code>. Quel avantage auriez-vous? Cela vient d'ouvrir la porte pour des ennuis. Quel est votre objectif ultime avec cela? Avoir quelque chose comme myShape.dimension = valeur code> et ne pas se soucier s'il s'agit d'un rayon, d'un côté, etc.? Tout peut être fait, en fonction de vos besoins. P> li>

  2. avec votre classe abstraite, vous pouvez, par exemple, boucle via une liste de code> forme code> et appelez zone () code> ou volume () Code>, sachant que vous obtiendrez votre résultat (malgré votre immeuble toujours non implémenté volume code>). De plus, votre classe de base pourrait avoir du code commun qui, dans ce cas, vous n'utilisez pas. Vous pourriez avoir par exemple une propriété code> code> qui pourrait être cm, pouces, mètres, etc., puis avoir une méthode comme celle-ci (exemple idiot): p>

    public string GetAreaString()
    {
        return string.Format("{0} {1}", this.Area().ToString(), this.Unit);
    }
    
  3. Il suffit de le mettre en œuvre dans Cercle code>, bien sûr. Pourquoi cela briserait-il Circle CODE> SIMPLE RESPONSABILITÉ? Votre classe traite du calcul de son Valeurs connexes, juste comme une chaîne code> code> vous dit s'il est null ou sa longueur. p> li> ol>


0 commentaires

6
votes

Ce que je fais habituellement dans ce cas est de passer des paramètres de constructeur dans des classes en béton. Je vais donc changer vos formes de béton à quelque chose comme: xxx

et ainsi sur

MAINTENANT, j'utiliserais une méthode d'usine, votre tissu sera donc comme: xxx

Notez que, maintenant une usine savoir comment construire une forme avec constructeur transmis dans son propre constructeur.

Donc, chaque fois que vous voulez un différentiel forme vous instancerez une nouvelle usine. xxx

Je pense que cela répond à votre 1ère et 2e question.

Donc, 3: Ce que vous pouvez faire pour ne pas modifier votre classe est d'utiliser le modèle de stratégie afin de passer à l'exécution Comment implémenter cette méthode: xxx

espère que cela aide à votre entraînement.


3 commentaires

Merci pour votre contribution. Vraiment apprécier cela. Encore une question, quelle est l'utilisation et le corps de la classe de façade. Vous n'avez pas mentionné cela dans votre réponse. Utilisez-vous ma classe générique ou c'est un autre de votre choix. Je peux voir Circellactory et Rectanglefactory comme classe concrète.


Oh, j'ai oublié cette classe ... Cette classe est une classe abstraite avec une simple méthode abstraite crée () .. Mis à jour ci-dessus


Je pense qu'il y a quelques erreurs dans votre code. Par exemple, je pense que vous pensez que vous vouliez dire Public int circunference () (sinon, il ressemble à un constructeur) et je suppose que vous voulez qu'il soit retourner ce calcul. De plus, iperimeter S doit être int Calculatère (cercle cercle); . Enfin, cette méthode doit retour (int) (2 * math.pi * cercle.radius); . BTW, il y a quelques Lenght aussi. ;)



0
votes

Pour moi, votre exemple semble vraiment terminé. Je pense que vous devriez toujours mettre en œuvre la chose la plus simple qui ne fonctionne plus rien de moins. Je sais que ceci est un exemple de code, car vous voulez apprendre les principes solides, mais je pense qu'il est important de savoir à quel point il est horriblement faux peut aller ces principes dans le mauvais contexte. Dans votre code spécifique: avez-vous besoin de regrouper toutes vos formes en utilisant la classe de forme? Je veux dire, avez-vous déjà l'intention de parcourir une liste de formes et de calculer la zone et le volume? Sinon, l'héritage n'a absolument aucun point. En fait, je dirais que l'héritage est survisée ces jours-ci et quand il est surutilisé, vous vous retrouvez avec des graphiques de dépendance laids de héritage. En ce qui concerne la classe d'usine: La construction de l'une de vos objets "forme" est particulièrement difficile, primordiale, délicate. Votre classe d'usine fournit-elle une certaine valeur ou est-elle complètement inutile? Au cas où il n'a pas de raison réelle d'exister, je ne l'utiliserais pas, le nouvel opérateur est beaucoup plus clair.

J'espère que cela ne vous dérange pas de ma réponse, mais je voulais juste que vous soyez conscient du fait que certains principes solides s'appliquent dans des scénarios très spécifiques. Les forcer dans les mauvais endroits peut causer du code laid et sur compliqué. Dans certaines situations du monde réel, si les questions ci-dessus sont répondues avec oui, votre motif semble ok. Sinon, le même modèle peut trop compliquer les choses sans aucun avantage réel. Je suppose que mon point est le suivant: juste être conscient, tout principe solide n'est pas bon dans une situation :).


0 commentaires

0
votes

C'est un problème extrêmement courant. Tout en apprenant que le solide est agréable, il nécessite une compréhension des principes de conception de base tels que l'abstraction et l'indirection. La raison pour laquelle vous êtes confus est parce qu'il n'y a pas d'abstraction dans votre code.

Imaginez que vous ayez du code qui veut connaître la région de la forme, mais cela ne se soucie pas de la forme de la superficie de cette forme. Quelque chose comme: xxx

C'est la partie critique de la conception de OOP. Votre exemple n'a absolument rien de cela. Votre exemple est simplement conçu de code qui n'a aucune logique, encore moins d'être solide.


0 commentaires