W dość dużym projekcie znajduje się plik źródłowy z kilkoma funkcjami niezwykle wrażliwymi na wydajność (nazywanymi milionami razy na sekundę). W rzeczywistości poprzedni opiekun postanowił napisać 12 kopii funkcji różniących się bardzo nieznacznie, aby zaoszczędzić czas, który zostałby poświęcony na sprawdzenie warunków w jednej funkcji.
Niestety oznacza to, że kod jest PITA do utrzymania. Chciałbym usunąć cały zduplikowany kod i napisać tylko jeden szablon. Jednak język Java nie obsługuje szablonów i nie jestem pewien, czy nadają się do tego generyczne produkty.
Mój obecny plan polega na tym, aby zamiast tego napisać plik, który generuje 12 kopii funkcji (praktycznie ekspander szablonów jednorazowego użytku). Oczywiście podałbym obszerne wyjaśnienie, dlaczego plik musi być generowany programowo.
Obawiam się, że doprowadziłoby to do zamieszania przyszłych opiekunów i być może wprowadziłoby nieprzyjemne błędy, jeśli zapomną zregenerować plik po modyfikacji, lub (co gorsza), jeśli zmodyfikują zamiast tego plik wygenerowany programowo. Niestety, poza przepisaniem całego tekstu w C ++, nie widzę sposobu, aby to naprawić.
Czy zalety tego podejścia przeważają nad wadami? Czy zamiast tego powinienem:
- Wykorzystaj wydajność i skorzystaj z jednej, łatwej do utrzymania funkcji.
- Dodaj wyjaśnienia, dlaczego funkcja musi być powielona 12 razy, i uprzejmie weź na siebie obciążenie związane z utrzymaniem.
- Spróbuj użyć generycznych jako szablonów (prawdopodobnie nie działają w ten sposób).
- Krzycz na starego opiekuna, aby uczynić kod tak zależnym od wydajności od jednej funkcji.
- Inna metoda utrzymania wydajności i łatwości konserwacji?
PS Z powodu złej konstrukcji projektu profilowanie funkcji jest dość trudne ... jednak były opiekun przekonał mnie, że hit wydajności jest niedopuszczalny. Zakładam, że przez to rozumie on ponad 5%, choć z mojej strony jest to całkowite przypuszczenie.
Może powinienem trochę rozwinąć. 12 kopii wykonuje bardzo podobne zadanie, ale ma niewielkie różnice. Różnice występują w różnych miejscach funkcji, więc niestety istnieje wiele, wiele instrukcji warunkowych. Istnieje skutecznie 6 „trybów” działania i 2 „paradygmaty” działania (słowa wymyślone przeze mnie). Aby użyć tej funkcji, określa się „tryb” i „paradygmat” działania. To nigdy nie jest dynamiczne; każdy fragment kodu używa dokładnie jednego trybu i paradygmatu. Wszystkie 12 par tryb-paradygmat są używane gdzieś w aplikacji. Funkcje są odpowiednio nazwane func1 do func12, przy czym liczby parzyste reprezentują drugi paradygmat, a liczby nieparzyste reprezentują pierwszy paradygmat.
Zdaję sobie sprawę, że jest to chyba najgorszy projekt w historii, jeśli celem jest łatwość konserwacji. Ale wydaje się, że jest „wystarczająco szybki”, a ten kod przez jakiś czas nie wymagał żadnych zmian ... Warto również zauważyć, że oryginalna funkcja nie została usunięta (chociaż, o ile wiem, jest to martwy kod) , więc refaktoryzacja byłaby prosta.
Makefile
” (lub innego używanego systemu) i usuń go zaraz po zakończeniu kompilacji . W ten sposób po prostu nie mają możliwości zmodyfikowania niewłaściwego pliku źródłowego.