Frage

Ich wäre daran interessiert zu lernen, über groß angelegte Entwicklung in Python und besonders in den wie halten Sie es mit einer großen code-Basis?

  • Wenn Sie Inkompatibilität änderungen an der Signatur der Methode, wie finden Sie alle Orte, an denen diese Methode aufgerufen wird.In C++/Java-compiler finden es für Sie, wie machen Sie das in Python?

  • Wenn Sie änderungen vornehmen, die tief im inneren der code, wie finden Sie heraus, welche Operationen einer Instanz bietet, da Sie nicht über eine statische Typ-lookup?

  • Wie tun Sie behandeln/verhindern, Druckfehler (Schreibfehler)?

  • Sind UnitTest verwendet, die als Ersatz für eine statische Typprüfung?

Wie Sie erraten können, dass ich fast nur gearbeitet, mit statisch typisierte Sprachen (C++/Java), aber ich möchte versuchen, meine Hände auf Python für größere Programme.Aber ich hatte eine sehr schlechte Erfahrung, vor langer Zeit, mit dem clipper (dBase) Sprache, die auch dynamisch typisiert.

War es hilfreich?

Lösung

Da niemand darauf hingewiesen pychecker, Pylint und ähnliche Werkzeuge, ich will: pychecker und Pylint sind Werkzeuge, die Sie finden falsche Annahmen helfen können (über Funktionssignaturen, Objektattribute, etc.) Sie werden nicht alles finden, dass ein Compiler könnte finden in einer statisch typisierten Sprache -. sie können aber Probleme finden, die eine solche Compiler für diese Sprachen nicht können, finden

Python (und jede dynamisch typisierte Sprache) unterscheidet sich grundlegend in Bezug auf die Fehler, die Sie wahrscheinlich sind, um zu bewirken, und wie würden Sie erkennen und beheben. Es hat bestimmte Nachteile sowie upsides, aber viele (mich eingeschlossen) würde das in Python Fall argumentieren, die Leichtigkeit des Schreibens Code (und die Leichtigkeit der es strukturell geräuschlos) und Code modifizieren ohne brechen API-Kompatibilität (das Hinzufügen neue optionale Argumente, verschiedene Objekte bereitstellt, die den gleichen Satz von Methoden und Attribute haben) macht es geeignet gut für großen Codebases.

Andere Tipps

Sie nicht einen Schraubenzieher als Hammer

Python ist nicht eine statisch typisierte Sprache, so versuchen Sie nicht, es auf diese Weise zu verwenden.

Wenn Sie ein bestimmtes Werkzeug verwenden möchten, verwenden Sie es für das, was sie gebaut wurde. Für Python, es bedeutet:

  • Duck Typing : keine Typüberprüfung. Nur Verhalten Angelegenheiten. Daher muss Ihr Code entwickelt werden, um diese Funktion zu nutzen. Ein gutes Design bedeutet generische Signaturen, keine Abhängigkeiten zwischen den Komponenten, hohe Abstraktionsebene .. Also, wenn Sie etwas ändern, werden Sie nicht den Rest des Codes ändern müssen. Python wird auch nicht beschweren, dass das, was sie für gebaut wurde. Typen sind kein Thema.

  • Große Standardbibliothek . Sie müssen nicht alle Ihre Anrufe in das Programm ändern, wenn Sie Standard-Funktionen verwenden Sie nicht selbst codiert haben. Und Python kommt mit Batterien enthalten. Ich halte sie jeden Tag zu entdecken. Ich hatte keine Ahnung von der Anzahl der Module ich verwenden könnte, als ich begann und versuchte bestehende Sachen wie jeder neu zu schreiben. Es ist in Ordnung, man kann nicht alles von Anfang an erhalten.

Sie nicht schreiben Java, C ++, Python, PHP, Erlang, was auch immer, die gleiche Art und Weise. Sie sind gute Gründe, warum es für jeden von so vielen verschiedenen Sprachen Raum ist, sie die gleichen Dinge nicht tun.

Unit-Tests sind kein Ersatz

Unit-Tests müssen mit jeder Sprache durchgeführt werden. Die berühmteste Unit-Test-Bibliothek ( JUnit ) ist aus der Java-Welt!

Das hat nichts mit Typen zu tun. Sie überprüfen Verhalten wieder. Sie vermeiden Probleme mit Regression. Sie sicher, dass Ihre Kunden Sie sind auf Schienen.

Python für Großprojekte

  

Sprachen, Bibliotheken und Frameworks   nicht skalieren. Architekturen tun.

Wenn Sie eine solide Architektur entwerfen, wenn Sie in der Lage sind, um es schnell zu machen entwickelt, dann wird es skaliert werden. Unit-Tests helfen, als auch die automatische Codeprüfung. Aber sie sind nur Sicherheitsnetze. Und klein.

Python ist besonders geeignet für große Projekte, weil es einige gute Praktiken erzwingt und hat eine Menge von üblichen Designmuster eingebaut. Aber noch einmal, verwenden Sie es nicht für das, was es nicht ausgelegt ist. Z. Python ist keine Technologie für die CPU-intensive Aufgaben

In einem großen Projekt, werden Sie wahrscheinlich sowieso mehrere verschiedene Technologien verwenden. Als SGBD (Französisch DBMS ) und eine Template-Sprache, oder andere. Python ist keine Ausnahme.

Sie wollen wahrscheinlich C / C ++ für den Teil des Codes Sie müssen schnell sein verwenden. Oder Java, um fit in einem Tomcat Umgebung. Sie wissen nicht, egal. Python kann mit diesem gut spielen.

Als Schlussfolgerung

Meine Antwort kann ein bisschen unhöflich fühlen, aber verstehen Sie mich nicht falsch:. Dies eine sehr gute Frage

Eine Menge Leute kommen zu Python mit alten Gewohnheiten. Ich schraubte ich versuchen, Java wie Python Code. Sie können, aber nie das Beste daraus erhalten.

Wenn Sie gespielt haben / wollen mit Python spielen, es ist toll! Es ist ein wunderbares Werkzeug. Aber nur ein Werkzeug, wirklich.

Ich hatte einige Erfahrung mit dem ändern von "Frets On Fire", eine open-source-python "Guitar Hero" - Klon.

wie ich es sehe, python ist nicht wirklich geeignet für ein wirklich großes Projekt.

Ich fand mich verbringen einen großen Teil der Entwicklungszeit debugging Fragen der Zuordnung von inkompatiblen Typen, Dinge, die statisch typisierten Sprachen wird zeigen, mühelos zur compile-Zeit.auch, weil die Typen sind bestimmt auf run-Zeit, versuchen zu verstehen, vorhandene code wird schwerer, da Sie keine Ahnung haben, was ist der Typ des Parameters, den Sie gerade betrachten.

zusätzlich zu, dass, aufrufen von Funktionen mit Ihrem Namen die Zeichenfolge mit dem __getattr__ gebaut in Funktion ist in der Regel häufiger in Python als in anderen Programmiersprachen, so bekommen die call-Graphen einer bestimmten Funktion etwas schwer (obwohl Sie Funktionen aufrufen, die sich mit Ihren Namen in einigen statisch typisierten Sprachen).

Ich denke, dass Python wirklich glänzt im kleinen Maßstab-software, rapid-Prototyping-Entwicklung und kleben, bestehende Programme zusammen, aber ich würde es nicht verwenden für große software-Projekte, da in diesen Arten von Programmen, die Wartbarkeit wird das eigentliche Problem, und meiner Meinung nach python ist relativ schwach.

meine 0,10 EUR:

Ich habe mehr Python-Anwendung in ‚production'-Zustand. unser Unternehmen verwendet Java, C ++ und Python. Wir entwickeln mit dem Eclipse-IDE-(pydev für Python)

Unittests sind die Schlüssel-Lösung für das Problem. (auch für C ++ und Java)

die weniger sichere Welt von „dynamic-Typisierung“ werden Sie weniger sorglos über Ihre Codequalität machen

Übrigens :

groß angelegte Entwicklung bedeutet nicht, dass Sie eine einzige Sprache verwenden!

groß angelegte Entwicklung oft verwendet eine Handvoll Sprachen spezifisch für das Problem .

so ich stimme zu the-Hammer-Problem : -)


PS: statische Typisierung und Python

Hier sind einige Elemente, die ich ein ziemlich großes System in Python halten geholfen haben.

  • Strukturieren Sie Ihren Code in Schichten. d.h getrennte biz Logik, Präsentationslogik und Ihre Ausdauer Ebenen. Investieren Sie ein wenig Zeit, um diese Schichten zu definieren und sicherzustellen, dass jeder an dem Projekt in gebracht wird. Für große Systeme einen Rahmen zu schaffen, die Sie in eine bestimmte Art und Weise der Entwicklung zwingt kann auch Schlüssel sein.

  • Tests sind die Schlüssel, ohne Unit-Tests werden Sie wahrscheinlich mit einem unmanagable Codebasis mehrmals schneller als mit anderen Sprachen enden. Beachten Sie, dass Unit-Tests sind oft nicht ausreichend, stellen Sie sicher, dass mehrere Integrations- / Abnahmen haben Sie schnell nach jeder größeren Änderung ausgeführt werden kann.

  • Verwenden Sie Schnell Prinzip fehlschlagen. In Behauptungen für Fälle, die Sie Ihren Code fühlen vielleicht verwundbar.

  • Standardprotokollierung / Fehlerbehandlung, die Sie schnell auf das Thema navigieren helfen

  • eine IDE verwenden (PyDev funktioniert für mich), die vor uns stellt, Pylint / Checker Integration geben Sie gemeinsame Tippfehler sofort erkennen helfen und einige Coding-Standards

  • Förderung
  • Care über Ihre Importe, tut nie von der Einfuhr * x oder tun relative Einfuhren ohne Verwendung.

  • refactor Sie eine Suchen / Ersetzen-Werkzeug mit regulären Ausdrücken ist oft alles, was Sie brauchen Bewegung Methoden / Klassentyp Refactoring zu tun.

Nicht kompatible Änderungen an der Signatur einer Methode. Dies gilt nicht so viel in Python geschehen, wie es in Java und C ++ tut.

Python hat optionale Argumente, Standardwerte und mehr Flexibilität bei der Definition weit Methodensignaturen. Das bedeutet auch, dass Ente eingeben - zum Beispiel - Sie müssen nicht von einer Klasse zu einer Schnittstelle als Teil einer bedeutenden Softwareänderung zu wechseln. Die Dinge sind einfach nicht so komplex.

Wie Sie alle Orte, wo diese Methode aufgerufen wird? grep arbeitet für dynamische Sprachen. Wenn Sie jeden Ort eine Methode verwendet, wissen müssen, ist, grep (oder gleichwertig IDE-unterstützte Suche) funktioniert super.

Wie Sie herausfinden, welche Operationen eine Instanz bereitstellt, da Sie Nachschlag keine statische Art haben?

a. Schauen Sie sich die Quelle. Sie haben nicht die Java / C ++ Problem der Objektbibliotheken und JAR-Dateien mit zu kämpfen. Sie brauchen nicht alle aufwendige Hilfsmittel und Werkzeuge, die diese Sprachen benötigen.

b. Ein IDE kann Signaturinformationen unter vielen gewöhnlichen Umständen bieten. Sie können ganz einfach, Ihre IDE Argumentation Kräfte besiegen. Wenn das passiert, sollten Sie vielleicht überprüfen, was Sie tun Sinn sicher zu sein, es macht. Wenn Ihre IDE können Ihre Typinformationen nicht folgern, vielleicht ist es zu dynamisch.

c. In Python, Sie arbeiten oft durch den interaktiven Interpreter. Im Gegensatz zu Java und C ++, können Sie Ihre Instanzen direkt und interaktiv erkunden. Sie haben nicht eine anspruchsvolle IDE benötigen.

Beispiel:

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

Wie gehen Sie mit / verhindern Tippfehler Gleiche wie statische Sprachen:? Sie sie nicht verhindern. Sie finden und sie korrigieren. Java kann nur eine bestimmte Klasse von Tippfehlern finden. Wenn Sie zwei ähnliche Klasse oder Variablennamen haben, können Sie in großen Schwierigkeiten aufzuwickeln, auch mit statischer Typprüfung.

Beispiel:

class MyClass { }
class MyClassx extends MyClass { }

Ein Tippfehler mit diesen beiden Klassennamen können Verwüstung verursachen. [ „Aber ich würde mich nicht mit Java in dieser Position setzen“, sagen die Leute. Einverstanden. Ich würde mich nicht mit Python in dieser Lage gebracht, entweder; Sie machen Klassen, die zutiefst verschieden sind, und wird früh scheitern, wenn sie missbraucht sind.]

Ist Unittest ist als Ersatz für die statische Typprüfung verwendet Hier ist der andere Standpunkt:? Statische Typprüfung ein Ersatz für eine klares, einfaches Design.

Ich habe mit Programmierern gearbeitet, die nicht sicher waren, warum eine Anwendung gearbeitet. Sie konnten nicht herausfinden, warum die Dinge nicht kompilieren; das wusste nicht, den Unterschied zwischen abstrakten übergeordneten Klasse und Schnittstelle und konnte nicht herausfinden, warum anstelle einer Änderung eine Reihe von anderen Modulen in einem separaten JAR-Datei abstürzen lässt. Die statische Typprüfung gab ihnen falsches Vertrauen in einem fehlerhaften Design.

Dynamische Sprachen erlauben Programme einfach zu sein. Einfachheit ist ein Ersatz für statische Typprüfung. Clarity ist ein Ersatz für statische Typprüfung.

Meine Faustregel ist dynamische Sprachen für kleine nicht-unternehmenskritischen Projekte zu verwenden und statisch typisierte Sprachen für große Projekte. Ich finde, dass Code in einer dynamischen Sprache geschrieben wie Python „wirren“ schneller wird. Teilweise ist das, weil es viel schneller ist der Code in einer dynamischen Sprache zu schreiben, und das führt zu Verknüpfungen und schlechtes Design, zumindest in meinem Fall. Teilweise ist es, weil ich IntelliJ habe für die schnellen und einfachen Refactoring, wenn ich Java verwenden, die ich nicht habe für Python.

Die übliche Antwort darauf testet Testprüfung. Sie sollten eine umfangreiche Unit-Test-Suite haben und es oft laufen, vor allem, bevor eine neue Version geht online.

Die Befürworter der dynamisch typisierten Sprachen machen den Fall, dass Sie auf jeden Fall testen, denn selbst in einer statisch typisierten Sprache Übereinstimmung mit den rohen Regeln des Typ System nur einen kleinen Teil das, was deckt potentiell schief gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top