GUI

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:

  1. 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),
  2. …aby dodać obsługę urządzeń MIDI i gamepadów PlayStation (!?!)…
  3. …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,
  4. kod był absolutnie okropny pod względem:
    • jakości kodu: nieczytelne instrukcje if/switch-case zagnież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 :
      • złożoność poznawcza :
      • 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.
  5. 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+& lub Shift+" 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.
  6. 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,
  7. 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,
  8. 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.
image
Niezdekodowane klawisze cyfr i dziwny podział okna między „akcją" a „skrótem".
image

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.

Search

You can also ask Chantal, the AI search engine.