Welche Programmierpraxis, die Ihnen einst gefallen hat, haben Sie seitdem anders überlegt? [geschlossen]

99

Während wir programmieren, entwickeln wir alle Praktiken und Muster, die wir verwenden und auf die wir uns verlassen. Mit der Zeit stellen wir jedoch fest, dass einige Praktiken, die wir einst für großartig hielten, nicht (oder nicht mehr anwendbar) sind, wenn sich unser Verständnis, unsere Reife und sogar unser Technologieeinsatz ändern.

Ein Beispiel für eine Praxis, die ich einmal ziemlich oft angewendet habe, aber in den letzten Jahren geändert habe, ist die Verwendung des Singleton-Objektmusters .

Durch meine eigenen Erfahrungen und langen Debatten mit Kollegen habe ich festgestellt , dass Singletons nicht immer wünschenswert sind - sie können das Testen erschweren (indem sie Techniken wie das Verspotten hemmen) und unerwünschte Kopplungen zwischen Teilen eines Systems erzeugen. Stattdessen verwende ich jetzt Objektfabriken (normalerweise mit einem IoC-Container), die die Art und Existenz von Singletons vor Teilen des Systems verbergen, die sich nicht darum kümmern - oder wissen müssen. Stattdessen verlassen sie sich auf eine Fabrik (oder einen Service-Locator), um Zugriff auf solche Objekte zu erhalten.

Meine Fragen an die Gemeinschaft im Geiste der Selbstverbesserung lauten:

  • Welche Programmiermuster oder -praktiken haben Sie in letzter Zeit überdacht und versuchen nun zu vermeiden?
  • Womit haben Sie sich entschieden, sie zu ersetzen?
LBushkin
quelle

Antworten:

159


//Coming out of university, we were taught to ensure we always had an abundance 
//of commenting around our code. But applying that to the real world, made it 
//clear that over-commenting not only has the potential to confuse/complicate 
//things but can make the code hard to follow. Now I spend more time on 
//improving the simplicity and readability of the code and inserting fewer yet 
//relevant comments, instead of spending that time writing overly-descriptive 
//commentaries all throughout the code.


Luke Baulch
quelle
+1. Ich wollte gerade die gleiche Antwort posten. Ich habe vor einigen Wochen einige meiner alten Programmieraufgaben auf einer Archiv-CD gefunden. Es sah alles gleich aus. Es gab fast ein 1: 1-Verhältnis von Kommentarzeilen zu Codezeilen.
Michael Moussa
32
Klingt so, als hätten Sie falsch kommentiert , nicht zu viel. Code spricht nicht für sich. Nein, das tut es wirklich nicht. Lesen Sie den neuesten NT Insider, um sich darüber zu informieren. Wenn Sie glauben, dass Kommentare überflüssig sind, liegen Sie entweder falsch oder Sie machen es falsch. Die Universitäten lehren anscheinend kein korrektes Kommentieren (oder Fehlerverfolgung oder Versionskontrolle ... * seufz *). Es gibt viel zu wenige Kommentare. (und weniger gute)
Thomas
5
Code Complete enthält gute Tipps zum Kommentieren und die Daten zum Sichern.
Thomas
20
Kommentare sollten verwendet werden, um zu beschreiben, warum der Code das tut, was er tut (wenn es nicht offensichtlich ist), nicht was der Code tut. Eine mögliche Ausnahme ist ein verrücktes bisschen Twiddling / Sprach-Hack, wie Carmacks magische Nummer 0x5f3759df.
Chris Simmons
6
@Thomas: Ich persönlich denke, das Problem ist, dass das Unterrichten von guten Kommentaren nichts ist, was eine Universität Studenten zeigen kann. Fast alle Programme an Schulen sind einmalig; Die Schüler können nicht auf Code zurückblicken, den sie vor einem Jahr geschrieben haben, und verstehen ihn überhaupt nicht. Außerdem unterrichten untergeordnete Klassen wirklich einfache Codierungskonzepte - das Kommentieren auf dieser Ebene ist aufgrund des Geschehens fast zwangsläufig mühsam. Mit anderen Worten, es ist, als würde man versuchen, jemandem das Schwimmen in einem Planschbecken beizubringen. Es ist einfach nicht der richtige Kontext für sie, um die Bewegungen zu verstehen.
Dan Lew
117

Einzelne Rückgabepunkte.

Ich habe einmal einen einzelnen Rückgabepunkt für jede Methode bevorzugt, weil ich damit sicherstellen konnte, dass die von der Routine benötigte Bereinigung nicht übersehen wurde.

Seitdem bin ich zu viel kleineren Routinen übergegangen - damit die Wahrscheinlichkeit, dass die Bereinigung übersehen wird, verringert wird und der Bedarf an Bereinigung verringert wird - und habe festgestellt, dass frühe Rückgaben die scheinbare Komplexität (die Verschachtelungsebene) des Codes verringern. Artefakte des einzelnen Rückgabepunkts - Beibehalten von "Ergebnis" -Variablen, Beibehalten von Flag-Variablen, Bedingungsklauseln für nicht bereits erledigte Situationen - lassen den Code viel komplexer erscheinen als er tatsächlich ist, erschweren das Lesen und Verwalten. Frühe Exits und kleinere Methoden sind der richtige Weg.

Carl Manaster
quelle
3
Ich bin damit einverstanden, wenn sie mit Datentypen kombiniert werden, die sich automatisch bereinigen, wie z. B. autoptr, scoped_ptr, CComPtr usw.
i_am_jorf
3
Code bereinigen ist, was versuchen {} endlich {} ist für
Banjollity
@banjollity: außer für Sprachen, die nicht endgültig unterstützen {}. Und beachten Sie, dass selbst in Sprachen, die dies unterstützen, die Ausführung von {} nicht IMMER garantiert wird.
Chris K
1
@banjollity, Chris: In C ++ ist die Bereinigung das, wofür der Destruktor gedacht ist, und außer unter extremen Umständen (exit (), ein Destruktor, der beim Abwickeln des Stapels eine Ausnahme auslöst, Eichhörnchen, die Ihre Leistung unterbrechen), wird er garantiert ausgeführt.
David Thornley
4
Einverstanden. Ersetzen Sie verschachtelte Bedingungen durch Schutzklauseln ftw!
Jonik
111
  • Der Versuch, die Dinge beim ersten Versuch perfekt zu codieren.
  • Versuch, vor dem Codieren ein perfektes OO-Modell zu erstellen.
  • Alles für Flexibilität und zukünftige Verbesserungen gestalten.

Mit einem Wort: Überentwicklung .

wuub
quelle
6
Warten Sie, ich mache es immer gleich beim ersten Versuch richtig. :)
i_am_jorf
18
Das echte Geld besteht darin, es beim ersten Mal auf subtile Weise falsch zu verstehen und es in die Wildnis hinauszulassen. Wenn die Leute an die Gimped-Version gewöhnt sind, stürzen Sie sich mit arroganter Showmanier ein und beheben Sie den Fehler / die Ineffizienz, um zusätzlichen Ruhm zu ernten! ;)
Eric
7
@ Jeffamaphone - Nein, nur Jon Skeet macht es gleich beim ersten Mal richtig.
Jordan Parmer
Ich mag das Wort "Overengineering"
Neilvert Noval
@ Jeffamaphone - Ich bekomme es auch beim ersten Versuch immer richtig. Aber weitere Versuche geben was ich brauche :)
umbr
78

Ungarische Notation (sowohl Formen als auch Systeme). Früher habe ich alles vorangestellt. strSomeString oder txtFoo. Jetzt benutze ich someString und textBoxFoo. Es ist weitaus lesbarer und für jemanden, der neu ist, einfacher zu kommen und abzuholen. Als zusätzlichen Bonus ist es trivial, es konsistent zu halten - camelCase das Steuerelement und fügen Sie einen nützlichen / beschreibenden Namen hinzu. Forms Hungarian hat den Nachteil, dass es nicht immer konsistent ist und Systems Hungarian nicht wirklich viel bringt. Das Aufteilen all Ihrer Variablen ist nicht wirklich nützlich - insbesondere bei modernen IDEs.

Kenny Mann
quelle
Was ist mit dynamisch typisierten Sprachen wie Python oder JavaScript? Ich finde es immer noch hilfreich, die ungarische Notation in diesen Sprachen zu verwenden, damit ich beim Betrachten von Variablen weiß, welche Art von Variable zu erwarten ist (wenn es einen zu erwartenden Typ gibt - wäre es natürlich tollkühn, eine dynamisch typisierte Sprache zu behandeln genau wie eine statisch typisierte Sprache.)
Dan Lew
4
Ich mache ähnliche außer: fooTextBox und Strings sind nur hoffentlich offensichtlich: numberOfEntries => int, isGreat => bool, etc.
rball
+1 für das Entfernen der ungarischen Notation. Ich stimme rball zu; fooTextBox, fooService, fooString, wenn es wirklich notwendig ist.
Blu
3
@ Wuub: Ich würde argumentieren, dass Sie bei richtiger Benennung nichts voranstellen müssen sollten.
Kenny Mann
4
Übrigens ist das, was Sie erwähnt haben, kein wirklicher Ungar.
Antony Carthy
67

Die "perfekte" Architektur

Ich habe mir vor ein paar Jahren DIE Architektur ausgedacht. Ich habe mich technisch so weit wie möglich geschoben, sodass es 100% lose gekoppelte Schichten, einen umfangreichen Einsatz von Delegierten und leichte Objekte gab. Es war ein technischer Himmel.

Und es war Mist. Die technische Reinheit der Architektur hat mein Entwicklerteam nur verlangsamt, um Perfektion über den Ergebnissen zu erreichen, und ich habe fast einen vollständigen Fehler erzielt.

Wir haben jetzt eine viel einfachere, weniger technisch perfekte Architektur und unsere Lieferrate ist in die Höhe geschossen.

Bruce McLeod
quelle
57

Die Verwendung von Koffein. Es hielt mich einmal wach und in einer herrlichen Programmierstimmung, in der der Code mit fieberhafter Fließfähigkeit von meinen Fingern flog. Jetzt macht es nichts und wenn ich es nicht habe, bekomme ich Kopfschmerzen.

Alex
quelle
55
Sie müssen noch mehr Kaffee trinken. Wenn das nicht funktioniert, nehmen Sie das Rauchen auf.
MusiGenesis
7
Brad: Sie brauchen diese nicht, wenn Sie Python haben: xkcd.com/353
Peter
Schöne Weihnachtsgeschichte Referenz! :-)
Steve Echols
2
Ich habe die Gewohnheit abgebrochen und sie dann mehrmals wieder aufgegriffen (dies ist jetzt mein dritter Zyklus). Es gibt nichts Schöneres als an kalten Morgen mit einer warmen Tasse Kaffee zu codieren!
Matthew Iselin
15
"Sieht so aus, als hätte ich die falsche Woche gewählt, um Amphetamine abzusetzen."
ShreevatsaR
50

Code auskommentieren. Früher dachte ich, dass Code wertvoll ist und dass man nicht einfach die schönen Edelsteine ​​löschen kann, die man hergestellt hat. Ich lösche jetzt jeden auskommentierten Code, auf den ich stoße, es sei denn, es ist ein TODO oder eine ANMERKUNG beigefügt, weil es zu gefährlich ist, ihn zu belassen. Ich bin auf alte Klassen mit riesigen auskommentierten Teilen gestoßen, und es hat mich wirklich verwirrt, warum sie waren da: wurden sie kürzlich auskommentiert? Ist dies eine Änderung der Entwicklungsumgebung? Warum macht es diesen nicht verwandten Block?

Erwägen Sie ernsthaft, den Code nicht zu kommentieren und stattdessen nur zu löschen. Wenn Sie es brauchen, ist es immer noch in der Quellcodeverwaltung. YAGNI allerdings.

braun
quelle
6
Ich kommentiere den alten Code während des Refactorings aus, aber nur, bis ich überprüft habe, ob der Ersatzcode funktioniert. Sobald die neue Version voll funktionsfähig ist, lösche ich die alten kommentierten Zeilen.
Muusbolla
In der Tat - ich kommentiere auch Code aus, aber nur für ein paar Tage. Wenn ich zurückkomme und feststelle, dass ich etwas verpasst habe, wird es gelöscht, bevor an dem neuen Code gearbeitet wird.
Colin Mackay
4
Ich sage, checke den kommentierten Code einmal ein und lösche ihn dann. Es gibt viele Male, wenn Sie verschiedene Code-Bits testen und keinen fehlerhaften Code einchecken möchten ...
DisgruntledGoat
Ganz zu schweigen davon, dass die Versionskontrolle dein Freund ist.
David Thornley
+1 Ich habe mit einem Programmierer zusammengearbeitet, der darauf bestand, den gesamten Code zu kommentieren , den er überarbeitet oder neu geschrieben hatte. Es würde mich verrückt machen, weil ich manchmal durch 1k + Zeilen Mist scrollen musste, um herauszufinden, woran ich arbeitete.
Evan Plaice
46

Die Überbeanspruchung / der Missbrauch von # region-Direktiven. Es ist nur eine Kleinigkeit, aber in C # habe ich früher überall # region-Direktiven verwendet, um meine Klassen zu organisieren. Zum Beispiel würde ich alle Klasseneigenschaften in einer Region zusammenfassen.

Jetzt schaue ich auf alten Code zurück und ärgere mich meistens nur über sie. Ich denke nicht, dass es die Dinge die meiste Zeit wirklich klarer macht, und manchmal verlangsamen sie dich einfach. Deshalb habe ich jetzt meine Meinung geändert und bin der Meinung, dass gut angelegte Klassen ohne Regionsanweisungen größtenteils sauberer sind.

Scott Ferguson
quelle
31
Ich hasse Regionen. Die Leute in meinem Team benutzen sie leichtfertig. Ich nenne sie "schlechte Code-Hider".
Ball
9
Sie sind definitiv ein Code-Geruch.
Frank Schwieterman
3
Ich hasse Regionen. Ich verwalte derzeit Code mit einer Funktion von fast 500 Zeilen. Um ihn zu verwalten, hat der intelligente Entwickler Codestücke in 10 bis 15 Regionen abgelegt.
SolutionYogi
6
@ Lösung Yogi: Ich denke nicht, dass Regionen das eigentliche Problem in Ihrem Fall sind :-)
Ed S.
9
Ich denke, Regionen können in Ordnung sein, wenn sie sparsam verwendet werden.
Gregory Higley
39

Wasserfallentwicklung im Allgemeinen und im Besonderen die Praxis, vollständige und umfassende Funktions- und Designspezifikationen zu schreiben, von denen erwartet wird, dass sie kanonisch sind, und dann zu erwarten, dass eine Implementierung dieser Spezifikationen korrekt und akzeptabel ist. Ich habe gesehen, wie es durch Scrum ersetzt wurde, und ich sage, dass es gut los ist. Die einfache Tatsache ist, dass die sich ändernde Natur der Kundenbedürfnisse und -wünsche jede feste Spezifikation effektiv unbrauchbar macht; Der einzige Weg, um das Problem wirklich richtig anzugehen, ist ein iterativer Ansatz. Natürlich nicht, dass Scrum eine Silberkugel ist; Ich habe es viele, viele Male missbraucht und missbraucht gesehen. Aber es schlägt Wasserfall.

Paul Sonier
quelle
3
Sagen Sie das meinem Kunden ... Ich bin gerade dabei, ein nutzloses "Ich bin ein Programmierer mit einer Kristallkugel, damit ich genau weiß, wie mein Low-Level-Design in 6 Monaten aussehen wird" -Spezifikationsdokument zu schreiben :)
Igor Brejc
36

Niemals abstürzen.

Es scheint eine so gute Idee zu sein, nicht wahr? Benutzer mögen keine Programme, die abstürzen. Schreiben wir also Programme, die nicht abstürzen, und Benutzer sollten das Programm mögen, oder? So habe ich angefangen.

Heutzutage neige ich eher dazu zu denken, dass es nicht so tun sollte, als würde es funktionieren, wenn es nicht funktioniert. Scheitern Sie so schnell wie möglich mit einer guten Fehlermeldung. Wenn Sie dies nicht tun, wird Ihr Programm nur wenige Anweisungen später noch härter abstürzen, aber mit einem unscheinbaren Nullzeigerfehler, dessen Debugging eine Stunde dauert.

Mein Lieblingsmuster "Nicht abstürzen" ist folgendes:

public User readUserFromDb(int id){
    User u = null;
    try {
        ResultSet rs = connection.execute("SELECT * FROM user WHERE id = " + id);
        if (rs.moveNext()){
            u = new User();
            u.setFirstName(rs.get("fname"));
            u.setSurname(rs.get("sname"));
            // etc
        }
    } catch (Exception e) {
        log.info(e);
    }
    if (u == null){
        u = new User();
        u.setFirstName("error communicating with database");
        u.setSurname("error communicating with database");
        // etc
    }
    u.setId(id);
    return u;
}

Anstatt Ihre Benutzer zu bitten, die Fehlermeldung zu kopieren / einzufügen und an Sie zu senden, müssen Sie jetzt in die Protokolle eintauchen, um den Protokolleintrag zu finden. (Und da sie eine ungültige Benutzer-ID eingegeben haben, gibt es keinen Protokolleintrag.)

gustafc
quelle
Wie hoch ist die Wahrscheinlichkeit, dass der Benutzer Ihnen die tatsächliche Fehlermeldung im Vergleich zu Ihren Protokollen gibt, die das Problem verursachen? (In diesem speziellen Fall sehr niedrig, aber Benutzer zitieren die Fehlermeldungen fast nie!) Lesen sie sie überhaupt?
Arafangion
1
Ich gebe zu, dass die Wahrscheinlichkeit gering ist, dass ein zufälliger Benutzer Ihnen die Fehlermeldung sendet, aber die Wahrscheinlichkeit ungleich Null ist (triviales Beispiel: Manchmal verwenden Sie Ihre eigene App), und einige Benutzer lernen mit der Zeit, was sie kopieren / einfügen müssen. Ich sage nicht, dass Sie sich nicht anmelden sollten (Sie sollten), aber wenn die App kaputt ist, ist sie kaputt. Das Anzeigen einer Fehlermeldung ist weitaus besser und für den Benutzer weitaus ehrlicher, als vorzutäuschen, der Vorname des Benutzers sei "Fehler bei der Kommunikation mit der Datenbank" (oder noch schlimmer, nulloder die leere Zeichenfolge).
Gustafc
Es gibt eine NullReferenceException in Zeile zwei
o
Danke, oɔɯǝɹ, ich habe es behoben. (Obwohl es dort etwas lulzieriger war: All diese Schwierigkeiten, Ausnahmen und andere "Abstürze" zu vermeiden, und dennoch stürzte es bedingungslos ab.)
gustafc
33

Ich fand es sinnvoll, Designmuster anzuwenden , wenn ich sie erkannte.

Ich wusste nicht, dass ich tatsächlich Stile aus fremden Programmiersprachen kopierte, während die Sprache, mit der ich arbeitete, weitaus elegantere oder einfachere Lösungen ermöglichte.

Die Verwendung mehrerer (sehr) verschiedener Sprachen öffnete mir die Augen und machte mir klar, dass ich die Lösungen anderer Menschen nicht falsch auf Probleme anwenden muss, die nicht meine sind. Jetzt schaudert es mich, wenn ich sehe, dass das Fabrikmuster in einer Sprache wie Ruby angewendet wird.

molf
quelle
2
Bitte entschuldigen Sie meine Unkenntnis von Rubin, aber warum sollten wir das Fabrikmuster nicht damit verwenden?
Mike Chamberlain
Kein Rubyist hier, aber die Fabrik soll es vermeiden, abhängig von einer Implementierung, aber Ruby ist dynamisch, und Sie können alles verspotten oder stubben. Sie sind also nicht wirklich auf eine Implementierung angewiesen.
Stéphane
27

Zwangstests. Ich war ein tollwütiger Befürworter der Test-First-Entwicklung. Für einige Projekte ist es sehr sinnvoll, aber ich habe festgestellt, dass es für viele Projekte nicht nur nicht durchführbar, sondern auch schädlich ist, sich sklavisch an eine Doktrin zu halten, Unit-Tests für jedes einzelne Stück Funktionalität zu schreiben.

Wirklich, sklavisches Festhalten an irgendetwas kann schädlich sein.

Yalestar
quelle
22
Es funktioniert ziemlich gut für Seepocken.
MusiGenesis
Die Testabdeckung muss proportional zum Nutzen sein. Alles, was Sie tun, muss wirklich einen Nutzen zeigen. Eine 100% ige Abdeckung wird Ihnen nicht allzu viel bringen. Unterschied von 80 oder 90 in einer Form, die sich nicht in einem Lebenserhaltungs- / Raketenstart-Szenario befindet.
Spence
+1 Abhängigkeit von Unit-Tests im Gegensatz zu Tests.
Preet Sangha
25

Dies ist eine kleine Sache, aber: Kümmern Sie sich darum, wohin die geschweiften Klammern gehen (in derselben oder in der nächsten Zeile?), Schlagen Sie maximale Zeilenlängen des Codes vor, benennen Sie Konventionen für Variablen und andere Stilelemente. Ich habe festgestellt, dass sich alle mehr darum zu kümmern scheinen als ich, also gehe ich einfach mit dem Fluss derer, mit denen ich heutzutage arbeite.

Bearbeiten: Die Ausnahme ist natürlich, wenn ich derjenige bin, der sich am meisten interessiert (oder derjenige ist, der in der Lage ist, den Stil für eine Gruppe festzulegen). In diesem Fall mache ich was ich will!

(Beachten Sie, dass dies nicht mit einem nicht konsistenten Stil identisch ist. Ich denke, ein konsistenter Stil in einer Codebasis ist für die Lesbarkeit sehr wichtig.)

Daniel Lew
quelle
5
Jemand hat dies abgelehnt, aber ich denke, es ist eine praktische Perspektive. Was ist das beste Code-Styling? Nicht wichtig. In derselben Datei nach oben und unten schauen und duplizieren.
Frank Schwieterman
12
Das beste Code-Styling ist der Standard für diesen Shop.
David Thornley
Deshalb liebe ich die automatischen Formatierungsoptionen in Visual Studio. Es spielt keine Rolle, wie die anderen Entwickler den Code geschrieben haben. Ich mache nur ein schnelles Format und es ist genau so, wie ich es mag ... die meiste Zeit.
Corymathews
5
@cory: Beeinträchtigt das nicht die Fähigkeit Ihrer Versionskontrollsoftware, Ihnen den Unterschied zwischen den Versionen der Datei zu zeigen, die Sie gerade neu formatiert haben?
Steve Melnikoff
Aus diesem Grund zieht es mich zum Lernen von Python ... um zu denken, dass ich mir nur Gedanken darüber machen muss, auf was meine Tabstops eingestellt sind, und nicht darauf, Stile zu spannen. Es ist irgendwie zwingend.
Chris K
24

Die vielleicht wichtigste "Programmierpraxis", über die ich seitdem meine Meinung geändert habe, ist die Idee, dass mein Code besser ist als der aller anderen. Dies ist häufig bei Programmierern (insbesondere Neulingen) der Fall.

Nippysaurus
quelle
20

Dienstprogrammbibliotheken. Ich habe eine Versammlung mit einer Vielzahl von Hilfsmethoden und Klassen mit der Theorie herumgetragen, dass ich sie eines Tages woanders verwenden könnte.

In Wirklichkeit habe ich gerade einen riesigen Namespace mit vielen schlecht organisierten Funktionen erstellt.

Jetzt lasse ich sie einfach in dem Projekt, in dem ich sie erstellt habe. Höchstwahrscheinlich werde ich sie nicht brauchen, und wenn ich das tue, kann ich sie später jederzeit in etwas umgestaltbares umgestalten. Manchmal werde ich sie mit einem // TODO kennzeichnen, damit sie möglicherweise in eine gemeinsame Assembly extrahiert werden können.

JamesWampler
quelle
12
Es gibt ein gutes Zitat (ich kann das Original im Moment nicht finden), das in etwa so lautete: "Denken Sie nicht einmal daran, eine generische Routine zu erstellen, bis Sie das gleiche Problem dreimal lösen mussten.
DaveR
9
"Drei Treffer und du Refactor" - Refactoring von Martin Fowler. Die
Dreierregel
20

Mehr entwerfen als ich codiert habe. Nach einer Weile wird es zu einer Analyse-Lähmung.

Paul Nathan
quelle
44
Ich rufe gelegentlich den Satz auf: "Wenn Sie feststellen, dass Sie zu viel denken, hören Sie auf und tun Sie es. Wenn Sie feststellen, dass Sie zu viel tun, hören Sie auf und denken Sie nach."
Neil N
Das ist schön, aber wie viel ist zu viel?
Hamish Grubijan
Zu viel Abhängigkeit von UML (Useless Modeling Language). Es hat gelegentlich seine Verwendung. Aber sobald ich sehe, dass jemand anfängt, Klassendiagramme zu zeichnen und die Vorteile von "wie großartig es wäre, Code aus den Diagrammen zu generieren" zu predigen, schnüre ich meine Laufschuhe. Außerdem verfügt Visual Studio über einen integrierten interaktiven Klassendiagrammgenerator, der alles automatisch erledigt und wie der Objekt-Explorer bei Crack funktioniert.
Evan Plaice
15

Die Verwendung eines DataSet zur Ausführung der Geschäftslogik. Dadurch wird der Code zu eng an die Datenbank gebunden. Außerdem wird das DataSet normalerweise aus SQL erstellt, wodurch die Dinge noch anfälliger werden. Wenn sich SQL oder die Datenbank ändern, kann dies zu allem führen, was das DataSet berührt.

Ausführen einer Geschäftslogik in einem Objektkonstruktor. Durch die Vererbung und die Fähigkeit, überladene Konstruktoren zu erstellen, wird die Wartung in der Regel erschwert.

Eric Schneider
quelle
15

Abkürzung für Variable / Methode / Tabelle / ... Namen

Ich habe das die ganze Zeit gemacht, selbst wenn ich in Sprachen ohne erzwungene Beschränkung der Länge von Namen gearbeitet habe (nun, es waren wahrscheinlich 255 oder so). Eine der Nebenwirkungen waren viele Kommentare im gesamten Code, die die (nicht standardmäßigen) Abkürzungen erklärten. Und natürlich, wenn die Namen aus irgendeinem Grund geändert wurden ...

Jetzt ziehe ich es vor, Dinge so zu nennen, wie sie wirklich sind, mit guten beschreibenden Namen. einschließlich nur Standardabkürzungen . Es müssen keine nutzlosen Kommentare eingefügt werden, und der Code ist weitaus lesbarer und verständlicher.

Rhys Jones
quelle
Ja, ich muss diese Art von Erklärungen lieben: void Foo (x1, y, x2, y2, p, r, j) ... WTF?!
Ed S.
Oder schlimmer (und ja, ich habe das tatsächlich gesehen) Foo(int arg0, String arg1, float arg2)usw.
Mac
14

Umschließen vorhandener Datenzugriffskomponenten wie der Unternehmensbibliothek mit einer benutzerdefinierten Ebene von Hilfsmethoden.

  • Es macht niemandem das Leben leichter
  • Es ist mehr Code, der Fehler enthalten kann
  • Viele Leute wissen, wie man die EntLib-Datenzugriffskomponenten verwendet. Niemand außer dem lokalen Team weiß, wie die interne Datenzugriffslösung verwendet wird
blau
quelle
14

Ich habe 1984 zum ersten Mal von objektorientierter Programmierung gehört, als ich über Smalltalk gelesen habe, aber ich hatte keinen Zugriff auf eine oo-Sprache, bis ich 1992 den Cfront-C ++ - Compiler verwendete. 1995 konnte ich schließlich Smalltalk verwenden. Ich hatte oo mit Spannung erwartet Technologie und kaufte in die Idee, dass es Software-Entwicklung sparen würde.

Jetzt sehe ich oo nur als eine Technik, die einige Vorteile hat, aber es ist nur ein Werkzeug in der Toolbox. Ich mache den größten Teil meiner Arbeit in Python und schreibe oft eigenständige Funktionen, die keine Klassenmitglieder sind, und ich sammle oft Datengruppen in Tupeln oder Listen, in denen ich in der Vergangenheit eine Klasse erstellt hätte. Ich erstelle immer noch Klassen, wenn die Datenstruktur kompliziert ist oder wenn ich ein mit den Daten verbundenes Verhalten benötige, aber ich neige dazu, mich dagegen zu wehren.

Ich bin tatsächlich daran interessiert, in Clojure zu arbeiten, wenn ich Zeit habe, was keine oo-Funktionen bietet, obwohl es Java-Objekte verwenden kann, wenn ich es richtig verstehe. Ich bin nicht bereit zu sagen, dass oo tot ist, aber ich persönlich bin nicht der Fan, der ich früher war.

Greg Graham
quelle
13

In C # _notationfür private Mitglieder verwenden. Ich finde es jetzt hässlich.

Ich habe dann zu this.notationfür private Mitglieder gewechselt , aber festgestellt, dass ich es nicht konsistent verwendet habe, also habe ich das auch fallen gelassen.

JulianR
quelle
29
Ich benutze immer noch _notation und finde es großartig.
Arnis Lapsa
3
Ich hasse Notation; Ich benutze ThisNotation für öffentliche Mitglieder und thisNotation für private Mitglieder.
Callum Rogers
Ich hasse es auch. Es verwirrt mich :(
Broken_Window
4
Ich bin nicht einverstanden. Es macht es so viel einfacher, Namen zu verwalten. Verwenden Sie PascalCase für Eigenschaften oder öffentliche / interne Mitglieder, _UnderscorePascalCase für Mitglieder, die über eine Eigenschaft verfügbar gemacht werden, und camelCase für Parameternamen in Methoden / Konstruktoren und privaten Mitgliedern. Das Schlüsselwort 'this' ist nur erforderlich, wenn Sie die Referenz der aktuellen Klasse außerhalb der Klasse übergeben müssen oder auf ein automatisch generiertes Mitglied innerhalb der Klasse zugreifen müssen (z. B. Name, Steuerelemente usw.).
Evan Plaice
@Evan: Ich mache genau das, was du beschreibst, bis auf den letzten Teil. Ich neige dazu, das thisoder Me(C # bzw. VB.NET) zu verwenden, wenn ich Methoden und Eigenschaften aufrufe. IMO erleichtert es mir, meinen Code später leichter zu lesen und zu verstehen, insbesondere wenn sich vier oder mehr Objekte in diesem bestimmten Bereich befinden.
Alex Essilfie
11

Ich habe vor der Implementierung aufgehört, mich an die von der Universität empfohlene Entwurfsmethode zu halten. Die Arbeit in einem chaotischen und komplexen System hat mich gezwungen, meine Einstellung zu ändern.

Natürlich recherchiere ich immer noch Code, besonders wenn ich Code berühren möchte, den ich noch nie zuvor berührt habe, aber normalerweise versuche ich, mich auf so kleine Implementierungen wie möglich zu konzentrieren, um zuerst etwas in Gang zu bringen. Dies ist das Hauptziel. Verfeinern Sie dann schrittweise die Logik und lassen Sie das Design einfach von selbst erscheinen. Die Programmierung ist ein iterativer Prozess und funktioniert sehr gut mit einem agilen Ansatz und mit viel Refactoring.

Der Code sieht überhaupt nicht so aus, wie Sie es sich zuerst vorgestellt haben. Passiert jedes Mal :)

ralphtheninja
quelle
10

Früher habe ich mich sehr für Design-by-Contract interessiert. Dies bedeutete, dass zu Beginn aller meiner Funktionen viele Fehler überprüft wurden. Verträge sind im Hinblick auf die Trennung von Bedenken immer noch wichtig, aber anstatt zu versuchen, das durchzusetzen, was mein Code nicht tun sollte, versuche ich, mithilfe von Komponententests zu überprüfen, was er tut.

Frank Schwieterman
quelle
Mir wurde beigebracht, so zu programmieren. Natürlich wurde ich von einem HS-Mathematiklehrer unterrichtet, daher ist es wohl sinnvoll, dass er wollte, dass seine Funktionen sich selbst überprüfen.
Alex
10

Ich würde Statics in vielen Methoden / Klassen verwenden, da es prägnanter war. Als ich anfing, Tests zu schreiben, änderte sich diese Praxis sehr schnell.

rball
quelle
10

Überprüfte Ausnahmen

Eine erstaunliche Idee auf dem Papier - definiert den Vertrag klar, kein Raum für Fehler oder das Vergessen, nach Ausnahmebedingungen zu suchen. Ich wurde verkauft, als ich zum ersten Mal davon hörte.

Natürlich war es in der Praxis so ein Durcheinander. Bis zu dem Punkt, dass Bibliotheken heute wie Spring JDBC vorhanden sind, bei denen ausgeblendete Ausnahmen als eines ihrer Hauptmerkmale ausgeblendet wurden.

Gregory Mostizky
quelle
9

Dass alles, was sich lohnt, nur in einer bestimmten Sprache codiert wurde. In meinem Fall glaubte ich, dass C die beste Sprache aller Zeiten war und ich hatte nie einen Grund, irgendetwas in einer anderen Sprache zu codieren ... niemals.

Seitdem habe ich viele verschiedene Sprachen und die Vorteile / Funktionen, die sie bieten, zu schätzen gelernt. Wenn ich etwas Kleines - schnell - codieren möchte, würde ich Python verwenden. Wenn ich an einem großen Projekt arbeiten möchte, würde ich in C ++ oder C # codieren. Wenn ich einen Gehirntumor entwickeln möchte, würde ich in Perl codieren .

Patrick Gryciuk
quelle
8

Als ich einige Umgestaltungen vornehmen musste, dachte ich, es sei schneller und sauberer, sofort zu beginnen und das neue Design zu implementieren und die Verbindungen zu reparieren, bis sie funktionieren. Dann wurde mir klar, dass es besser ist, eine Reihe kleiner Umgestaltungen vorzunehmen, um langsam, aber zuverlässig auf das neue Design hinzuarbeiten.

Ying
quelle
Ich kann mich daran erinnern, wie oft mich das
gebissen
8

Das vielleicht größte Problem, das sich in meinen und anderen Codierungspraktiken geändert hat, ist die Akzeptanz externer Klassen und Bibliotheken, die aus dem Internet heruntergeladen wurden, als Grundlage für Verhalten und Funktionalität in Anwendungen. In der Schule zu der Zeit, als ich das College besuchte, wurden wir ermutigt, herauszufinden, wie wir die Dinge durch unseren eigenen Code verbessern können, und uns auf die Sprache zu verlassen, um unsere Probleme zu lösen. Mit den Fortschritten in allen Aspekten der Benutzeroberfläche und des Service- / Datenverbrauchs ist dies keine realistische Vorstellung mehr.

Es gibt bestimmte Dinge, die sich in einer Sprache niemals ändern werden, und eine Bibliothek, die diesen Code in eine einfachere Transaktion und in weniger Codezeilen einschließt, die ich schreiben muss, ist ein Segen. Die Verbindung zu einer Datenbank ist immer dieselbe. Die Auswahl eines Elements im DOM ändert sich nicht. Das Senden einer E-Mail über ein serverseitiges Skript wird sich nie ändern. Immer wieder schreiben zu müssen, verschwendet Zeit, die ich verwenden könnte, um meine Kernlogik in der Anwendung zu verbessern.

Liam
quelle
7

Initialisierung aller Klassenmitglieder.

Ich habe jedes Klassenmitglied explizit mit etwas initialisiert, normalerweise NULL. Mir ist klar geworden, dass dies:

  • Normalerweise bedeutet dies, dass jede Variable zweimal initialisiert wird, bevor sie jemals gelesen wird
  • ist albern, weil in den meisten Sprachen Variablen automatisch auf NULL initialisiert werden.
  • Erzwingt tatsächlich einen leichten Leistungseinbruch in den meisten Sprachen
  • kann Code bei größeren Projekten aufblähen
Nippysaurus
quelle
4
Manchmal können die Konsequenzen, NICHT alle Klassenmitglieder zu initialisieren, Sie wirklich in den a $$ beißen.
Muusbolla
Es sei denn, Sie verwenden eine prototypbasierte Sprache, die durch Klonen neue Instanzen erstellt. Das Initialisieren aller Mitglieder kann Ihnen wirklich viel Ärger ersparen.
Wojciech Bederski
6

Wie Sie habe ich auch IoC-Muster berücksichtigt, um die Kopplung zwischen verschiedenen Komponenten meiner Apps zu verringern. Dies vereinfacht die Wartung und den Austausch von Teilen erheblich, solange ich jede Komponente so unabhängig wie möglich halten kann. Ich verwende auch mehr objektrelationale Frameworks wie NHibernate, um die Datenbankverwaltung zu vereinfachen.

Kurz gesagt, ich verwende "Mini" -Frameworks, um Software schneller und effizienter zu erstellen. Diese Mini-Frameworks sparen viel Zeit und können bei richtiger Ausführung die Wartung einer Anwendung sehr einfach machen. Plug 'n Play um den Gewinn!

ajawad987
quelle
-1 Ich kann die Verbreitung von IoC und Frameworks nicht ertragen. Entkopplung von Gut, IoC und Frameworks = unnötige Komplexität
Paul Hollingsworth
Wie können Sie die Entkopplung loben und dennoch IoC und andere Frameworks hassen? Das ist es, was viele IoC-Frameworks und Entwurfsmuster zunächst tun.
Ajawad987