Bruikbaarheid

Sneltoetsen (accelerators) vanaf nul herschrijven

GUI Bruikbaarheid

In mijn stellingnemende bericht, Darktable: crashing into the wall in slow-motion, presenteerde ik de treinramp die de nieuwe „Great MIDI turducken" was. Het doel van deze turducken1 was om het sneltoetsensysteem te herschrijven om het uit te breiden voor MIDI-apparaten.

Tot op de dag van vandaag ben ik nog steeds boos over deze onderneming van massavernietiging, hier is een samenvatting van de redenen:

  1. het verving in 2021 een sneltoetsensysteem dat behoorlijk goed was, functioneel compleet, goed getest, stabiel en gecodeerd in minder dan 1500 regels (commentaar inbegrepen),
  2. …om ondersteuning toe te voegen voor MIDI-apparaten en PlayStation-gamepads (!?!)…
  3. …maar in mijn Darktable-enquête van 2022, één jaar na deze nieuwe functie, van de meer dan 1251 gebruikers die deelnamen:
    • had 81% van de gebruikers geen MIDI-apparaat en was niet van plan er een aan te schaffen,
    • wist 2% niet eens wat een MIDI-apparaat was.
    • had 8% van de gebruikers een MIDI-apparaat maar gebruikte het niet met Darktable,
    • overwoog 6% misschien in de toekomst een MIDI-apparaat aan te schaffen,
    • had 2% van de gebruikers een MIDI-apparaat dat ze daadwerkelijk in Darktable gebruikten,
  4. de code was absoluut verschrikkelijk, wat betreft:
    • codekwaliteit: onleesbare if/switch-case-statements genest op 4 niveaus, midden in functies van 1000 regels (ik plaatste voorbeeldfragmenten in mijn artikel),
    • codevolume:
      • 3546 regels code voor Darktable 4.0,
      • 4397 regels code voor Darktable 5.0,
      • de toename in volume is een direct gevolg van het proberen te repareren van bugs in een architectuur die niet gerepareerd kan worden omdat de complexiteit ervan meer complexiteit bevordert. Dat komt allemaal voort uit het ontwerp, maar problemen die door complexiteit veroorzaakt worden oplossen met het toevoegen van meer complexiteit is geen oplossing.
    • codecomplexiteit:
      • cyclomatische complexiteit :
        • 1088 voor Darktable 4.0,
        • 1245 voor Darktable 5.0 (details ),
      • cognitieve complexiteit :
        • 1885 voor Darktable 4.0,
        • 2098 voor Darktable 5.0 (details ).
      • het is verreweg de meest complexe functie van de software, ook al werkt het niet op afbeeldingen. Ter vergelijking: de op één na meest complexe functie is de EXIF-metadata-decodering, die een cognitieve complexiteit van 1348 heeft.
  5. het decodeert door ontwerp geen toetsmodificatoren, maar behandelt alleen hardware-toetsaanslagen, wat betekent:
    • „1"-invoer van het numerieke toetsenblok wordt gedecodeerd als Keypad End,
    • „1"-invoer van een Frans AZERTY-toetsenbord wordt gedecodeerd als Shift+&, of Shift+" op BÉPO,
    • je moet daarom al je op cijfers gebaseerde sneltoetsen dupliceren voor elke manier om een cijfer in te voeren, en erop voorbereid zijn dat het sneltoetsinstellingenvenster geen enkel echt cijfer in de toetscombinaties bevat.
  6. het ontwerp aan de gebruikerskant is absoluut verschrikkelijk, met veel te veel te configureren acties en emulaties („effecten"), die zelfs 4 jaar later niet volledig gedocumenteerd zijn (wat is „ctrl-toggle"? „right-activate"?), en de sneltoetsconfiguratie gebruikt een raar gesplitst venster dat nergens op slaat,
  7. de implementatie is ook verschrikkelijk: de functie is op de hoogte van de hele software-GUI, en de software-GUI is op de hoogte van de sneltoetscode. Er is hier geen modulariteit, en iets veranderen in de sneltoetscode kan overal in de software onverwachte en ongewenste effecten hebben.2 Kijk maar naar de afhankelijkheidsgraaf hieronder,
  8. meerdere „sneltoetsen" (of MIDI-bindingen) kunnen aan dezelfde actie gekoppeld worden, wat betekent dat elke gebruikersinteractie de hele lijst met beschikbare acties moet doorzoeken, wat zeer inefficiënte sneltoetsafhandeling veroorzaakt, GUI-vertragingen in sommige gevallen en „onbekende toetscombinatie"-fout-positieven in bijzondere gevallen.
image
Niet-gedecodeerde cijfertoetsen en rare venstersplitsing tussen „action" en „shortcut".
image

De afhankelijkheidsgraaf van src/gui/accelerators.c (Great MIDI turducken) vóór de herschrijving. Raad eens waarom we het „spaghetticode " noemen… Dit maakt duidelijk dat er een tweezijdige afhankelijkheid is tussen de accels-code en de rest van de GUI-code. Dit is een nachtmerrie om te onderhouden.

Search

You can also ask Chantal, the AI search engine.