Komplexität überwinden, Eckel über Java und Python and Chunk Theory [geschlossen]

8

In der Einleitung zu Bruce Eckels Thinking In Java sagt er 1998:

  

Beim Programmieren geht es um das Verwalten   Komplexität: Die Komplexität der   Problem, das du lösen willst, aufgelegt   die Komplexität der Maschine, in der   es ist gelöst. Aus diesem Grund   Komplexität, die meisten unserer Programmierung   Projekte scheitern. Und doch, von all dem   Programmiersprachen von denen ich bin   bewusst, keiner von ihnen ist durchgebrannt   und entschieden, dass ihr Hauptentwurf   Ziel wäre es, die   Komplexität der Entwicklung und   Wartungsprogramme.

In der zweiten und späteren Ausgabe fügt er diese Fußnote (circa 2003) hinzu:

  

Ich nehme das zurück auf die 2. Ausgabe: Ich glaube, dass die Python   Sprache kommt dem am nächsten   genau das. Siehe www.Python.org.

Ich bin ein Dabbler mit Java, mit einem Hintergrund in Delphi (Pascal), C, C ++ und Python. Hier ist was ich wissen möchte:

  1. Was genau hat Eckel in Betracht gezogen, als er Python bei der Überwindung der Komplexität "besser" genannt hat, und sind seine Gedanken auf dem richtigen Weg mit anderen, die beide benutzt haben?

  2. Was denkst du über die Überwindung von Komplexität? Ist die kürzere und knappere Syntax von Python ein Schlüssel zur Überwindung der Komplexität (und so könnte beispielsweise Jython eine schöne Brücke der großen Java-Bibliotheken und Pythons knappe Syntax sein) oder ist die starke Tipp-Mentalität von Java, welche erbt diese Idee von C ++, die diese Idee von Simula geerbt hat, wie ich denke, ein Schlüssel zur Überwindung von Komplexität? Oder ist es der Rapid Application Designer (denke Delphi, oder für Java, die ausgezeichnete kostenlose NetBeans Fenster / Formular-Designer-Tools) oder Komponenten oder Bohnen oder J2EE? Was erobert alles für dich?

Dies ist bereits subjektiv markiert. [Bearbeiten]

Hinweis: Mehr zu Bruce 'Gedanken, warum er Python liebt, finden Sie hier. Ein Schlüsselzitat aus der Artikel:

  

Bruce Eckel: Sie sagen, Sie können halten   sieben plus oder minus zwei Stücke von   Informationen in deinem Kopf. Ich kann nicht   Erinnern Sie sich daran, wie Sie Dateien in Java öffnen.   Ich habe Kapitel darüber geschrieben. Ich habe es getan   es ein paar Mal, aber es ist zu viel   Schritte. Und wenn ich es tatsächlich analysiere,   Ich erkenne, dass dies nur ein albernes Design ist   Entscheidungen, die sie getroffen haben. Selbst wenn sie   bestand darauf, den Dekorateur zu benutzen   Muster in java.io, sollten sie haben   hatte einen Convenience-Konstruktor für   Dateien einfach öffnen. Weil wir uns öffnen   Dateien die ganze Zeit, aber niemand kann   erinnere dich wie. Es ist zu viel   Informationen, die Sie im Kopf haben.

Also, Brocken Theorie. Nach der Chunk-Theorie-Metrik tötet Python alle anderen Toten. Ich werde ihm das gewähren. Aber welche Metrik verwenden Sie? Ich würde gerne Leute einladen, sich für Java einzusetzen und sich Bruce zu widersetzen, wenn Sie das wollen.

[Bitte stimmen Sie nicht, um wieder zu öffnen, dieses Thema ist inhärent zündend, und meine Entgleisungen haben es mehr-so gemacht. Ich stimme den Moderatoren zu.]

    
Warren P 24.06.2010, 19:52
quelle

5 Antworten

5

Ich denke, Bruce hat sich an Fred Brooks erinnert, der in seinem Essay "No Silver Bullet" über Komplexität spricht und zwei Arten beschreibt. Der erste Typ ist in dem Problem enthalten, das Sie zu lösen versuchen, was er als wesentliche Komplexität bezeichnet und unabhängig von der Sprache, die Sie verwenden. Die zweite ist die Komplexität, die durch die von uns verwendeten Tools und Sprachen hinzugefügt wird - all die Dinge, die Sie beachten müssen, tragen nicht direkt zur Lösung des Problems bei. Durch diese Maßnahme hat Java viel mehr Komplexität als Python. Das einfachste Beispiel ist das kanonische Programm Hello World. In Python (und mehreren anderen Sprachen) ist es eine Zeile:

%Vor%

In Java ist es

%Vor%

das meiste hat nichts mit der Aufgabe zu tun, "Hallo Welt" zu drucken und ist im Grunde Lärm.

Es gibt mehrere Faktoren, die IMHO zur Komplexität von Java im Vergleich zu anderen Sprachen wie Python hinzufügen.

1) alles muss in einer Klasse sein. Dies zwingt Sie dazu, das OO-Paradigma auch dann zu verwenden, wenn es nicht angemessen ist, wie im obigen Beispiel, und fügen Sie viele unnötige Klassifizierungsklassen-Definitionen hinzu.

2) Obwohl es Sie zwingt, Klassen zu verwenden, ist es nicht vollständig objektorientiert. Damit meine ich, dass nicht alles ein Objekt ist, wie primitive Typen und Methoden. In Python können Sie alle eingebauten Typen ableiten und die Funktionen & amp; Methoden herum wie jedes andere Objekt.

3) Java ist nicht funktional - in der Tat geht es ihm aus dem Weg, um zu verhindern, dass Sie ein funktionelles Paradigma verwenden. Die Möglichkeit, Funktionen zu übergeben und Schließungen und Lambdas zu erstellen, kann viel Code vereinfachen. Am nächsten kommt man in Java mit anonymen inneren Klassen wie Callbacks.

3) Java zwingt Sie, überall Typdeklarationen einzufügen, was viel Unordnung hinzufügt, ohne nützliche Informationen hinzuzufügen. Dies ist nicht nur ein statisches vs. dynamisches Problem - es gibt statisch typisierte Sprachen wie Scala, die die Typen zu 90% der Zeit ableiten und das gesamte Rauschen ausschließen können.

4) Obwohl Java Sie zwingt, statische Typisierung zu verwenden, verwenden viele (vielleicht die meisten) realen Java-Programme die dynamische Typüberprüfung zu einem Teil der Zeit. Jedes Mal, wenn Sie eine Umwandlung von einem Objekt in einen bestimmten Typ durchführen, führen Sie eine dynamische Typprüfung durch - bevor Generika in Java 5 hinzugefügt wurden, bedeutete dies jedes Mal, wenn Sie beispielsweise eine Containerklasse verwendeten. Selbst bei Verwendung von generischen Containern werden einige ihrer Typprüfungen zur Laufzeit durchgeführt. Jedes Mal, wenn Sie eine XML-Datei mit Klassen- oder Methodennamen darin haben, müssen sie irgendwo im Code eine dynamische Typprüfung durchführen, um sicherzustellen, dass sie mit einer echten Klasse übereinstimmt. So viele Java-Programme haben immer noch die vermeintlichen "Gefahren" der dynamischen Typisierung, aber mit all der Ausführlichkeit, die Sie durch die statische Eingabe von Java erzwingen müssen.

Ich könnte weitermachen (und tue es oft), aber ich werde hier mit der Beobachtung aufhören, dass ich eine Menge Code gesehen habe, der in Python einfacher, sauberer und weniger komplex ist als in Java, aber nicht umgekehrt. Wenn mich jemand auf einige verweisen kann, würde ich es gerne sehen.

    
Dave Kirby 25.06.2010, 08:13
quelle
5
  

Bruce Eckel: Sie sagen, Sie können halten   sieben plus oder minus zwei Stücke von   Informationen in deinem Kopf. Ich kann nicht   erinnere mich, wie man Dateien in Java öffnet.

Ich kann:

%Vor%
  

Ich habe Kapitel darüber geschrieben. Ich habe es getan   es ein paar Mal, aber es ist zu viel   Schritte. Und wenn ich es tatsächlich analysiere,   Ich erkenne, dass dies nur ein albernes Design ist   Entscheidungen, die sie getroffen haben. Selbst wenn sie   bestand darauf, den Dekorateur zu benutzen   Muster in java.io, sollten sie haben   hatte einen Convenience-Konstruktor für   Dateien einfach öffnen.

Dies wird in wenigen Minuten gelöst, indem diese Hilfsmethode mit einer einfachen API geschrieben wird. Und es war . Wenn das die stärkste Kritik ist, die man gegen Java richten kann, bleibe ich deutlich unbeeindruckt.

    
meriton 24.06.2010 20:19
quelle
4
  

Und dennoch ist von allen Programmiersprachen, von denen ich weiß, keiner von ihnen völlig durchgeknallt und hat entschieden, dass ihr Hauptziel darin besteht, die Komplexität der Entwicklung und Wartung von Programmen zu überwinden.

Fast jede einzelne Sprache basiert auf der Überwindung der Komplexität. Es gibt kein anderes Ziel, das es zu verfolgen gilt. Assembly, C ++, Java, Python und praktisch jede andere vorhandene Sprache basiert auf der Vereinfachung der Programmierung.

  

Wie ist Python gut in der Komplexität?

Python hat definitiv einige der intuitivsten Syntax jeder Sprache IMHO. Die Verwendung der Blockeinrückung löst viele Probleme, und das meiste davon ist als nahe der normalen Sprache, wie Sie sollten . M = [x for x in S if x % 2 == 0] ist ein gutes Beispiel, siehe ein Python Buch für unzählige mehr.

  

Ist die kürzere und knappere Syntax von Python ein Schlüssel zur Überwindung der Komplexität?

Ich glaube, dass die einfache Syntax von Python eine gute Methode ist, Komplexität zu überwinden. Dies ist jedoch die einzige definitive Antwort, die ich Ihrer anderen Anfrage geben kann:

  

Was denkst du über die Überwindung von Komplexität?

Sie stellen die Frage, die der ganze Kern der Sprachtheorie ist, die Kämpfe einschließt, die wahrscheinlich bis zum Ende der Zeit wüten werden. statisch vs. dynamisch tippen ist eine solche Debatte. Es gibt eine Menge anderer Entwicklungen in der Sprachtheorie wie Procedural vs OO vs funktionale Sprachen und Aspect Oriented Programming, die versuchen, die Programmierung zu vereinfachen. Sehen Sie sich die neueste (oder eine beliebige) Version einer Sprache an, um einige Beispiele dafür zu sehen, was getan wird, um "Komplexität zu überwinden". Es wird niemals eine definitive Antwort geben, und eine vollständige Erörterung jedes Ansatzes würde einige Monate dauern, um sie zu lesen, und würde sich wahrscheinlich vollständig ändern, wenn Sie fertig sind. : D

    
Gordon Gustafson 24.06.2010 20:05
quelle
3

Für mich war der Wechsel von Java zu Python ein großer Gewinn. Ich kann Code schneller schreiben, mit den gleichen oder weniger Fehlern, und ihn einfacher modifizieren. Der Code bleibt auch viel lesbarer, wenn ich nach ein paar Monaten darauf zurückkomme, kann ich schneller herausfinden, was es macht (und es ohne große Probleme umschreiben, wenn ich es nicht kann).

Java, stark typisiert, erfordert eine Menge Arbeit, um richtige Typdefinitionen zu entwerfen und zu pflegen. Wenn Sie eine Variable als int deklarieren und dann entscheiden, dass sie eine float hätte sein sollen, müssen Sie diesen Typ in Ihrem gesamten Programm ändern. Speichern Sie diesen Wert in einem Array? Sie müssen diese Typdeklaration ebenfalls ändern. Entscheiden Sie, mehrere Klassen umzugestalten, um eine gemeinsame Schnittstelle zu verwenden? Sie müssen Funktionsdefinitionen in Ihrer Codebasis ändern, um sie zu handhaben. Wenn Sie ein besonders kompliziertes Design haben, müssen Sie sich mit vielen dieser Probleme auseinandersetzen.

Python hat auch eine Menge Unterstützung in der Sprache, um zu ändern, wie bestimmte Dinge funktionieren. Python-Dekoratoren zum Beispiel können eine Menge komplizierten Code abstrahieren (mit Caching umgehen oder Funktionen registrieren), um die Code-Wartung niedrig zu halten. Ausgefeilte IDEs können helfen, Ihren Code zu erhalten, aber Sie beginnen besser mit einer weniger komplizierten Sprache.

    
Chris B. 24.06.2010 20:04
quelle
2

Nachdem ich im letzten Semester ein A in meinem "OOP With Java" Kurs bekommen habe und seit ein paar Jahren in Python autodidaktisch bin, zusätzlich Interesse an Programmierung im Allgemeinen habe und mehrere K Zeilen in beiden Sprachen geschrieben habe (ohne die Kommentare), einschließlich einer Jack Lexer / Parser in Python (und das Äquivalent gesehen durchgeführt - - oder nicht - in Java von meinen Landsleuten), ich denke, ich habe genug Erfahrung, um zumindest ein paar Cent wert zu sein. Oder nicht, aber jetzt, wo ich fertig bin Tooting mein eigenes Horn können Sie selbst entscheiden;)

Zunächst stimme ich voll und ganz zu, dass es bei der Programmierung darum geht, die Komplexität zu reduzieren. Ich stimme auch zu, dass Java bei der Reduzierung der Komplexität keine großartige Arbeit leistet.

Zum Beispiel, um Benutzereingaben von der Kommandozeile zu bekommen?

Scanner input = new Scanner(new BufferedReader(System.in)); (Ich denke? Und es ist erst 2 oder 3 Monate her, seit ich das benutzt habe)

Python ist raw_input() und in 3.0 ist es einfach input()

Wie liest du aus einer Datei in Java? Nun, ehrlich gesagt, ich weiß es nicht. Wir haben nicht viel gemacht, und es war schlimmer als Scanner. Wie bereits erwähnt, ist die Komplexität von Java höher als jede andere echte Sprache, die ich kenne, aber nicht so schlimm wie " das " Sprache.

Ich denke, das Hauptproblem mit der Komplexität von Java findet sich im Beispiel meriton Anwendungen in der Verteidigung von Java. Anstatt großartige Community-APIs zu importieren und sie als Teil der Sprache zu implementieren, hat Java eine "Kern" -Sprache und APIs sind nur eine Erweiterung davon. Was ich interessant finde, ist der Reichtum von Tools, mit denen Java APIs und Dokumentation für diese APIs erstellen muss. Ich meine, du schreibst deinen Code, gibst einige Kommentare ein und wählst (zumindest in Eclipse) einen Gegenstand in einem Menü aus und du hast einige schöne Javadocs erstellt. Auch wenn es wunderbar ist, solch eine großartige Dokumentation zu haben, frage ich mich, ob sie sich nicht aus Notwendigkeit entwickelt hat, denn wenn man sich ein Programm anschaut, bekommt man keine Ahnung, was Java tut. Scanner? Gepufferter Reader? WTF ?? Es gibt Schichten und Schichten von zusätzlicher Komplexität, die abstrahiert werden könnten (und einige argumentieren sollten). Hey, ich kann eine Datei in assembly mit weniger Aufwand als Java öffnen und lesen. Natürlich ist der Vergleich einiger Zeilen wirklich ziemlich trivial und ziemlich wertlos, aber der Punkt ist, dass Java oft Komplexität einführt, anstatt sie zu lösen.

Hier ist der Hauptgrund, dass Python meiner Meinung nach den Vorteil hat: Nützliche Typen / Funktionen sind in die Sprache integriert und sie sind sehr gut benannt (und zumindest, wenn sie nicht besonders gut benannt sind) zumindest einen Hinweis).

Nehmen wir beispielsweise an, ich möchte eine kommagetrennte Datei öffnen (ohne zusätzliche APIs oder Importe zu verwenden) und jedes Element in einer generischen Sammlung speichern.

In Python (2.6+ oder 2.5 mit einem Import von future ) sind es buchstäblich zwei Zeilen:

%Vor%

erledigt.

In Java glaube ich nicht, dass Sie das tun können, ohne externe Klassen zu importieren. Natürlich denke ich, dass Sprache entweder nur Präferenz und möglicherweise Genetik oder Training ist.

Manche Leute glauben, dass statische oder dynamische Typen die geringste Komplexität einführen. Ich falle in das letztere Lager, aber ich verstehe das Argument. Schließlich wird sich Ihr Compiler beschweren, wenn Sie versuchen, einen anderen Typ zu übergeben, und Sie wissen immer, was etwas sein soll, weil es entweder explizit deklariert oder als solches interpretiert wird. Natürlich fügt dies die Komplexität der Casting-Operation hinzu (so gering sie auch sein mag), aber es bringt nicht den Gedanken, "Wie in der Welt wurde die ganze Zahl in eine float | string umgewandelt?"

Aber wenn es darauf ankommt, können die meisten Leute sich ein Python-Programm ansehen und verstehen, was vor sich geht. Einsteiger-Programmierer bis hin zu extrem fortgeschrittenen Programmierern werden in der Lage sein, das Programm und den Zweck zu verstehen, indem sie es betrachten. Ich habe gerade ein Plugin für Bazaar geschrieben, indem ich die (schlechte) Dokumentation lese und den Code für die Bazaar-Funktionen lese. Es dauerte relativ wenig Aufwand und sie haben sogar ein paar benutzerdefinierte Definitionen. Das gleiche gilt für einige golly Skripte. Bei der Codierung von Inhalten in meiner Java-Klasse konnte ich auch andere Klassen verstehen. Ich glaube jedoch, dass ich in dieser Klasse einen großen Vorteil hatte, da die Java-Konzepte sehr ähnlich wie Python-Konzepte sind. Oder umgekehrt, je nachdem, was Sie bevorzugen. (Oder sie sind beide ähnlich Lisp Konzepte;)

Ich denke ehrlich, ich denke, die Komplexität ist nur die Lernkurve. Python hat eine sehr flache Lernkurve, wobei die Kraft eine umgekehrte Funktion zur Lernkurve ist. Java hat eine steilere Lernkurve, mit einer linearen Leistungskurve (2x? 3x?) Beziehung. Sobald Sie die Sprache und die zugrundeliegenden Konzepte gelernt haben, ist die Komplexität für beide Sprachen auf nahezu Null reduziert, denke ich.

    
Wayne Werner 25.06.2010 13:27
quelle

Tags und Links