Ich werde Ihnen unsere Erfahrung beim Refactoring von LedgerSMB geben. Wir haben uns schon früh dafür entschieden, die Dinge anders zu machen und tun immer noch genau das, was Sie beschreiben, aber ohne viele Klebemethoden (wir haben übrigens ein paar Klebemethoden, nur nicht viele).
Leben mit zwei Codebasen
LedgerSMB hat ungefähr 5 Jahre mit zwei Codebasen überlebt, und es wird noch einige Jahre dauern, bis die alte Codebasis beseitigt ist. Die alte Codebasis ist ein wahrer Horror. Bei schlechtem db-Design konstruiert Perl wie IS->some_func(\%$some_object);
Code, der genau zeigt, warum die Spaghetti-Metapher manchmal verwendet wird (Ausführungspfade, die sich zwischen Modulen und zurück und zwischen Sprachen ohne Reim oder Grund bewegen). Die neue Codebasis vermeidet dies, indem Datenbankabfragen in gespeicherte Prozeduren verschoben werden, ein saubereres Framework für die Verarbeitung von Anforderungen zur Verfügung steht und vieles mehr.
Das erste, was wir uns vorgenommen haben, war zu versuchen, Modul für Modul umzugestalten. Dies bedeutet, alle Funktionen in einem bestimmten Bereich in ein neues Modul zu verschieben und dann den alten Code in das neue Modul einzufügen. Wenn die neue API sauber ist, ist dies keine große Sache. Wenn die neue API nicht funktioniert, werden die Dinge unruhig und das ist eine Einladung, ein bisschen härter an der neuen API zu arbeiten.
Die zweite Sache ist, dass es viele Male gibt, in denen neuer Code auf Logik in altem Code zugreifen muss. Dies ist so weit wie möglich zu vermeiden, da es zu hässlichen Klebemethoden führt, die man aber nicht immer vermeiden kann. In diesem Fall sollten die Klebemethoden so weit wie möglich minimiert und vermieden werden, aber bei Bedarf eingesetzt werden.
Damit dies funktioniert, müssen Sie alle Funktionen in einem bestimmten Bereich neu schreiben . Wenn Sie beispielsweise den gesamten Kundeninformations-Tracking-Code auf einmal umschreiben können, bedeutet dies, dass der Code, der dies vom alten Code aufruft, nicht schwer zu verarbeiten ist und der Versand an den alten Code vom neuen Code minimiert wird.
Die zweite Sache ist, dass Sie, wenn Sie vernünftige Abstraktionen an Ihrer Stelle haben, in der Lage sein sollten, zu wählen, welche Ebene der API aufgerufen werden soll und wie diese sauber gehalten werden soll. Sie sollten jedoch darüber nachdenken, die Teile, die Ihre API aufrufen, neu zu schreiben, damit sie auch ein bisschen sauberer sind.
Es gibt viele Bereiche von Geschäftstools, die irreduzibel komplex sind. Sie können nicht alle Komplexität loswerden. Sie können es jedoch verwalten, indem Sie sich auf saubere APIs konzentrieren, die genau das tun, was Sie tun müssen, und auf Module, die diese API konstruktiv nutzen. Kleber sollte ein letzter Ausweg sein, wenn man bedenkt, dass das Umschreiben des restlichen aufrufenden Codes möglicherweise schneller ist.