Należy pamiętać o kodzie GUI, ponieważ jest on sterowany zdarzeniami, a kod sterowany zdarzeniami zawsze będzie wyglądał jak masa losowo zorganizowanych procedur obsługi zdarzeń. To, co robi się naprawdę nieuporządkowane, jest wtedy, gdy próbujesz wprowadzić do klasy kod, który nie jest sterowany zdarzeniami. Jasne, wygląda na to, że zapewnia obsługę programów obsługi zdarzeń i możesz sprawić, by procedury obsługi zdarzeń były miłe i małe, ale cały ten dodatkowy kod pomocniczy unoszący się wokół sprawia, że twoje źródło GUI wydaje się nadęte i niechlujne.
Co więc możesz na to poradzić i jak ułatwić refaktoryzację? Cóż, najpierw zmieniłbym definicję refaktoryzacji z czegoś, co robię czasami, na coś, co robię ciągle podczas kodowania. Dlaczego? Ponieważ chcesz, aby refaktoryzacja umożliwiła łatwiejszą modyfikację kodu, a nie na odwrót. Nie proszę cię po prostu o zmianę semantyki tutaj, ale zamiast tego proszę o odrobinę mentalnej kalisteniki, aby inaczej zobaczyć kod.
Trzy najczęściej stosowane przeze mnie techniki refaktoryzacji to Rename , Extract Method i Extract Class . Gdybym nigdy nie nauczył się żadnego innego refaktoryzacji, te trzy nadal pozwoliłyby mi utrzymać kod w czystości i dobrze ustrukturyzowany, a z treści twojego pytania brzmi, jakbyś prawdopodobnie używałby tych samych trzech refaktoryzacji prawie stale w aby Twój kod GUI był cienki i czysty.
Możesz mieć najlepszą możliwą separację GUI i logiki biznesowej na świecie, a mimo to kod GUI może wyglądać, jakby kopalnia kodu została zdetonowana w środku. Moja rada jest taka, że nie zaszkodzi mieć dodatkową klasę lub dwie, które pomogą ci właściwie zarządzać GUI, i niekoniecznie muszą to być Twoje klasy View , jeśli stosujesz wzorzec MVC - chociaż często znajdziesz klasy pośredniczące są tak podobne do twojego poglądu, że często odczuwasz potrzebę połączenia ich dla wygody. Uważam, że dodanie dodatkowej warstwy specyficznej dla GUI do zarządzania całą logiką wizualną nie zaszkodzi, ale prawdopodobnie chcesz rozważyć korzyści i koszty związane z tym.
Dlatego radzę:
- Nie rób nic bezpośrednio za GUI, oprócz wywoływania i definiowania sposobu, w jaki GUI będzie się łączyć z widokiem (lub warstwą pośrednią).
- Nie próbuj klaksonować każdej rzeczy związanej z widokiem w jedną klasę - lub nawet jedną klasę na okno GUI - chyba że ma to sens. Alternatywą jest utworzenie wielu małych i łatwych w zarządzaniu klas do zarządzania logiką GUI.
- Kiedy twoje metody zaczynają wyglądać na nieco większe niż 4-5 linii kodu, sprawdź, czy jest to konieczne i czy możliwe jest wyodrębnienie jednej lub dwóch metod, abyś mógł zachować swoje metody, nawet jeśli oznacza to klasę z wieloma innymi metodami.
- Jeśli Twoje klasy zaczynają wyglądać na naprawdę duże, zacznij od usunięcia WSZYSTKICH zduplikowanych funkcji, a następnie sprawdź, czy możesz logicznie pogrupować swoje metody, aby wyodrębnić inną klasę lub dwie.
- Pomyśl o refaktoryzacji za każdym razem, gdy piszesz wiersz kodu. Jeśli pojawi się wiersz kodu do działania, sprawdź, czy możesz go przefaktoryzować, aby uniknąć powielania funkcji, lub uczynić go nieco bardziej uproszczonym bez zmiany zachowania.
- Zaakceptuj nieuniknione, że zawsze poczujesz, że jedna lub druga część twojego systemu zacznie czuć się trochę wzdęta, szczególnie jeśli zaniedbujesz refaktoryzację w trakcie pracy. Nawet z dobrze faktoringiem kodu bazowego, nadal można poczuć się jak jest więcej, że mógłby zrobić. To jest rzeczywistość pisania oprogramowania, w którym zawsze czujesz, że coś więcej można było zrobić „lepiej”, więc musisz znaleźć równowagę między wykonywaniem profesjonalnej pracy a pozłacaniem.
- Zaakceptuj, że im czystszy kod spróbujesz zachować, tym mniej rozdęty będzie twój kod.