In einem relativ großen Projekt befindet sich eine Quelldatei mit mehreren Funktionen, die extrem leistungsabhängig sind (millionenfach pro Sekunde). Tatsächlich hat der vorherige Betreuer beschlossen, 12 Kopien einer Funktion zu schreiben, von denen sich jede geringfügig unterscheidet, um die Zeit zu sparen, die für die Prüfung der Bedingungen in einer einzelnen Funktion aufgewendet werden würde.
Leider bedeutet dies, dass der Code eine zu pflegende PITA ist. Ich möchte den gesamten doppelten Code entfernen und nur eine Vorlage schreiben. Die Sprache Java unterstützt jedoch keine Vorlagen, und ich bin nicht sicher, ob Generika dafür geeignet sind.
Mein aktueller Plan ist es, stattdessen eine Datei zu schreiben, die die 12 Kopien der Funktion generiert (praktisch ein Einweg-Template-Expander). Ich würde natürlich ausführlich erklären, warum die Datei programmgesteuert generiert werden muss.
Ich befürchte, dass dies zu Verwirrung bei zukünftigen Betreuern führen und möglicherweise böse Fehler verursachen könnte, wenn diese vergessen, die Datei nach der Änderung neu zu generieren, oder (noch schlimmer), wenn sie stattdessen die programmgesteuert generierte Datei ändern. Leider sehe ich keine Möglichkeit, dies zu beheben, da ich das Ganze nicht in C ++ neu geschrieben habe.
Überwiegen die Vorteile dieses Ansatzes die Nachteile? Soll ich stattdessen:
- Nehmen Sie den Leistungstreffer und nutzen Sie eine einzige wartbare Funktion.
- Fügen Sie Erklärungen hinzu, warum die Funktion 12-mal dupliziert werden muss, und nehmen Sie die Wartungslast auf sich.
- Versuchen Sie, Generika als Vorlagen zu verwenden (wahrscheinlich funktionieren sie nicht so).
- Schreien Sie den alten Betreuer an, der den Code so leistungsabhängig von einer einzelnen Funktion gemacht hat.
- Andere Methode zur Aufrechterhaltung der Leistung und Wartbarkeit?
PS Aufgrund des schlechten Designs des Projekts ist das Profilieren der Funktion ziemlich schwierig. Der frühere Betreuer hat mich jedoch davon überzeugt, dass der Leistungseinbruch inakzeptabel ist. Ich nehme an, dass er damit mehr als 5% meint, obwohl das eine vollständige Vermutung von meiner Seite ist.
Vielleicht sollte ich etwas näher darauf eingehen. Die 12 Exemplare haben eine sehr ähnliche Aufgabe, weisen jedoch winzige Unterschiede auf. Die Unterschiede sind an verschiedenen Stellen in der Funktion zu finden, so dass es leider viele, viele Bedingungsaussagen gibt. Es gibt effektiv 6 "Betriebsarten" und 2 "Paradigmen" (Wörter, die ich selbst zusammengestellt habe). Um die Funktion zu verwenden, gibt man den "Modus" und das "Paradigma" des Betriebs an. Das ist niemals dynamisch; Jeder Code verwendet genau einen Modus und ein Paradigma. Alle 12 Mode-Paradigma-Paare werden irgendwo in der Anwendung verwendet. Die Funktionen haben die passenden Namen func1 bis func12, wobei gerade Zahlen das zweite Paradigma und ungerade Zahlen das erste Paradigma darstellen.
Mir ist bewusst, dass dies das schlechteste Design überhaupt ist, wenn Wartbarkeit das Ziel ist. Aber es scheint "schnell genug" zu sein, und dieser Code hat eine Weile keine Änderungen nötig ... Es ist auch erwähnenswert, dass die ursprüngliche Funktion nicht gelöscht wurde (obwohl es toter Code ist, soweit ich das beurteilen kann) , so wäre Refactoring einfach.
Makefile
" (oder einem anderen von Ihnen verwendeten System) erstellen und direkt nach Abschluss der Kompilierung entfernen . Auf diese Weise haben sie einfach keine Chance, die falsche Quelldatei zu ändern.