Zacząłem wierzyć w coś o refaktoryzacji, o której tu nie wspominałem, wiem, że jest tu już wiele odpowiedzi, ale myślę, że to jest nowe.
Byłem bezwzględnym refaktorem i mocno wierzyłem w SUCHO, zanim jeszcze pojawiły się warunki. Głównie dlatego, że mam problemy z utrzymaniem dużej bazy kodu w mojej głowie, a częściowo dlatego, że lubię kodowanie DRY i nie lubię niczego w kodowaniu C&P, w rzeczywistości jest to dla mnie bolesne i strasznie wolne.
Chodzi o to, że naleganie na DRY dało mi dużo praktyki w niektórych technikach, z których rzadko widuję inne. Wiele osób twierdzi, że Java jest trudna lub niemożliwa do wykonania SUCHEGO, ale tak naprawdę po prostu nie próbują.
Jeden przykład dawno temu, który jest nieco podobny do twojego przykładu. Ludzie myślą, że tworzenie GUI w Javie jest trudne. Oczywiście jest tak, jeśli kodujesz w ten sposób:
Menu m=new Menu("File");
MenuItem save=new MenuItem("Save")
save.addAction(saveAction); // I forget the syntax, but you get the idea
m.add(save);
MenuItem load=new MenuItem("Load")
load.addAction(loadAction)
Każdy, kto uważa, że to jest po prostu szalone, ma absolutną rację, ale to nie wina Javy - kodu nigdy nie należy tak pisać. Te wywołania metod są funkcjami przeznaczonymi do pakowania w inne systemy. Jeśli nie możesz znaleźć takiego systemu, zbuduj go!
Oczywiście nie możesz takiego kodu, więc musisz cofnąć się i spojrzeć na problem, co właściwie robi ten powtarzany kod? Określa niektóre ciągi znaków i ich związek (drzewo) i łączy liście tego drzewa z działaniami. Więc tak naprawdę chcesz powiedzieć:
class Menu {
@MenuItem("File|Load")
public void fileLoad(){...}
@MenuItem("File|Save")
public void fileSave(){...}
@MenuItem("Edit|Copy")
public void editCopy(){...}...
Po zdefiniowaniu relacji w sposób zwięzły i opisowy piszesz metodę, jak sobie z tym poradzić - w tym przypadku iterujesz metody przekazanej klasy i budujesz drzewo, a następnie używasz go do budowania menu i Działania, a także (oczywiście) wyświetlają menu. Nie będziesz mieć powielania, a twoja metoda jest wielokrotnego użytku ... i prawdopodobnie łatwiejsza do napisania niż duża liczba menu, a jeśli naprawdę lubisz programować, masz o wiele więcej zabawy. To nie jest trudne - metoda, którą musisz napisać, to prawdopodobnie mniej linii niż ręczne tworzenie menu!
Chodzi o to, że aby dobrze to zrobić, trzeba dużo ćwiczyć. Musisz dobrze przeanalizować, jakie dokładnie informacje znajdują się w powtarzanych częściach, wyodrębnij te informacje i wymyśl, jak je dobrze wyrazić. Nauka używania narzędzi takich jak parsowanie ciągów i adnotacje bardzo pomaga. Bardzo ważna jest również wiedza na temat zgłaszania błędów i dokumentacji.
Otrzymujesz „darmową” praktykę, po prostu dobrze kodując - są duże szanse, że gdy będziesz w tym dobry, przekonasz się, że kodowanie czegoś SUCHEGO (w tym pisanie narzędzia wielokrotnego użytku) jest szybsze niż kopiowanie i wklejanie, a wszystkie błędy, powielone błędy i trudne zmiany, które powoduje ten rodzaj kodowania.
Nie sądzę, że byłbym w stanie czerpać przyjemność z mojej pracy, gdybym nie ćwiczył technik DRY i budowania narzędzi tak bardzo, jak tylko mogłem. Gdybym musiał wziąć obniżkę wynagrodzenia, aby nie musiałem kopiować i wklejać programowania, wziąłbym to.
Więc moje punkty to:
- Kopiowanie i wklejanie kosztuje więcej czasu, chyba że nie wiesz, jak odpowiednio refaktoryzować.
- Nauczysz się dobrze refaktoryzować, robiąc to - kładąc nacisk na DRY, nawet w najtrudniejszych i najbardziej trywialnych przypadkach.
- Jesteś programistą, jeśli potrzebujesz małego narzędzia, aby twój kod SUSZONY, zbuduj go.
always
inever
jak czerwone flagi. Istnieje coś, co nazywa się „kontekstem”, w którym regułyalways
inever
, nawet jeśli ogólnie są dobre, mogą nie być odpowiednie. Uważaj na twórców oprogramowania, którzy zajmują się absolutami. ;)