web-dev-qa-db-fra.com

Comment penser aux modèles de conception et OOP Pratiques change-t-il des langues dynamiques et faiblement typées?

Il y a une question assez utile déjà dans ces lignes (" schémas de conception non-OOP? "), mais je suis plus curieux d'un point de vue transitoire pour quelqu'un qui vient de commencer avec dynamique et faiblement typée Langues.

C'est-à-dire: Disons que j'ai été programmée en C++, C # ou Java pendant de nombreuses années et absorbait beaucoup de sagesse le long des lignes des modèles de conception GOF, Fowler's modèles de l'architecture d'applications d'entreprise, principes solides , etc. Maintenant, je tiens à Ruby, Python, JavaScript, etc., et je me demandais comment mes connaissances s'appliquent. Je pouvais probablement faire des traductions directes dans de nombreux cas, mais presque certainement cela ne tirerait pas pleinement parti de mon nouveau cadre. La frappe de canard seul tourne beaucoup de ma pensée à base de mon interface sur sa tête.

Qu'est-ce qui reste la même chose? Quel changement? Existe-t-il des principes directeurs tels que des schémas solides ou canoniques (peut-être de neuf nouveaux) qu'une langue dynamique newbie devrait savoir?

11
Domenic

Qu'est-ce qui reste la même chose? Quel changement?

Les motifs sont les mêmes. Les techniques de langue changent.

Y a-t-il des principes directeurs comme solide,

Oui. En effet, ils restent les principes directeurs. Rien ne change.

ou des modèles canoniques (peut-être de nouveaux nouveaux) qu'une langue dynamique newbie devrait savoir?

Certaines choses sont uniques. La plupart du temps, l'impact est que les techniques de mise en œuvre changent.

Un motif est - bien --modèle. Pas une loi. Pas un sous-programme. Pas une macro. C'est juste une bonne idée qui se répète parce que c'est une bonne idée.

Les bonnes idées ne sortent pas de style ni changent de façon spectaculaire.

Autres notes. Python n'est pas "faiblement tapé". C'est plus fortement tapé que Java ou C++ car il n'y a pas d'opération de distribution. [Oui, il y a un moyen de fudger La classe associée à un objet, mais ce n'est pas le genre de chose qui est fait, sauf pour prouver un point légaliste.]

Aussi. La plupart des modèles de conception sont basés sur différentes manières d'exploiter le polymorphisme.

Regardez -State ou commande ou Memento comme des exemples. Ils ont des hiérarchies de classe pour créer des états polymorphes, des commandes ou des souvenitures de changements d'état. Rien ne change de manière significative lorsque vous faites cela dans Python. Les changements mineurs incluent la relaxation de la hiérarchie de la classe précise car le polymorphisme dans Python dépend des méthodes communes non des ancêtres communs.

En outre, certains modèles sont simplement une tentative de réalisation tardive. La plupart -sine - Les modèles connexes sont une tentative d'autorisation d'une modification facile à une hiérarchie de classe sans recompiler tous les modules C++ dans l'application. Ce n'est pas aussi intéressant d'optimisation dans une langue dynamique. Cependant, A sine comme moyen de dissimuler des détails de la mise en œuvre a une valeur énorme.

Certains modèles sont une tentative de conduire le compilateur et la liante. singleton, par exemple, il existe pour créer des globaux déroutants, mais au moins les encapsuler. Python Cours de Singleton n'est pas une perspective agréable. Mais Python modules sont déjà singletons, tant d'entre nous utilisent donc un module et évitez de tenter de vous gâcher avec un singleton classe.

7
S.Lott

Peter Norvig a pris cette question très question en 1998, lire http://norvig.com/design-patterns/ppframe.htm pour un ensemble de choses détaillées qu'il a remarqué et http://c2.com/cgi/wiki?areedesignpatternsmissingLanguageFeatures Pour une discussion ultérieure autour du point.

La version courte est que lorsque votre langue a plus de fonctionnalités, les modèles de conception répétitifs ont tendance à devenir plus simples - souvent au point d'être invisible. Il a constaté que c'était vrai pour la plupart des schémas de conception que le GOF avait identifié.

8
btilly

La programmation dans une langue dynamique orientée objet utilise de nombreux mêmes schémas et principes, mais il existe certains modifications et différences dues à l'environnement:

remplacer les interfaces avec dactylographie de canard - Lorsque le gang de quatre vous dirait d'utiliser une classe de base abstraite avec des fonctions virtuelles pures, et vous utiliseriez une interface en Java, dans une langue dynamique, vous n'avez besoin que de une compréhension. Étant donné que vous pouvez utiliser n'importe quel objet n'importe où, et cela fonctionnera bien si cela implémente les méthodes qui sont réellement appelées, vous n'avez pas besoin de définir une interface formelle. Cela peut valoir la peine documenter un, de sorte qu'il est clair ce qui est réellement requis.

Les fonctions sont aussi des objets - Il existe de nombreux schémas de la décision de la décision de l'action; Commande, stratégie, chaîne de responsabilité, etc. Dans une langue avec des fonctions de première classe, il est souvent raisonnable de passer simplement une fonction autour au lieu de faire des objets avec .doIt() méthodes. Ces modèles se transforment en "Utiliser une fonction d'ordre supérieur".

VENDU - Le principe de ségrégation de l'interface prend le plus gros succès ici, en tenant compte de l'absence d'interfaces. Vous devriez toujours envisager le principe, mais vous ne pouvez pas la réinfinir dans votre code. Seule la vigilance personnelle vous protégera ici. Sur le côté en haut, la douleur causée par une violation de ce principe est beaucoup réduite dans des environnements dynamiques communs.

"... dans mon propre particulier ... idiome!" - Chaque langue a de bonnes pratiques et de mauvaises pratiques, et vous devrez les apprendre et les suivre, si vous voulez le meilleur code dans ces langues. Un motif itérateur parfaitement écrit peut être ri d'une langue avec des compréhensions de liste intégrées, par exemple.

8
Sean McMillan