Niemals Reflexion im Produktionscode verwenden! Was ist mit Python?

8

Ich habe C # geschrieben und das Mantra, das von oben kommt, scheint "verwende niemals Reflektion im Produktionscode". Ich habe es für Testcode verwendet, aber nie etwas, das in der Wildnis läuft. Alle Argumente scheinen vernünftig zu sein, und es gibt immer einen Weg, dies zu tun, indem man eine weitere Ebene der Abstraktion oder des Entwurfsmusters oder was auch immer hinzufügt.

Jetzt fange ich an, etwas ernsthaften Python-Code zu schreiben, ich frage mich, ob das gleiche Prinzip gilt. Es scheint, dass Python mit Reflektion konzipiert ist. Module und Klassen speichern Mitglieder in einem leicht zugänglichen Wörterbuch. Die Meta-Klassen von Django-Modellen nehmen beispielsweise Strings zu Referenzmitgliedern auf.

Ich könnte C # / Java in Python schreiben, aber ich will es wirklich nicht. Ich glaube immer noch fest an "keine Reflexion" für diese Sprachen. Ist der Python-Weg einfach grundverschieden?

    
Joe 20.01.2011, 08:53
quelle

5 Antworten

17

Als dynamische Sprache unterscheidet sich Python grundlegend von statisch getippten Sprachen, daher ist alles eine Spiegelung darin :-) Auch verwende niemals die Reflektion im Produktionscode (für statische Sprachen) scheint mir etwas extrem zu sein .

    
Darin Dimitrov 20.01.2011, 08:56
quelle
6

Ich denke, dass die "no reflection in production code" in c # nicht korrekt ist.
Die Reflexion ermöglicht dem Programmierer oft Dinge, die sonst unmöglich sind Ich würde sagen: "Keine Reflexion für nichtöffentliche Mitglieder im Produktionscode" und "Reflexion mit Vorsicht nutzen!" Wenn Sie nicht richtig verwendet werden, können Sie die Leistung verlieren. Bei richtiger Verwendung können Sie Leistung gewinnen (denken Sie nur an statische Reflexion) Verwenden Sie keine Reflektion für massiv aufgerufenen Code.
Python ist stattdessen eine dynamische Sprache. Alle Konzepte sind unterschiedlich. Die Normalität (und der richtige Weg dazu) ist die Verwendung der Techniken, über die du sprichst.

    
nemenos 20.01.2011 09:02
quelle
2

Ja, in diesem Aspekt ist Python-Entwicklung grundlegend anders.

Reflection in C # / Java bezieht sich auf die Fähigkeit der Laufzeitumgebung, Informationen über den ausgeführten Code zu erhalten und basierend auf diesen Informationen Entscheidungen zu treffen.

Da Python die dynamische Typisierung verwendet, wird jede Typentdeckung an die Laufzeit und nicht an die Kompilierzeit delegiert. Das bedeutet also, dass jedes Python-Programm Reflektion verwenden muss, um zu funktionieren, nur nicht Reflektieren genannt, heißt es das Programm laufen zu lassen.
Darüber hinaus umfasst die Python-Philosophie die dynamische Art der Ausführung, also sollten Sie nicht zögern, sie zu Ihrem Vorteil zu nutzen.

P.S. Obwohl man Reflexionen in engen Schleifen vermeiden sollte und man sich bewusst sein sollte, dass die Reflexion um ein oder zwei Größenordnungen langsamer ist, sollte man keine Angst haben, es zu verwenden, wenn es das richtige Werkzeug für den Job ist.

    
SWeko 20.01.2011 10:11
quelle
0

IMO Der Grund für mich, die Verwendung von Reflektion in Produktionscode zu vermeiden, ist die Tatsache, dass Reflektion Code wirklich schwerer zu warten und zu debuggen machen könnte.

    
ykatchou 20.01.2011 09:07
quelle
0

Reflection ist eine sehr fortschrittliche und leistungsstarke Technologie. Aber es ist langsam. Sie können Reflexion verwenden, aber nicht zu oft. Daher haben CLR-Entwickler einen weiteren coolen Typ zu .NET 4.0 hinzugefügt - dynamic type . Ich empfehle Ihnen dringend, auf einige Dokumente oder Bücher für weitere Informationen verweisen. F. e. CLR über C #.

%Vor%

CLR über C #:

  

Es gibt auch viele Gelegenheiten, wenn a   Programm muss auf Informationen reagieren, die   es weiß nicht, bis es ist   Laufen. Während Sie Typ-Safe verwenden können   Programmiersprachen (wie C #) zu   interagieren mit dieser Information, die   Die Syntax ist besonders schwerfällig   da du viel mit arbeitest   Saiten und Leistung wird behindert   auch. Wenn Sie ein reines C # schreiben   Anwendung, dann die einzige Gelegenheit   Sie haben mit zu arbeiten   Laufzeitbestimmte Information ist wann   Sie verwenden Reflexion (diskutiert in   Kapitel 23). Allerdings viele Entwickler   Verwenden Sie auch C #, um mit zu kommunizieren   Komponenten, die nicht implementiert sind   C #. Einige dieser Komponenten könnten sein   .NET-dynamische Sprachen wie Python   oder Ruby oder COM-Objekte, die dies unterstützen   die IDispatch-Schnittstelle (möglicherweise   in nativem C oder C ++ implementiert), oder   HTML-Dokumentobjektmodell (DOM)   Objekte (implementiert mit verschiedenen   Sprachen und Technologien).   Die Kommunikation mit HTML-DOM-Objekten ist   besonders nützlich beim Aufbau eines   Microsoft Silverlight-Anwendung. Zu   Machen Sie es für Entwickler einfacher   Reflexion oder Kommunikation mit anderen   Komponenten bietet Ihnen der C # -Compiler   eine Möglichkeit, den Typ eines Ausdrucks als zu markieren   dynamisch. Sie können das Ergebnis auch setzen   eines Ausdrucks in eine Variable und   Sie können den Typ einer Variablen als markieren   dynamisch. Diese Dynamik   Ausdruck / Variable kann dann verwendet werden   um ein Element wie ein Feld aufzurufen, a   Eigenschaft / Indexer, eine Methode, Delegat,   und unäre / binäre / Konvertierungsoperatoren.   Wenn Ihr Code ein Mitglied mit verwendet   ein dynamischer Ausdruck / eine Variable, der   Compiler erzeugt speziellen IL-Code   das beschreibt die gewünschte Operation.   Dieser spezielle Code wird als bezeichnet   die Nutzlast. Zur Laufzeit die Payload   code bestimmt die genaue Operation nach   Ausführen basierend auf dem tatsächlichen Typ von   das Objekt, auf das jetzt verwiesen wird   dynamischer Ausdruck / Variable.

    
Sasha Reminnyi 20.01.2011 09:28
quelle

Tags und Links