Dam ci nasze doświadczenie w refaktoryzacji LedgerSMB. Podjęliśmy decyzję, aby robić rzeczy inaczej na początku i nadal robimy dokładnie to, co opisujesz, ale bez wielu metod klejenia (mamy kilka metod klejenia, po prostu niewiele).
Życie z dwoma bazami kodów
LedgerSMB przetrwał z dwiema bazami kodów przez około 5 lat i minie jeszcze kilka, zanim stara baza kodów zostanie wyeliminowana. Stara baza kodów to prawdziwy horror do zobaczenia. Zły projekt bazy danych, Perl konstruuje jak IS->some_func(\%$some_object);
wraz z kodem, który pokazuje dokładnie, dlaczego czasami używana jest metafora spaghetti (ścieżki wykonywania wiją się między modułami i z powrotem, oraz między językami, bez wierszyka ani powodu). Nowa baza kodów unika tego, przenosząc zapytania db do procedur przechowywanych, mając czystszą strukturę do obsługi żądań i wiele więcej.
Pierwszą rzeczą, którą postanowiliśmy zrobić, była próba refaktoryzacji moduł po module. Oznacza to przeniesienie całej funkcjonalności z określonego obszaru do nowego modułu, a następnie podpięcie starego kodu do nowego modułu. Jeśli nowy interfejs API jest czysty, to nie jest wielka sprawa. Jeśli nowy interfejs API nie jest czymś owłosionym, jest to zaproszenie do nieco cięższej pracy nad nowym interfejsem API ....
Po drugie, wiele razy nowy kod musi uzyskać dostęp do logiki starego kodu. Należy tego unikać w możliwym zakresie, ponieważ prowadzi to do brzydkich metod klejenia, ale nie zawsze można tego uniknąć. W takim przypadku metody klejenia należy zminimalizować i unikać w możliwym zakresie, ale stosować w razie potrzeby.
Aby ta praca działała, musisz zobowiązać się do przepisania wszystkich funkcji w określonym obszarze. Jeśli możesz na przykład przepisać cały kod śledzenia informacji o kliencie na raz, oznacza to, że kod, który wywołuje ten kod ze starego kodu, nie jest trudny w obsłudze, a wysyłanie do starego kodu z nowego kodu jest zminimalizowane.
Po drugie, jeśli masz rozsądne abstrakty na swoim miejscu, powinieneś być w stanie wybrać, który poziom interfejsu API ma być wywoływany i jak utrzymać go w czystości. Należy jednak pomyśleć o przepisaniu fragmentów wywołujących interfejs API, aby były one również nieco czystsze.
Istnieje wiele obszarów narzędzi biznesowych, które są nieredukowalnie złożone. Nie możesz pozbyć się całej złożoności. Ale możesz nim zarządzać, koncentrując się na czystych interfejsach API, które wykonują to, co musisz zrobić, oraz modułach, które konstruktywnie wykorzystują ten interfejs API. Klej powinien być ostatecznością dopiero po rozważeniu, że przepisanie pozostałej części kodu może być szybsze.