Question

Je souhaiterais en savoir plus sur le développement à grande échelle en Python et plus particulièrement sur la gestion d'une base de code volumineuse?

  • Lorsque vous apportez des modifications d'incompatibilité à la signature d'une méthode, comment trouvez-vous tous les endroits où cette méthode est appelée? En C ++ / Java, le compilateur le trouvera pour vous. Comment procédez-vous en Python?

  • Lorsque vous apportez des modifications en profondeur dans le code, comment savoir quelles opérations une instance fournit, car vous n'avez pas de type statique à rechercher?

  • Comment gérez-vous / empêchez-vous les fautes de frappe?

  • UnitTest est-il utilisé pour remplacer la vérification de type statique?

Comme vous pouvez le deviner, je n’avais presque travaillé qu’avec des langages à typage statique (C ++ / Java), mais je voudrais essayer Python pour les programmes plus volumineux. Mais j’ai eu une très mauvaise expérience, il ya très longtemps, avec le langage clipper (dBase), également typé de manière dynamique.

Était-ce utile?

La solution

Puisque personne n'a signalé pychecker, pylint et des outils similaires, je le ferai: pychecker et pylint sont des outils qui peuvent vous aider à trouver des hypothèses incorrectes (à propos des signatures de fonction, des attributs d'objet, etc.). Ils ne trouveront pas tout ce qu'un compilateur pourrait trouver dans un langage statiquement typé - mais ils peuvent trouver des problèmes que de tels compilateurs pour ces langages ne trouvent pas, aussi.

Python (et tout langage à typage dynamique) est fondamentalement différent en ce qui concerne les erreurs que vous êtes susceptible de causer et la manière dont vous les détecteriez et les corrigeriez. Il présente des inconvénients et des inconvénients certains, mais beaucoup (y compris moi) soutiendraient que, dans le cas de Python, la facilité d'écriture de code (et la facilité de le rendre structurellement correct) et de modifier le code sans La compatibilité de l'API (l'ajout de nouveaux arguments facultatifs, fournissant différents objets ayant le même ensemble de méthodes et d'attributs) le rend tout à fait adapté aux grandes bases de code.

Autres conseils

N'utilisez pas de tournevis comme un marteau

Python n’est pas un langage statiquement typé, n’essayez donc pas de l’utiliser de cette façon.

Lorsque vous utilisez un outil spécifique, vous l'utilisez pour ce qu'il a été construit. Pour Python, cela signifie:

  • Saisie de canard : aucune vérification de type. Seul le comportement compte. Par conséquent, votre code doit être conçu pour utiliser cette fonctionnalité. Une bonne conception implique des signatures génériques, pas de dépendances entre composants, des niveaux d'abstraction élevés. Ainsi, si vous modifiez quoi que ce soit, vous ne devrez pas modifier le reste du code. Python ne se plaindra pas non plus, c'est pour ça qu'il a été construit. Les types ne sont pas un problème.

  • Grande bibliothèque standard . Vous n'avez pas besoin de changer tous vos appels dans le programme si vous utilisez des fonctionnalités standard que vous n'avez pas codées vous-même. Et Python est livré avec les piles incluses. Je continue à les découvrir tous les jours. Je n'avais aucune idée du nombre de modules que je pouvais utiliser lorsque j'ai commencé et que j'ai essayé de réécrire des éléments existants comme tout le monde. Tout va bien, vous ne pouvez pas tout comprendre du début.

Vous n'écrivez pas Java, C ++, Python, PHP, Erlang, peu importe, de la même manière. Ce sont de bonnes raisons pour lesquelles il y a de la place pour chacune de tant de langues différentes, ils ne font pas les mêmes choses.

Les tests unitaires ne sont pas un substitut

Les tests unitaires doivent être réalisés dans n’importe quelle langue. La bibliothèque de tests unitaires la plus connue ( JUnit ) provient du monde Java!

Cela n’a rien à voir avec les types. Vous vérifiez les comportements, encore. Vous évitez les problèmes de régression. Vous vous assurez que votre client est sur les rails.

Python pour les projets à grande échelle

  

Langages, bibliothèques et frameworks   n'échelle pas. Les architectures font.

Si vous concevez une architecture solide, si vous parvenez à la faire évoluer rapidement, elle évoluera. Les tests unitaires aident, la vérification automatique du code aussi. Mais ce ne sont que des filets de sécurité. Et les petits.

Python est particulièrement adapté aux grands projets car il applique certaines bonnes pratiques et intègre de nombreux modèles de conception habituels. Mais encore une fois, ne l'utilisez pas pour ce qu'il n'est pas conçu. E.g: Python n’est pas une technologie destinée aux tâches gourmandes en ressources CPU.

Dans un projet de grande envergure, vous utiliserez probablement plusieurs technologies différentes. En tant que SGBD (en anglais pour SGBD ) et un langage de templates, ou autre. Python ne fait pas exception.

Vous voudrez probablement utiliser C / C ++ pour la partie de votre code dont vous avez besoin pour être rapide. Ou Java pour s'intégrer dans un environnement Tomcat . Je ne sais pas, je m'en fiche. Python peut bien jouer avec ces derniers.

En conclusion

Ma réponse peut sembler un peu impolie, mais ne vous méprenez pas: c'est une très bonne question.

Beaucoup de gens viennent à Python avec de vieilles habitudes. Je me suis foutu en essayant de coder Java comme Python. Vous pouvez, mais vous n’en tirerez jamais le meilleur parti.

Si vous avez / voulez jouer avec Python, c'est génial! C'est un outil formidable. Mais juste un outil, vraiment.

J'avais déjà l'habitude de modifier "Frets On Fire", un python open source "Guitar Hero". clone.

à mon avis, le python n'est pas vraiment adapté à un projet de très grande envergure.

Je me suis retrouvé à passer une grande partie du temps de développement à résoudre les problèmes liés à l’affectation de types incompatibles, des éléments que les langages à caractère statique révéleront sans effort au moment de la compilation. De plus, comme les types sont déterminés au moment de l'exécution, essayer de comprendre le code existant devient plus difficile, car vous n'avez aucune idée du type de paramètre que vous êtes en train d'examiner.

De plus, appeler des fonctions en utilisant leur chaîne de nom avec la fonction intégrée __ getattr __ est généralement plus courant en Python que dans d'autres langages de programmation, ce qui rend le graphe d'appel difficile à exécuter. (bien que vous puissiez également appeler des fonctions avec leur nom dans certaines langues statiquement typées).

Je pense que Python brille vraiment dans les logiciels à petite échelle, le développement de prototypes rapides et le collage de programmes existants, mais je ne l'utiliserais pas pour les projets de logiciels à grande échelle, car dans ces types de programmes, la maintenabilité devient le véritable problème, et À mon avis, le python y est relativement faible.

mon 0.10 EUR:

J'ai plusieurs applications python en état 'production'. notre société utilise java, c ++ et python. nous développons avec l'ide éclipse (pydev pour python)

Les tests unittest sont la solution clé du problème. (y compris pour c ++ et java)

le monde moins sécurisé de " typage dynamique " vous rendra moins soucieux de la qualité de votre code

PAR LA VOIE :

le développement à grande échelle ne signifie pas que vous utilisez une seule langue!

le développement à grande échelle utilise souvent une poignée de langages spécifiques au problème .

donc je suis d'accord pour le problème-marteau : -)

PS: static-typing & amp; python

Voici quelques éléments qui m'ont aidé à maintenir un système assez volumineux en python.

  • Structurez votre code en couches. c'est-à-dire une logique d'entreprise, une logique de présentation et vos couches de persistance séparées. Investissez un peu de temps dans la définition de ces couches et assurez-vous que toutes les personnes participant au projet y participent. Pour les grands systèmes, il peut également être essentiel de créer un cadre qui vous oblige à suivre un certain mode de développement.

  • Les tests sont essentiels. Sans les tests unitaires, vous obtiendrez probablement une base de code ingérable plusieurs fois plus rapidement qu'avec d'autres langues. N'oubliez pas que les tests unitaires sont souvent insuffisants, assurez-vous de disposer de plusieurs tests d'intégration / d'acceptation que vous pouvez exécuter rapidement après toute modification majeure.

  • Appliquez le principe Échec rapide . Ajoutez des assertions pour les cas où votre code pourrait être vulnérable.

  • Ayez une journalisation / gestion des erreurs standard qui vous aidera à naviguer rapidement vers le problème

  • Utilisez un environnement de développement intégré (pyDev fonctionne pour moi) qui fournit une intégration de type à l'avance, pyLint / Checker pour vous aider à détecter immédiatement les fautes de frappe courantes et à promouvoir certaines normes de codage

  • Faites attention à vos importations, ne faites jamais à partir de x import * ou effectuez des importations relatives sans utiliser de.

  • Réfléchissez, un outil de recherche / remplacement avec des expressions régulières suffit souvent à refactoriser les méthodes de déplacement / le type de classe.

Modifications incompatibles de la signature d'une méthode. Cela ne se produit pas aussi souvent en Python qu'en Java et en C ++.

Python a des arguments facultatifs, des valeurs par défaut et une plus grande souplesse dans la définition des signatures de méthodes. De plus, la saisie au clavier signifie que, par exemple, il n'est pas nécessaire de passer d'une classe à une interface dans le cadre d'une modification logicielle importante. Les choses ne sont tout simplement pas aussi complexes.

Comment trouvez-vous tous les endroits où cette méthode est appelée? grep fonctionne pour les langages dynamiques. Si vous avez besoin de connaître chaque endroit où une méthode est utilisée, grep (ou une recherche équivalente prise en charge par l'IDE) fonctionne très bien.

Comment savoir quelles opérations une instance fournit, car vous n'avez pas de type statique à rechercher?

a. Regarde la source. Vous n'avez pas le problème Java / C ++ des bibliothèques d'objets et des fichiers jar à gérer. Vous n'avez pas besoin de tous les outils et outils élaborés nécessaires à ces langages.

b. Un IDE peut fournir des informations de signature dans de nombreuses circonstances courantes. Vous pouvez facilement vaincre les pouvoirs de raisonnement de votre IDE. Lorsque cela se produit, vous devriez probablement revoir ce que vous faites pour vous assurer que cela a du sens. Si votre IDE ne peut pas raisonner vos informations de type, c'est peut-être trop dynamique.

c. En Python, vous utilisez souvent l'interprète interactif. Contrairement à Java et C ++, vous pouvez explorer vos instances directement et de manière interactive. Vous n'avez pas besoin d'un IDE sophistiqué.

Exemple:

  >>> x= SomeClass()
  >>> dir(x)

Comment gérez-vous / empêchez-vous les erreurs de saisie? Identique aux langages statiques: vous ne les empêchez pas. Vous les trouvez et les corrigez. Java ne peut trouver qu'une certaine classe de fautes de frappe. Si vous avez deux noms de classe ou de variable similaires, vous pouvez vous retrouver dans une situation difficile, même avec une vérification de type statique.

Exemple:

class MyClass { }
class MyClassx extends MyClass { }

Une faute de frappe avec ces deux noms de classe peut causer des dégâts. ["Mais je ne me mettrais pas dans cette position avec Java" les gens disent. D'accord. Je ne me mettrais pas dans cette position avec Python non plus; vous faites des cours profondément différents et qui échoueront tôt s'ils sont mal utilisés.]

UnitTest est-il utilisé pour remplacer la vérification de type statique? Voici l'autre point de vue: la vérification de type statique remplace la conception simple et claire.

J'ai travaillé avec des programmeurs qui ne savaient pas vraiment pourquoi une application fonctionnait. Ils ne pouvaient pas comprendre pourquoi les choses ne compilaient pas; Ils ne connaissaient pas la différence entre la super-classe abstraite et l'interface, et ils ne pouvaient pas comprendre pourquoi un changement de lieu rendait un tas d'autres modules dans un crash de fichier JAR séparé. La vérification de type statique leur a donné une fausse confiance dans une conception imparfaite.

Les langages dynamiques permettent aux programmes d’être simples. La simplicité se substitue à la vérification de type statique. La clarté remplace la vérification de type statique.

Mon principe général consiste à utiliser des langages dynamiques pour les petits projets non critiques et des langages statiques pour les grands projets. Je trouve que le code écrit dans un langage dynamique tel que python est "enchevêtré". plus vite. C'est en partie parce qu'il est beaucoup plus rapide d'écrire du code dans un langage dynamique et que cela conduit à des raccourcis et à une pire conception, du moins dans mon cas. C'est en partie parce que j'ai IntelliJ pour un refactoring rapide et facile lorsque j'utilise Java, ce que je n'ai pas pour Python.

La réponse habituelle à cette question est de tester des tests. Vous êtes censé disposer d'une suite de tests unitaires étendue et l'exécuter souvent, en particulier avant la mise en ligne d'une nouvelle version.

Les adeptes des langages à typage dynamique soutiennent que vous devez quand même tester, car même dans un langage à typage statique, la conformité aux règles brutes du système de types ne couvre qu'une petite partie des problèmes qui pourraient éventuellement mal se produire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top