27 votes

Meilleures pratiques pour l'architecture de grands systèmes dans un langage dynamique

D'après mon expérience dans la création d'applications non triviales en Java et C #, je sais que l'utilisation d'une bonne conception modulaire basée sur des modèles connus et le "codage vers les interfaces" sont les clés du succès.

Quelles sont les meilleures pratiques d'architecture lors de la construction de grands systèmes dans un langage dynamique comme python ou ruby?

8voto

zweiterlinde Points 5984

Comme d'autres l'ont répondu nombreux à l'architecture, de considérations d'éviter un couplage étroit, fournir une documentation adéquate, spécifier le comportement clairement) sont indépendants de la langue. Plusieurs autres considérations sont importantes pour les langages dynamiques:

  1. De manière agressive unité de test. C'est vraiment indépendante de la langue, mais nombreux sont ceux qui considèrent cela comme particulièrement important lors d'un vol sans vérifier le type statique de copilot. La raison de souligner ici, cependant, c'est qu'avec des langages dynamiques de test est facile. Par rapport à de nombreux langages statiques, créer des objets fantaisie/stubs, écrit des suites de tests automatiques, etc., est presque banal. Cela signifie que le ratio coût/bénéfice est massivement en faveur de tests approfondis.
  2. Le Respect de la langue. Votre conception et la mise en œuvre devrait travailler avec la langue, plutôt que contre elle (ce qui a également des répercussions sur la façon dont vous choisissez le langage de mise en œuvre d'un projet). La construction d'une réflexion personnalisée API en C++ est vraiment pénible, et l'écriture de code qui s'appuie fortement sur le type d'informations en Python n'est pas une bonne idée. Écrire du code qui, autant que possible, vit dans le paradigme de la langue. De cette façon, vous tirer parti de l'incroyable travail que la langue des designers (et interprète des écrivains) ont déjà fait.
  3. Soyez prudent avec la magie. Les langages dynamiques offrent de très puissant (et souvent utile) des installations pour des choses comme la métaclasse la programmation, de la dynamique de la classe de modification, de décorateur, astuces, et ainsi de suite. Il n'y a pas besoin d'avoir peur de ces pure et simple, mais ne pas les utiliser à moins que vous en avez besoin. Pourquoi? Le sont difficiles à obtenir et nécessite beaucoup d'expertise à la suite. Cela signifie qu'ils sont plus difficiles à écrire, plus difficiles à maintenir, et peut être une source de bogues subtils. (Google monkeypatching ou de chercher Jeff Atwood l' article sur ce sujet).

7voto

aku Points 54867

@Jeff V,

Quoi de langues dans lesquelles vous pouvez ajouter méthodes au moment de l'exécution, comment est-ce que entrez le mélange?

De mon expérience pratique bonne pratique serait de ne pas utiliser les choses obscures, comme l'ajout de méthodes d'exécution. Pour les grands systèmes, la simplicité est l'une des principales clés de la réussite. C'est bien d'utiliser typage dynamique, les expressions lambda, etc., mais vous devriez essayer de garder un code propre, simple et compréhensible. Comme je l'ai dit j'ai été impliqué dans le développement de jolies système sophistiqué écrit en Perl. Principale leçon que j'ai appris de ce projet est de lutter contre la tentation de l'aide de tous ceux de la belle dynamique des langues de fonctionnalités et d'écrire du code dans une méthode plus traditionnelle.

4voto

Michał Rudnicki Points 8424

De mon expérience, la plupart des applications destinées à être petit à croître avec le temps. Par conséquent, il est important de développer du code prête pour la suite de changements depuis le début. Je l'ai trouvé plus facile d'étendre les applications lorsqu'elles sont écrites sans trop de foi dans la dynamique de la bonté. Il est au-delà de tous les doutes requis pour que le programme écrit dans "Orienté Objet" de façon, et les deux mots sont importants ici - certains programmes ne utiliser des objets, mais ils ne parviennent pas à suivre l'orientation de l'objet de lignes directrices. Le codage à l'aide d'interfaces est une bonne pratique, afin d'éviter de trop l'héritage est. En langage PHP, j'utilise un type hinting dans les signatures de méthode, par exemple, public function setAsProfilePicture(Picture $p) pour éviter des erreurs stupides (note de l' Picture nom de la classe qui précèdent, en $p paramètre). Ceci est particulièrement utile lorsque vous travaillez en équipe, comme le code est prise en auto-documenté (en savoir plus sur le Codage sans commentaires sur Jeff Atwood blog). Une autre technique utile vous pouvez employer est la Programmation par contrat. C'est parfois la peine d'être strict dans les langages dynamiques comme les choses peuvent aller mal dans beaucoup plus de moyens que dans la statique-langages à typage. Retourner null lorsqu'un objet doit être renvoyé (ou passé) n'est pas une situation rare et explicite le type de résultat de la vérification peut vous épargner des heures.

Ma ligne de fond serait: donner une partie de la liberté de la dynamique des langues de l'offre, il peut vous épargner l'effort de trouver des bugs qui ne sont possibles que dans ces langues.

2voto

ASk Points 2525

Ces quelques règles de base qui devraient vous aider à démarrer. Veuillez noter que la grande majorité d'entre eux sont vraies pour tous les grands systèmes, indépendamment de la langue utilisée.

  • Les tests unitaires. Des tas et des tas de tests unitaires. De cette façon, vous pouvez toujours être certain que vous n'avez pas tout casser de la fonctionnalité. En outre, les tests unitaires sont votre filet de sécurité dans lequel vous devez effectuer par type de contrôles de sécurité (puisque la langue ne pas le faire pour vous)
  • Ne soyez pas tenté d'utiliser la "dynamique" de la langue. Les décorateurs sont beaux, chauds de brassage des méthodes de la classe pendant le temps d'exécution n'est pas. Si elle se sent "sale", c'est probablement le cas.
  • Ne pas utiliser la même variable pour les deux types de données différents.

Un Code comme:

if x > 5:
    y = 5
else:
    y = "foo"

va rapidement devenir difficile à maintenir.

  • Toujours documenter clairement ce que vous faites. C'est d'autant plus important dans une langue où les types ne sont pas facilement déduite.
  • Désinfecter toutes et tous les paramètres de la fonction. Puisque vous n'êtes pas limité par les types, il est facile de par inadvertance, le code de saut - et puisque c'est un moteur d'exécution de violation de contrainte, vous ne savez plus quand il est trop tard
  • D'adopter et d'utiliser un chiffon outil. Il va vous aider à trouver les erreurs les plus communes. Pour Python, il n'y a PyLint.
  • Enfin, n'ayez pas peur. Il ne va pas exploser dans votre visage.

Nous avons beaucoup de Python à base de systèmes, et ces règles ont gardé de nous en courant fort et sain d'esprit. Bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X