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.
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: p> questions p> 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. P> li>
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. P> li>
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. P> li>
ol> Merci d'avance p> p>
4 Réponses :
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 avec votre classe abstraite, vous pouvez, par exemple, boucle via une liste de code> forme code> et appelez Il suffit de le mettre en œuvre dans 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>
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);
}
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>
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: et ainsi sur p> MAINTENANT, j'utiliserais une méthode d'usine, votre tissu sera donc comme: p> Notez que, maintenant une usine savoir comment construire une forme avec constructeur transmis dans son propre constructeur. P> Donc, chaque fois que vous voulez un différentiel forme vous instancerez une nouvelle usine. p> Je pense que cela répond à votre 1ère et 2e question. P> 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: p> espère que cela aide à votre entraînement. p> p>
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 () code> (sinon, il ressemble à un constructeur) et je suppose que vous voulez qu'il soit code> retourner code> ce calcul. De plus,
iperimeter code> S doit être
int Calculatère (cercle cercle); code>. Enfin, cette méthode doit
retour (int) (2 * math.pi * cercle.radius); code>. BTW, il y a quelques
Lenght code> aussi. ;)
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. P>
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 :). P>
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: p> 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. P> p>
codereview.stackexchange.com serait mieux adapté à cette question