Przepisywanie skrótów klawiszowych (akceleratorów) od zera
—
—
GUI
Użyteczność
W moim przełomowym wpisie, Darktable: crashing into the wall in slow-motion, przedstawiłem katastrofę, jaką był nowy „Wielki turducken MIDI". Celem tego turduckena1 było przepisanie systemu skrótów klawiszowych, aby rozszerzyć go o urządzenia MIDI.
Do dziś jestem wściekły na to przedsięwzięcie masowego niszczenia, oto podsumowanie powodów:
- w 2021 roku zastąpił system skrótów klawiszowych, który był całkiem dobry, kompletny funkcjonalnie, dobrze przetestowany, stabilny i zakodowany w mniej niż 1500 liniach (łącznie z komentarzami),
- …aby dodać obsługę urządzeń MIDI i gamepadów PlayStation (!?!)…
- …ale w moim ankiecie Darktable z 2022 roku, rok po tej nowej funkcji, spośród ponad 1251 użytkowników, którzy wzięli udział:
- 81% użytkowników nie miało urządzenia MIDI i nie planowało go kupić,
- 2% nawet nie wiedziało, czym jest urządzenie MIDI.
- 8% użytkowników miało urządzenie MIDI, ale nie używało go z Darktable,
- 6% rozważało może kupno urządzenia MIDI w przyszłości,
- 2% użytkowników miało urządzenie MIDI, którego faktycznie używało w Darktable,
- kod był absolutnie okropny pod względem:
- jakości kodu: nieczytelne instrukcje
if/switch-casezagnieżdżone na 4 poziomach, w środku funkcji liczących 1000 linii (przykładowe fragmenty zamieściłem w moim artykule), - objętości kodu:
- 3546 linii kodu dla Darktable 4.0,
- 4397 linii kodu dla Darktable 5.0,
- wzrost objętości jest bezpośrednim skutkiem prób naprawiania błędów w architekturze, której nie da się naprawić, ponieważ jej złożoność sprzyja jeszcze większej złożoności. Wszystko to wynika z projektu, ale rozwiązywanie problemów stworzonych przez złożoność poprzez dodawanie kolejnej złożoności nie jest rozwiązaniem.
- złożoności kodu:
- złożoność cyklomatyczna :
- 1088 dla Darktable 4.0,
- 1245 dla Darktable 5.0 (szczegóły ),
- złożoność poznawcza :
- 1885 dla Darktable 4.0,
- 2098 dla Darktable 5.0 (szczegóły ).
- jest to zdecydowanie najbardziej złożona funkcja oprogramowania, mimo że nie operuje na obrazach. Dla porównania, drugą najbardziej złożoną funkcją jest dekodowanie metadanych EXIF, którego złożoność poznawcza wynosi 1348.
- złożoność cyklomatyczna :
- jakości kodu: nieczytelne instrukcje
- z założenia nie dekoduje modyfikatorów klawiszy, lecz zajmuje się wyłącznie sprzętowymi naciśnięciami klawiszy, co oznacza, że:
- wejście „1" z klawiatury numerycznej jest dekodowane jako
Keypad End, - wejście „1" z francuskiej klawiatury AZERTY jest dekodowane jako
Shift+&lubShift+"na BÉPO, - musisz zatem zduplikować wszystkie swoje skróty oparte na cyfrach dla każdego sposobu wprowadzania cyfry i przygotować się na to, że okno ustawień skrótów nie będzie zawierać żadnej faktycznej cyfry w kombinacjach klawiszy.
- wejście „1" z klawiatury numerycznej jest dekodowane jako
- projekt od strony użytkownika jest absolutnie okropny, ze zdecydowanie zbyt wieloma akcjami i emulacjami do skonfigurowania („efektami"), które nawet 4 lata później nie są w pełni udokumentowane (czym jest „ctrl-toggle"? „right-activate"?), a konfiguracja skrótów używa dziwnego podzielonego okna, które nie ma żadnego sensu,
- implementacja jest równie okropna: funkcja jest świadoma całego GUI oprogramowania, a GUI oprogramowania jest świadome kodu skrótów. Nie ma tu żadnej modularności, a zmiana czegokolwiek w kodzie skrótów może mieć nieoczekiwane i niepożądane skutki gdziekolwiek w oprogramowaniu.2 Spójrz tylko na graf zależności poniżej,
- kilka „skrótów" (lub powiązań MIDI) może być przypisanych do tej samej akcji, co oznacza, że każda interakcja użytkownika musi przeszukać całą listę dostępnych akcji, powodując bardzo nieefektywną obsługę skrótów, w niektórych przypadkach opóźnienia GUI oraz fałszywe alarmy „nieznana kombinacja klawiszy" w szczególnych przypadkach.


Graf zależności src/gui/accelerators.c (Wielki turducken MIDI) przed przepisaniem. Zgadnij, dlaczego nazywamy to „kodem spaghetti "… Widać wyraźnie, że istnieje dwustronna zależność między kodem akceleratorów a resztą kodu GUI. Utrzymanie tego to koszmar.