Comment la pratique, SOLIDE principe de la programmation orientée objet design?
Je suis nouveau principe SOLIDE, mais je le comprends. Mon principal problème est d'avoir un moment difficile de concevoir mes cours à suivre le SOLIDE spécialement l'Inversion de la Dépendance. Il est parfois facile d'écrire la totalité de la logique en procédure modèle plutôt que d'utiliser SOLIDE.
Par exemple:
Disons que nous allons créer la Présence d'un Système de Surveillance, et nous avons logique(ou procédure) qui analyse l'employé d'empreintes digitales, c'est faire le ID, déterminer si oui ou non il est valide ou non, déterminer l'heure qu'il était, écrire les informations de connexion à la base de données, et de montrer si elle est réussie ou pas.
Il est facile d'écrire cela dans une procédure avec un tas de "if else', en boucle et le commutateur. Mais à l'avenir je vais souffrir le code de la dette'.
Si nous appliquant le principe SOLIDE ici. Je sais que nous avons besoin d'un certain type d'objet comme "AttendanceServiceClass' qui possède une méthode comme " scanEmployeeID()', 'processthislogin()' ou 'isItsucessful()'. Et je sais que cette classe a un lien de dépendance à un référentiel, userinfo, et d'autres objets.
Fondamentalement, mon problème est l'analyse sur la conception de la classe et de ses dépendances
Quelle est l'étape par étape de l'analyse de la conception de votre classe?
désolé pour mon anglais.
Cette question semble être trop large pour être véritablement de réponse.
Tas de bonnes vidéos sur le SOLIDE peut être trouvé ici: DimeCasts.net
OriginalL'auteur Ruby | 2013-05-19
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas être plus d'accord, c'est plus facile pour nous programmeur de manipuler du code de procédure motif. Cela rend la programmation orientée objet dur pour le programmeur qui, habitués à la programmation procédurale.
Cependant je l'ai trouvé plus facile d'écrire l'interface générale et à la consommation plutôt qu'à la rupture de l'interface conçu pour les plus petits modules. C'est une sorte de
Test First Development -> Red, green, refactor
pratique. (veuillez noter que, si vous voulez atteindre leneat design
, envisager la suite de TDD au lieu de ce guide. Ce guide est juste une petite section de faire du TDD)Dire que nous voulons créer de la
ServiceAttendance
fairescanEmployeeID
. Nous allons a une interface comme (s'il vous plaît notez que l'exemple est en C# de nommage):Veuillez noter que j'ai décider de la méthode de retour bool au lieu de void pour déterminer le succès ou l'échec de l'opération. Veuillez noter que le consommateur exemple ci-dessous, ne pas mettre en œuvre tout DI parce que je veux juste montrer la manière de les consommer. Puis, dans la consommation, nous pouvons avoir:
Ceci conclut le consommateur. Nous passons maintenant à la mise en œuvre. Dire que vous pouvez développer à l'aide de programmation procédurale et a obtenu le monolithique bloc de code. Vous pouvez préciser la mise en œuvre avec pseu-comme déclaration.
Maintenant nous avons 4 étapes à faire dans ce une seule opération. Mon principal est de ne pas faire plus de 3 façade processus dans une méthode, donc je peux tout simplement refactoriser le 3 et 4 à un seul processus. Maintenant, nous avons
Cela, nous avons 3 opération principale. Nous pouvons analyser si nous avons besoin de créer un petit module ou pas en décomposant l'exploitation. Disons que nous voulons briser la deuxième opération. On peut obtenir:
La répartition opération elle-même est assez évident de briser le deuxième module dans un autre plus petit module. Pour
2.2
et2.3
, nous avons besoin d'un plus petit module à être injecté. Tout simplement parce qu'il aura besoin de la dépendance au dépôt, il faut donc être injecté. Le même cas s'applique pour l'opération de l'étape1 scan the employee id
, car il aura besoin de la dépendance et le scanner d'empreintes digitales, de sorte que le scanner de maître-chien doit être mis en œuvre dans le module séparé.Nous pouvons toujours en panne, le fonctionnement, comme nous pouvons le faire dans
2.1
:Maintenant, je ne suis pas sûr si
2.1.1
et2.1.2
doivent être décomposé en 2 modules séparés, c'est à vous de décider. Et voilà, nous avons maintenant les interfaces, alors nous pouvons commencer la mise en œuvre. S'attendre à jeterexceptions
en cours de validation ou vous aurez besoin de passer de classe personnalisée pour gérer des messages d'erreur.Absolument. C'est pourquoi j'ai mentionné dans l'exemple que
Please notice the consumer example below does not implement any DI because I just want to show how to consume it
OriginalL'auteur Fendy
Tout d'abord, le solide n'est pas UN principe, il représente 5 principes différents:
A
etB
. L'héritage est adapté chaque fois que tous les objets d'une classe dérivéeB
peuvent être remplacés par des objets de leur classe parentA
sans aucune perte de fonctionnalité;Ces principes sont des guides, mais cela ne signifie pas que vous avez à les utiliser strictement à chaque fois.
À partir de votre description, je peux voir votre principale difficulté est de penser OO. Vous êtes toujours penser à comment faire les choses et c'est un de procédure mentalité. Mais en programmation orientée objet, il est plus important de choisir qui va faire ces choses.
De la pensée à propos de DI, à l'aide de votre exemple, nous allons voir votre scénario:
Quel est le problème ici?
Bien, tout d'abord, ce code viole PRS:
Que faire si le processus d'authentification des changements? Si la société a décidé que les balises de nom sont d'insécurité et d'installer un système de reconnaissance biométrique de? Eh bien, il y a ici une raison pour votre classe, mais la classe ne fait pas seulement de l'authentification, il fait d'autres choses, donc, il y aura une autre des raisons pour qu'il change. PRS que vos classes devraient avoir juste UNE raison de changer.
Elle porte également atteinte à OCP:
Que faire si il y a une autre méthode d'authentification disponible, et je veux être en mesure de servir comme je le souhaite? Je ne peux pas. Pour modifier la méthode auth, j'ai modifier la classe.
Il viole FAI:
Pourquoi un
ServiceAttendance
objet a une méthode pour l'employé d'authentification si il doit juste fournir un service de présence?Nous allons l'améliorer un peu:
Maintenant, c'est un peu mieux. Nous avons résolu les problèmes avec PRS et FAI, mais si vous pensez mieux, c'viole OCP et maintenant viole DIP. Le problème est que
AttendanceService
est étroitement couplé avecBarCodeAuth
. Je ne peux toujours pas changer la méthode auth sans toucherAttendanceService
.Maintenant, nous allons appliquer OCP et DIP ensemble:
Maintenant je peux le faire:
À modifier le comportement, je n'ai pas besoin de toucher à la classe. Si une autre méthode auth s'affiche, j'ai juste besoin de le mettre en œuvre, le respect de l'interface et est prêt à l'emploi (rappelez-vous OCP?). Cela est dû à moi d'être à l'aide de DIP sur
ServiceAttendance
. Bien qu'il a besoin d'une méthode d'authentification, il n'est pas de sa responsabilité d'en créer un. En effet, pour cet objet, il n'est pas question de la méthode d'authentification, il suffit de savoir si l'appelant (utilisateur) est ou n'est pas autorisé à faire ce qu'il essaie de faire.Ce est tout au sujet de DIP est: vos composants doivent dépendre des abstractions, pas implémentations.
These principles are guides, but it does not mean you have to use them STRICTLY every time.
. Je suis complètement d'accord, on ne peut pas toujours mettre en œuvre tout le temps. Parfois, nous devons faire des compromis et à faire ce qui doit être fait pour atteindre une exigence. J'aime aussi rester simple (KIS) et ne veux pas être trop parfait et jusqu'à la fin avec une classe qui imprimeHello
et une autre classe qui imprimeWorld
, c'est juste une exagération, mais cela arrive.OriginalL'auteur Henrique Barcelos
N'est pas spécifique SOLIDE, mais vaut la peine de mentionner que d'un très intéressant POO-formation approche par Jeff Bay: Orienté-Objet, De La Gymnastique. L'idée est que vous pouvez essayer de suivre un ensemble de règles très strictes sur une non-vie réelle, petit projet.
OriginalL'auteur Dmitry
Tout d'abord, pensez à différentes parties de la fréquentation du système.
De l'interface utilisateur, finger print scanner, dépôt de bases de données, processus de connexion et de flux de travail.
Pour la conception de ce système, nous pouvons commencer à concevoir des pièces dans l'isolement et de les connecter en tant que système.
Une conception grossière pourrait être autour des parties suivantes du système:
Dans le code suivant de la liste de certains aspects des principes de conception sera visible déjà:
Basé sur ce bien pensé, le système pourrait fonctionner comme ceci:
[Vous pouvez continuer à l'améliorer et ajouter manquant de logique, je suis en fournissant un moyen très rapide de conception contour avec une brève mise en œuvre.]
Exemple De Code
OriginalL'auteur bhavik shah
Certainement, de la procédure de programmation est beaucoup plus facile pour les personnes qui sont utilisés pour l'écriture de code de la procédure. Pour ceux qui sont utilisés pour l'écriture bien factorisé le code orienté objet, le code de procédure est en fait plus difficile.
Oui, bien factorisé le code orienté objet souvent plus de travail, et plus de code. Mais si c'est fait correctement, il rend le code plus facile à entretenir, facile à étendre, plus facile à déboguer (et surtout plus facile à tester).
OriginalL'auteur Erik Funkenbusch