Gibt es Techniken in der Programmierung, die Sie als überbeansprucht empfinden (dh viel überbeansprucht, als was sie sein sollten) oder missbraucht oder ein bisschen für alles benutzt haben, ohne eine wirklich gute Lösung für viele der Probleme zu sein, die die Leute versuchen damit lösen.
Es können reguläre Ausdrücke sein, eine Art Entwurfsmuster oder vielleicht ein Algorithmus oder etwas völlig anderes. Vielleicht denken Sie, die Leute missbrauchen Mehrfachvererbung usw.
Antworten:
Kommentare im Code
Ich wünschte nur, die Universitätsprofessoren würden verstehen, dass sie ihren Studenten nicht beibringen müssen, 10 Kommentarzeilen zu schreiben, wobei der folgende Code eine for-Schleife ist und von 1 bis zur Zahl x iteriert. Ich kann das im Code sehen!
Bringen Sie ihnen bei, zuerst selbstdokumentierenden Code zu schreiben und dann angemessen zu kommentieren, was als zweites nicht ausreichend selbstdokumentierend sein kann. Die Software-Welt wäre ein besserer Ort.
quelle
Clean Code
, stellt Fowler klar fest, dass veraltete Dokumentation schlechter ist als keine Dokumentation, und dass alle Kommentare dazu neigen, veraltet zu werden und vom dokumentierten Code abzuweichen. In diesem ganzen Buch geht es darum, selbstdokumentierenden Code zu schreiben.Das Singleton-Entwurfsmuster.
Sicher, es ist ein nützliches Muster, aber jedes Mal, wenn ein neuer Programmierer von diesem Muster erfährt, versucht er, es auf jede einzelne Klasse anzuwenden, die er erstellt.
quelle
$this->
. PHP ist eine faule Sprache, daher kann ich nicht erwarten, dass die Frameworks exzellent sind.Das Schlimmste, um dumme Programme zu schützen. alles in einen Versuchsfang stecken und nichts mit dem Fang machen
Ich schaudere, wenn ich einen Versuchsfang sehe, der nichts bewirkt und auf dumme Logik ausgelegt ist. Im Allgemeinen werden Versuchsfänge überstrapaziert, in einigen Fällen sind sie jedoch sehr nützlich.
quelle
Verlassen Sie sich auf StackOverflow, um Ihre Probleme zu lösen, anstatt es auf die harte Tour zu schaffen.
Neue Programmierer, die die Fülle des Wissens in SO-Posts (zu oft) finden, bevor sie überlegen und Dinge ausprobieren.
Zu meiner Zeit mussten wir aus Büchern codieren, kein Internet, kein SO. Jetzt geh runter von meinem Rasen.
quelle
OOP offensichtlich. Es ist sehr wertvoll, aber wenn es missbraucht wird , kann es anderenfalls den Code ziemlich leicht verdecken (einige Beispiele für die S4-Programmierung in R fallen mir ein), und es kann einen enormen Overhead verursachen, der unnötig ist und Sie viel Zeit für die Leistung kosten kann.
Eine andere Sache ist, dass (in zB Perl) OOP oft darauf hinausläuft, dass das Gleiche umgekehrt geschrieben wird:
result = $object ->function(pars)
Stattdessen istresult = function(object, pars)
dies manchmal sinnvoll, aber wenn es mit prozeduraler Programmierung vermischt wird, kann es das Lesen des Codes ziemlich verwirrend machen. Und abgesehen davon führen Sie einfach mehr Overhead ein, wenn das Design dadurch nicht verbessert wird. Es kommt auch darauf an, was über das Singleton-Muster gesagt wird: Sollte verwendet werden, aber nicht auf allen.Ich benutze OOP selbst, aber in meinem Bereich (wissenschaftliches Rechnen) ist die Leistung eine große Sache, und OOP wird dort oft missbraucht, da heutzutage alle Studenten Java bekommen. Es ist großartig, um größere Probleme zu lösen, zu konzipieren und so weiter. Wenn Sie jedoch z. B. mit DNA-Sequenzen in BioPerl arbeiten, können Sie die Berechnungszeit verzehnfachen, wenn Sie die Objekte jedes Mal verwenden und konsequent mit Gettern und Setzern arbeiten. Wenn Ihr Code ein paar Tage anstatt ein paar Stunden ausgeführt wird, ist dieser Unterschied wirklich wichtig.
quelle
Foo.DoX().DoY().DoZ()
) ist zwar nett, aber definitiv nicht die einzige Möglichkeit, etwas zu tun . Funktionszusammensetzung (wiedoZ . doY . doX $ foo
ist eine absolut gültige Alternative.Nachdem ich einige Jahre in ASP.NET Webforms verbracht habe, muss ich eindeutig sagen:
Die intelligente Benutzeroberfläche
Während es durchaus möglich ist, mehrschichtige, testbare Anwendungen in Webforms zu erstellen, ist es für Entwickler in Visual Studio zu einfach, Formulare mit nur einem Klick an ihre Datenquelle zu binden, da sich die Anwendungslogik um den gesamten UI-Code dreht.
Steve Sanderson erklärt dieses Anti-Pattern viel besser als ich es in seinem Pro ASP.NET MVC-Buch könnte:
quelle
Ich sehe das gelegentlich und es resultiert normalerweise daraus, dass man boolesche Ausdrücke nicht vollständig versteht.
quelle
bool
s beginnend mitis
oderhas
, müssen Sie Ihren Code nicht expliziter mit machen= true
.Neuimplementierung der Kernfunktionalität (oder anderweitig bereitgestellter Funktionen), entweder aufgrund der Unkenntnis ihrer Existenz oder aufgrund eines wahrgenommenen Anpassungsbedarfs.
quelle
Erbe.
Nicht erzwingen ist dort, wo es keinen Sinn ergibt.
quelle
Anpassen von Standard-Software.
Obwohl ich zugeben kann, dass dies nützlich sein kann, frage ich mich, wie viel Geld dafür ausgegeben wird, kleine Dinge für fragwürdige Gewinne zu erledigen. Hier kann ein Unternehmen Hunderttausende, wenn nicht Millionen von Dollar für Lizenzen für eine Software ausgeben, die dann angepasst wird, da sie so konfigurierbar, bearbeitbar und flexibel ist, dass sie standardmäßig nicht viel bewirkt. Am Ende ist es eine benutzerdefinierte Anwendung, da der gesamte neue Code hinzugefügt wurde, was ursprünglich gekauft wurde.
quelle
Verwenden des Compliers als Debugger.
Ignorieren Sie die entsprechenden Warnungen oder schalten Sie sie vollständig aus.
Globale Variablen.
quelle
Alle Entwurfsmuster.
Sie sind wie Salz oder Zucker. Einige von ihnen auf Ihrem Essen machen es großartig, viele von ihnen machen Ihr Essen zum Kotzen.
Versteh mich nicht falsch. Design Patterns sind wunderbare Techniken. Ich habe sie oft benutzt. Aber manchmal finde ich Programmierer (einige von ihnen meine Ex-Chefs), die diese "Sie müssen ein Entwurfsmuster verwenden" hatten, auch wenn das Problem nicht passt !!!
Ein Beispiel ist das "Besuchermuster", das sich eher an "lineare / sequentielle Sammlungen" richtet. Ich musste einmal mit einer Baumdatenstruktur arbeiten. Um jeden Artikel zu "besuchen", codiere ich eine Nicht-Design-Pattern-Methode, und ein ehemaliger Chef besteht darauf, das "Visitor Pattern" zu verwenden oder anzupassen. Dann suche ich im Internet nach einer zweiten Meinung. Nun, andere Programmierer hatten die gleiche Situation und die gleiche Lösung. Und nennen Sie es das "Tree / Hierarchical Visitor Pattern" (Baum / Hierarchisches Besuchermuster) als NEUES Entwurfsmuster
Ich hoffe, dass es in einer neuen Version des Buches "Design Patterns" als neues Muster zu den bestehenden hinzugefügt wird.
quelle
Ausnahmen als Flusskontrolle verwenden. Ähnlich wie diese Antwort , aber anders.
Das Verschlucken von Ausnahmen ist eine schlechte Form, da sie mysteriöse, schwer zu findende Fehler in Code einführt. Die Verwendung von Ausnahmen als Ablaufsteuerung ist dagegen schlecht, da der Code dadurch weitaus ineffizienter als er sein könnte und konzeptionell schlampig ist.
Die Ausnahmebehandlung sollte nur verwendet werden, um wirklich außergewöhnliche (duh), unvorhergesehene Szenarien zu behandeln, und nicht, wenn ein Benutzer ein alphabetisches Zeichen eingibt, für das eine Zahl erwartet wird. Diese Art von Ausnahmebedingungsmissbrauch ist unter schlechten Programmierern in der Java-Welt äußerst verbreitet.
quelle
Ich werde mit Unflexibilität durch übermäßiges Verstecken von Daten gehen.
Wir alle wissen, dass Abstraktion und das Ausblenden der Implementierung gut sind, aber mehr ist nicht immer besser. Wenn Sie dies übertreiben, erhalten Sie ein unflexibles Ergebnis, das Änderungen der Anforderungen nicht bewältigt. Um die Änderung zu verarbeiten, müssen Sie nicht nur die Klasse ändern, die diese Änderung verarbeiten muss, sondern Sie müssen auch eine Methode erstellen, mit der auf die Informationen zugegriffen werden kann, die zuvor nicht benötigt wurden, obwohl sich Datenschichten verstecken.
Das Problem ist, wie bei allen Problemen, bei denen es darum geht, für jeden Kontext das richtige Gleichgewicht zu finden, dass es Erfahrung erfordert.
quelle
Belichten von internen Arrays
Laut http://www.oracle.com/technetwork/java/seccodeguide-139067.html
quelle
Veränderlicher Zustand und Schleifen. Sie brauchen sie fast nie und Sie bekommen fast immer besseren Code ohne sie.
Dies wird beispielsweise direkt von einem StackOverflow-Thread übernommen:
Sie machen beide dasselbe. Aber ich habe keine Ahnung, was sie tun. Glücklicherweise erklärt die Frage tatsächlich, was sie tun, sodass ich sie wie folgt umschreiben konnte:
Es gibt keine Schleifen und keinen veränderlichen Zustand. Okay, keine expliziten Schleifen und keine Schleifenzähler.
Der Code ist viel kürzer, viel einfacher, viel weniger fehleranfällig als vielmehr eine Beschreibung dessen, was der Code tun soll (insbesondere im Ruby-Fall sagt er ziemlich direkt "Gruppiere die Dinge nach Typ"). Es besteht keine Gefahr, dass das Ende des Arrays verrutscht, Zaunpfostenfehler oder einzelne Fehler mit den Schleifenindizes und Beendigungsbedingungen auftreten, da keine Schleifenindizes und Beendigungsbedingungen vorliegen.
quelle
(acc[thing.type] || (acc[thing.type] = []))
"= [thing] thing", unless you want to add
zweimal auf der Liste stehen sollte ... Oder vermisse ich etwas?Verspottung. Es bringt zu viele künstliche Anforderungen für eine übermäßige Entkopplung in Ihren Code mit sich, führt zu überentwickeltem Ravioli-Code und zwingt OO-artiges Design in Ihren Hals, wenn ein prozeduraleres oder funktionaleres Design eine einfachere Lösung für Ihr Problem sein könnte.
quelle
Delphi-Programmierer auf der ganzen Welt haben in den letzten zwei Jahren herausgefunden, wie schlecht es ist, Zeichen-Arrays aufgrund der vollständigen Unicode-Konvertierung zum Speichern von Bytes zu verwenden
Und "bald" werden wir erfahren, wie schlecht es ist, Ganzzahlen in Listen zu speichern, wenn wir die Änderung auf 64-Bit vornehmen möchten .
quelle
Eigenschaften. Ich weiß, dass dies umstritten ist, aber ich habe das Gefühl, dass Eigenschaften in .net stark überbeansprucht werden.
Was ist der Unterschied zwischen diesen beiden Zeilen?
Für den Entwickler ist der Unterschied: absolut nichts. Die kompilierter Form ist ein winzig bisschen anders, wenn Sie also eine Bibliothek schreiben, und diese Bibliothek wird in Programmen aktualisiert werden, und Sie können die Programme nicht neu kompilieren selbst (zum Beispiel , wenn Sie eine Schnittstelle für Plugins schreiben , welche sollten für alle Versionen Ihrer Software funktionieren), dann sollten Sie keine öffentlichen Felder verwenden, da Sie diese nicht durch Eigenschaften ersetzen können. In jedem anderen Fall gibt es keinen Unterschied zwischen der Verwendung eines Felds oder einer Auto-Eigenschaft ohne Modifikatoren.
quelle
YAGNI
aber ich fühle mich in diesem Fall abweichend kostet nichts);
zu{ get { ... } set { ... } }
mehr Arbeit als{ get; set; }
zu{ get { ... } set { ... } }
?