Ruby: The Bad Parts [geschlossen]


20

Ich habe kürzlich Crockfords Buch "Javascript: The Good Parts" gelesen und eine der zugrunde liegenden Prämissen war, dass Programmiersprachen schlechte Sätze von Funktionen haben können, die Programmierer vermeiden sollten.

Ich bin ein Rubinist und obwohl ich die Sprache liebe, ist es immer wertvoll, eine Perspektive zu bekommen. Also, was sehen Sie als das schlechteste Merkmal (zB Methoden, Klassen, Methoden) in Ruby? Ich möchte hier keine Auseinandersetzung über die Vorzüge der Sprache selbst oder über ihre Geschwindigkeit usw. beginnen. Ich würde eher eine Diskussion darüber bevorzugen, welche Funktionen Sie aufgrund früherer Erfahrungen für gefährlich / lästig / schmerzhaft halten.


1
Ich war noch nie ein Fan davon, das Wort "Ende" verwenden zu müssen, und dann wird die Mischung davon mit "{" und "}" noch ärgerlicher. Ich schätze entweder die Syntax im Python-Stil oder die Syntax von {&}. Obwohl man darüber hin und her streiten könnte, hat es letztendlich viel mit persönlichen Vorlieben zu tun. Ich hörte jemanden sagen, dass Ruby die hässlichsten Teile von Python und Perl nimmt und sie zusammenfügt. Ich genieße es jedoch, Ruby zu lernen.

Ich mag diese Frage eigentlich sehr und würde mich auf Antworten freuen, habe aber trotzdem dafür gestimmt, sie zu schließen. Ich denke nicht, dass es für Stack Overflow geeignet ist (da es möglicherweise zu subjektiv / argumentativ, offen usw. ist).
Stakx

Ich denke, es lohnt sich zu diskutieren, da es gefährliche Praktiken aufzeigen könnte, die vermieden werden sollten. Ich verstehe Ihren Standpunkt jedoch und habe die Frage enger gefasst.

9
Ich verstehe nicht, inwiefern sich diese Frage deutlich genug unterscheidet, z. B. Was möchten Sie in der Ruby-Sprache verbessern? , Was ist der Ruby - Gotchas sollte ein Neuling gewarnt werden? , Was sind die realen Probleme mit Ruby? oder eine der anderen Millionen Fragen zu den Schmerzpunkten von Ruby. Selbst wenn diese Frage entwickelt wird, um sich von den anderen zu unterscheiden, gehört sie zum Programmierer.SE und nicht zu StackOverflow.
Jörg W Mittag

2
Ich muss meine Augen untersuchen lassen - ich dachte, der Titel dieser Frage wäre "Ruby: The Brad Pitts".
Osterwal

Antworten:


8

Sie sollten sich Python vs Ruby ansehen : Eine Schlacht zum Tod von Gary Bernhardt. Er macht das Zitat:

Genau die Dinge, die ich in Ruby als hässlich empfinde, ermöglichen erstaunliche Ruby-Software wie RSpec, die Python (bei der aktuellen Implementierung) niemals haben könnte.

Während er viel über Python spricht, berührt er eine Menge Dinge, die in Ruby nur seltsam sind. Eines der großen übergreifenden Themen ist das Patchen von Affen .

Ruby-Objekte (im Gegensatz zu Objekten in anderen objektorientierten Sprachen) können individuell geändert werden. Sie können Methoden immer auf Objektbasis hinzufügen. In Ruby können das Verhalten oder die Funktionen eines Objekts von denen der Klasse abweichen.

Obwohl dies viel Flexibilität bietet und einige der beliebtesten und kompliziertesten Juwelen von Ruby unterstützt, kann es Sie in den Hintern beißen, wenn Sie versuchen, ein Problem zu debuggen, ohne zu bemerken, dass eine Bibliothek irgendwo eine Kernmethode geändert hat.


Mit Javascript können Sie Objekte auch so behandeln.
03.11.14

8

Manche Leute denken nur an Rubin in Bezug auf Rubin auf Schienen und es ist irgendwie ärgerlich, weil die Sprache für sich ziemlich gut steht.


7

Ich denke, das Schlimmste ist open classes, dass Sie das Verhalten aller aktuellen und zukünftigen Instanzen der geänderten Klasse global ändern können.

Der problematische Teil dieser Funktion besteht darin, dass diese (globalen) Änderungen zur Laufzeit auftreten, wenn der Ruby-Interpreter auf die Definition stößt. Dies kann lange dauern, nachdem Sie bereits einige Objekte instanziiert haben, die nun plötzlich ihr Verhalten ändern.

In einer großen Codebasis kann dies zu sehr, sehr schwer auffindbaren Fehlern führen - zumal dies durch Rubys schwache Debug-Story (im Vergleich zu z. B. der CLR oder JVM) und die Verwendung anderer Funktionen (z. B. eval) in diesem Kontext verstärkt wird Es ist ziemlich schwierig, den Ort zu finden, an dem diese globale Veränderung stattgefunden hat. dh wenn Sie bereits den Punkt erreicht haben, an dem Sie vermuten, dass die „richtige“ Klasse die Störung verursacht hat! Nach meiner Erfahrung beginnt man normalerweise mit einer wilden Gänsejagd, da die Probleme anfangen, an einem Objekt aufzutauchen, das den wirklichen Täter benutzt.

Das Beste wäre also, entweder die Verwendung offener Klassen einzustellen ( #extendund die Änderungen in ein zu setzen, Moduleist meiner Meinung nach viel sicherer, einfacher zu verstehen und besser zu testen) oder wenn Folgendes nicht vermieden werden kann:

  • Klassen nur mit neuem Verhalten erweitern (dh bestehendes Verhalten nicht überschreiben)
  • haben eine definierte Stelle im Quelltextbaum, an der alle Erweiterungen mit offenen Klassen platziert werden müssen
  • Verwenden Sie #evalund friends nicht, um offene Klassen zu erstellen
  • Stellen Sie alle Verwendungen offener Klassen in ein großes, sichtbares Diagramm, in dem alle Entwickler sie sehen können - und machen Sie klar, dass alle Änderungen an ihnen „architektonische Entscheidungen“ sind, die sich auf die gesamte Codebasis auswirken (was sie tun) und nicht den Ort für nützliche schnelle Hacks für Ihre aktuelle Aufgabe

5

Größter Grund, warum ich Ruby nicht benutze: Es ist langsamer als Melasse im Januar am Nordpol während einer Eiszeit. Benchmarking von Sprachen ist eine ungenaue Wissenschaft, aber Ruby erscheint drastisch langsamer als selbst JavaScript und Python.


Das war auch meine Erfahrung.
Chuck Stephanski

2
Für welche von Ihnen entwickelte Anwendung war Ruby zu langsam? Ich meine, ich glaube dir, wenn du sagst, dass es langsam ist, aber wie hat es dich davon abgehalten, dein Ziel zu erreichen?
David

1
Ich denke, Ruby ist großartig, wenn Sie so etwas wie einen Prototyp erstellen und schnell erledigen möchten, etwas, das nicht riesig ist und keine massive Zahlenverarbeitung durchführen wird. Wenn Sie damit rechnen, ständig viele CPU-Zyklen zu kauen, kann jeder gute Programmierer so etwas wie C oder C ++ verwenden.
Jeff Welling

1
@David: Ich würde überlegen, Ruby für einfachen DNA-Sequenzverarbeitungscode zu verwenden, aber das tue ich nicht, weil Python eine ähnliche Nische ausfüllt, ähnliche Funktionen hat und viel schneller ist. Wenn ich bereit bin, auf eine niedrigere Stufe zu wechseln, ist D noch schneller und noch praktischer.
Dsimcha

1
@ Jeff: Einverstanden, aber C und C ++ sind ein Problem beim Schreiben. Der Punkt von Hochsprachen wie Ruby ist es, den Umgang mit diesem Problem so weit wie möglich zu vermeiden. Je langsamer sie sind, desto weniger gut erfüllen sie dieses Ziel. Ruby ist auch für eine dynamische Hochsprache langsam. Das und NumPy / SciPy sind der Grund, warum ich stattdessen Python verwende, wenn ich eine dynamische Hochsprache benötige.
dsimcha

4

Wenn dies auf Ruby on Rails erweitert werden kann, dann:

  1. Die Tatsache, dass die Datenbanklogik jeder einzelnen Tabelle einen auto_incrementPrimärschlüssel gibt, einschließlich Tabellen, die diese nicht benötigen und nicht benötigen sollten.

  2. Die Tatsache, dass zusammengesetzte Schlüssel überhaupt nicht unterstützt werden.

Für Ruby wäre meine Beschwerde dieselbe wie für jede Sprache, bei der Sicherheit gegen Ausdrucksstärke getauscht wird. Es ist einfach, mit nur wenig Code viel zu tun, aber es ist genauso einfach, mit jeder Menge Code ein großes Durcheinander zu machen.


Bitte sehen Sie sich meine Änderungen an, da ich den Umfang der Frage eingegrenzt habe. Ich beginne eine weitere parallele für Rails, wenn diese Frage mit Änderungen genehmigt wird.

1
Es tut uns leid, aber Sie täuschen sich, nicht jeder Tisch in einer Rails-App muss eine haben auto_increment ID angegeben werden. Insbesondere für Verknüpfungen zwischen has_and_belongs_to_many wird empfohlen, ausdrücklich KEINE ID-Spalte anzugeben.
Brett Bender

@Brett - Sind das relativ neue Ergänzungen? Als ich Anfang 2008 damit spielte, hatte es definitiv nicht diese Eigenschaften. Auf jeden Fall ist es toll, dass sie jetzt verfügbar sind.

1
@aroth: Ich bin mir nicht sicher, ob alle anderen "relativ neu" als "innerhalb der letzten drei Jahre" bezeichnen würden :-)

Es gibt eine Alternative zum ActiveRecord von Rails ActiveRecord DataMapper , der nicht so kritisch ist wie ActiveRecord .
Endy Tjahjono,

3

Ruby umfasst Metaprogrammierung (Reflektion, Selbstbeobachtung), Multiparadigma-Programmierung und Dynamik auf einer ungewöhnlichen Ebene. Es ist einfach, sich mit Kraft und Flexibilität in den Fuß zu schießen.

Lästig? Ruby hat die Fähigkeit, extrem lesbar oder unterbrechungsfrei zu sein. Ich habe Code gesehen, der aussieht, als gehörte er in ein Bash-Skript.

Schlechte Praktiken? Einige Rubinisten schätzen Klugheit über Weisheit. Sie schreiben und teilen Tricks, die ihre Klugheit demonstrieren, aber dies schafft unlesbaren und fragilen Code.

Nebenbei bemerkt: Javascript war von Natur aus eine Katastrophe, und das Buch "The Good Parts" versucht, seine verborgene Schönheit zu extrahieren. Perl, eine Sprache, die "Es gibt mehr als einen Weg, es zu tun" (dh Flexibilität) populär machte, hat ein ähnliches Buch in "Perl, Best Practices". Perls Geschichte basiert auf Experimenten und hart erarbeiteten Erfahrungen. "Best Practices" stehen für sein Wissen. Perl 6 wird meiner Meinung nach ein Neustart der Sprache sein, der auf diesen Kenntnissen und mehr basiert. Ruby kann unter ähnlichen Problemen leiden.

@James und for-Schleifen ... Wenn Sie eine for-Schleife in Ruby ausführen, wird ".each" aufgerufen. Daher ist "for" syntaktischer Zucker für Personen, die sich mit C-Schleifen wohler fühlen. Aber als Rubyist werden Sie ständig Iteratoren wie .map, .inject, .each_with_object verwenden. Sie müssen niemals eine for-Schleife mit so etwas wie "i = 0; i> 6; i ++" in Ruby schreiben, und am Ende verlieren Sie die Gewohnheit. @andrew ... beredtes Rubin unterstützt keine Schleifen.


-1

Hier geht es mehr um die Programmierer als um die Sprache, aber warum hassen Ruby-Programmierer Schleifen so sehr?

Mir ist klar, dass Ruby:

someCollection.each do |item|
   ...
end

aber ich habe noch nie gesehen, dass in Situationen, in denen eine for-Schleife nicht genau das gleiche tun würde.

Ich habe mehrmals gefragt und nie eine gute Antwort auf diese Frage bekommen.

Wenn es nur eine Art Sache ist, bin ich froh, das zu akzeptieren, aber ich habe gesehen, wie Ruby-Programmierer sich wirklich darüber aufgeregt haben, und ich bin wirklich neugierig.


1
Einmal bekam ich sogar die Antwort "Es ist weniger Tastendruck", was eindeutig falsch ist ... :-)
James

2
Zwei Theorien: 1) Die Verwendung von forSchleifen ist etwas, was n00bs tun. Leute, die C in Ruby programmieren. 2) Blöcke werden in Ruby häufig verwendet, daher ist die Verwendung von nicht blockartigen Elementen nur eine zusätzliche mentale Anstrengung.
Andrew Grimm

3
Während ich gerade angefangen habe, Ruby zu lernen, sind Blöcke etwas, das ich wirklich mag und vermisse, wenn ich versuche, Python zu verwenden. Würde eine for-Schleife dasselbe tun? Natürlich passt diese Art von Style für mich mehr zu meinen Vorlieben als zu einer for-Schleife.
Jetti

2
@andrew Um ehrlich zu sein, ist Ihre erste Antwort genau die Art von Müll, die ich zurückbekommen habe, als ich zuvor gefragt habe. Kein wirklicher Grund, mit einer subtilen Beleidigung an der Spitze. @ Wayne, @ Jetti und @ Andrews 2. Antwort: Danke. Fair genug dann.
James

1
Wenn Sie "erweitert" für Schleifen meinen (auch bekannt als für <value> in <expression> do ...), gibt es keinen Unterschied, abgesehen davon, dass #jedes in Gebrauch ist und näher an den häufig verwendeten Cousins ​​#inject, #collect, # liegt. ablehnen usw. Wenn es sich um indizierte Schleifen im C-Stil handelt (auch bekannt als für int i = 0; i <was auch immer; ++ i), besteht der Unterschied darin, dass a) Fehler "um eins" unmöglich sind und b) dass es die Absicht Ihrer Schleife klar macht - #each bedeutet "für jedes Element einen Nebeneffekt erzeugen". Eine for-Schleife erfordert, dass Sie die gesamte Schleife lesen, um das Wesentliche ihres Zwecks herauszufinden.
Alexander Battisti

-1

Ich würde generell Dinge vermeiden, die hinzugefügt wurden, um mit anderen Sprachen abwärtskompatibel zu sein. Zum Beispiel Perlismen und for x in y.


Ich habe gerade eine Antwort über Ruby-Programmierer und für Schleifen gepostet, und wenn Sie das erklären können, wäre ich Ihnen dankbar :-)
James
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.