Ich habe Joel Spolskys Quecksilber-Einführung gelesen, als es mir auffiel :
"Und jetzt tun sie Folgendes: Jede neue Funktion befindet sich in einem großen # ifdef-Block. Sie können also in einem einzigen Trunk arbeiten, während Kunden den neuen Code erst sehen, wenn er debuggt ist, und ehrlich gesagt ist das lächerlich."
Warum ist das überhaupt so lächerlich , ist das nicht einfach einfacher zu handhaben? Es ist nichts Besonderes, aber es macht den Trick - zumindest wenn Sie bereits mit Subversion "verheiratet" sind.
Was ist der Nachteil? Ich verstehe das Argument irgendwie nicht.
Antworten:
Ich denke, die Antwort wird im folgenden Satz gegeben:
Durch die Verwendung von
#ifdef
Blöcken emulieren Sie die Funktionalität eines Versionsverwaltungssystems mit einem C-Präprozessor. Es ist das falsche Werkzeug für den Job.Der Nachteil ist, dass Sie wahrscheinlich entweder viel Code duplizieren (denken Sie an ganze Funktionsdefinitionen einmal innerhalb, einmal außerhalb
#ifdef
) oder unlesbaren Code haben (denken Sie an die#ifdef
einschließenden einzelnen Zeilen innerhalb einer Funktion - möglicherweise wiederholt).In der ersten Variante werden Fehler am Ende zweimal behoben (was nicht erforderlich wäre, wenn Sie nur Fehlerbehebungen vom stabilen Zweig zum Entwicklungszweig zusammenführen könnten), während in der zweiten Variante das ursprüngliche Ziel der Trennung von stabilen und Entwicklungszweigen nicht wirklich erreicht wurde .
quelle
#ifdefs
. Ich schwöre, es hat meine Augen bluten lassen, als ich es nur ansah. Für Version 4 ging ich mit separaten Dateien zu einer steckbaren Architektur und begann auch mit RCS (oder war es SCCS?). Das Leben wurde massiv besser und neue Funktionen waren viel einfacher zu entwickeln. (Aber Junge, wünschte ich mir jemals, wir hätten damals Git oder HG.)#ifdef
Es ist lächerlich, Code gepflegt zu haben, der ein Rattennest von s war (obwohl aus verschiedenen Gründen) . Dies erschwert das Lesen und die Wartung von Code erheblich, insbesondere beim Testen unter mehreren Bedingungen.quelle
Es wird davon ausgegangen, dass der gesamte neue Code geschrieben werden kann, ohne den vorhandenen Code zu berühren. Oft ist der einzige Weg, dies zu tun, sich selbst viel zu wiederholen. (Eine neue Methode für eine, die zum Beispiel ähnlich, aber nicht genau gleich ist).
Einer der Hauptvorteile von verteiltem VCS besteht darin, dass das Team dazu ermutigt wird, an seinem eigenen Feature-Zweig zu arbeiten und sich keine Sorgen darüber zu machen, dass Ihre Arbeit mit anderen in Konflikt steht. Diese Strategie negiert diesen Vorteil.
Für mich scheint es lächerlich, da sie die Werkzeuge absichtlich missbrauchen. Wenn Sie den Wechsel vornehmen wollen, lohnt es sich sicherlich zu lernen, wie man sie benutzt.
quelle
#ifdef
können Sie vorhandenen Code berühren, die alte Version jedoch in einem beibehalten#else
.#ifdef
'ed Code ist nicht lächerlich, aber - traurig und schrecklich. Und es ist (heute) die Diagnose für den EntwicklerNun, Joel hat in "Subversion Re-Education" The Bad Way (tm) der Argumentation ausgewählt - er hat eine spezielle, entartete Situation mit speziell ausgewählten Benutzern geschaffen und diesen Anwendungsfall als Rechtfertigung für die These "Subversion suxx" verwendet.
Spaghetti-Code suxx mehr, nicht verwaltbarer und unlesbarer Code ist gefährlicher, als einige Zeit mit der Umerziehung von "Right Merge" in Subversion zu verbringen - "Merge oft, Idioten !!!" Verzweigung und bidirektionale Zusammenführung waren in Subversion <1.5 möglich und verwendbar. Jetzt (nach Einführung von mergeinfo) wird die Zusammenführung noch einfacher und komfortabler . Ein geringer Aufwand für die Überwachung "interessanter" Bäume und Synchronisierungen (oft !!!) ist ein fairer Preis für Entwickler, die im Gegenzug kompakten, sauberen und debuggbaren Code erhalten.
quelle
Was er beschreibt, ist eigentlich ein FeatureToggle , und es kann gute Gründe geben, dies anstelle von Feature-Zweigen zu verwenden. Das Problem ist mit der Verwendung
#ifdef
. Ohne ein sehr gutes Management können sie leicht zu einem großen Durcheinander werden, das rund um die Codebasis verstreut ist.Folgendes berücksichtigen:
#ifdef
? - Sind Sie sicher, dass keine Builds mehr vorhanden sind, die diese Funktion noch ausschließen? Auch nicht für diesen einen (gut bezahlten) Kunden, für den Sie einige spezielle Builds erstellen?#ifdef
? - Der Entwickler, der das Feature erstellt hat? Sind Sie sicher, dass er sich 4 Wochen später daran erinnern wird, um zu überprüfen, ob der Switch in einem Build nicht ausgeschlossen ist und sicher entfernt werden kann? Wird er zuversichtlich sein, dass es sicher ist, das zu entfernen#ifdef
? Was ist mit dieser anderen extrem dringenden Aufgabe, hat das nicht Vorrang vor dem Entfernen eines dürren#ifdef
?Meine Erfahrung sagt, dass solche
#ifdef
s für immer herumliegen werden, Müll.quelle
Aus Erfahrung (bei einem großen Projekt in einer Codebasis mit mehr als 600.000 Zeilen, die 3 Jahre lang mit
#ifdef
s aus Releases herausgehalten wurde ) wären meine Argumente gegen deren Verwendung:#ifdef
s durchzugehen und alle s zu entfernen und die Konflikte mit dem in#elseif
s hinzugefügten Code zu lösen .Alles in allem war es ein herrlicher Tag, als wir zu Mercurial migrierten - wir haben immer noch eine riesige, übermäßig komplexe Codebasis, aber zumindest können wir jetzt effizient verzweigen.
quelle