Tastaturkürzel (Accelerators) von Grund auf neu schreiben
In meinem grundlegenden Beitrag Darktable: crashing into the wall in slow-motion habe ich das Desaster dargestellt, das der neue „Great MIDI turducken" war. Der Zweck dieses Turduckens1 war es, das System der Tastaturkürzel neu zu schreiben, um es auf MIDI-Geräte zu erweitern.
Bis heute bin ich immer noch wütend über dieses Unternehmen der Massenzerstörung, hier eine Zusammenfassung der Gründe:
- es ersetzte 2021 ein System der Tastaturkürzel, das ziemlich gut, funktional vollständig, gut getestet, stabil und in weniger als 1500 Zeilen (Kommentare inbegriffen) programmiert war,
- …um Unterstützung für MIDI-Geräte und PlayStation-Gamepads hinzuzufügen (!?!)…
- …aber in meiner Darktable-Umfrage von 2022, ein Jahr nach dieser neuen Funktion, gaben von über 1251 teilnehmenden Nutzern an:
- 81 % der Nutzer hatten kein MIDI-Gerät und planten nicht, sich eines anzuschaffen,
- 2 % wussten nicht einmal, was ein MIDI-Gerät ist.
- 8 % der Nutzer hatten ein MIDI-Gerät, verwendeten es aber nicht mit Darktable,
- 6 % erwogen, sich vielleicht in Zukunft ein MIDI-Gerät anzuschaffen,
- 2 % der Nutzer hatten ein MIDI-Gerät, das sie tatsächlich in Darktable verwendeten,
- der Code war absolut furchtbar, in Bezug auf:
- Codequalität: unleserliche
if/switch-case-Anweisungen, auf 4 Ebenen verschachtelt, inmitten von Funktionen mit 1000 Zeilen (Beispielausschnitte habe ich in meinem Artikel gepostet), - Codevolumen:
- 3546 Zeilen Code für Darktable 4.0,
- 4397 Zeilen Code für Darktable 5.0,
- die Zunahme des Volumens ist eine direkte Folge des Versuchs, Bugs in einer Architektur zu beheben, die nicht behoben werden kann, weil ihre Komplexität weitere Komplexität fördert. All das rührt vom Design her, aber Probleme, die durch Komplexität verursacht werden, durch das Hinzufügen von mehr Komplexität zu lösen, ist keine Lösung.
- Codekomplexität:
- zyklomatische Komplexität :
- 1088 für Darktable 4.0,
- 1245 für Darktable 5.0 (Details ),
- kognitive Komplexität :
- 1885 für Darktable 4.0,
- 2098 für Darktable 5.0 (Details ).
- es ist mit Abstand die komplexeste Funktion der Software, obwohl sie nicht auf Bildern operiert. Zum Vergleich: die zweitkomplexeste Funktion ist die Dekodierung der EXIF-Metadaten, die eine kognitive Komplexität von 1348 hat.
- zyklomatische Komplexität :
- Codequalität: unleserliche
- es dekodiert von Grund auf keine Tastenmodifikatoren, sondern behandelt nur Hardware-Tastenanschläge, was bedeutet:
- eine „1"-Eingabe vom Ziffernblock wird als
Keypad Enddekodiert, - eine „1"-Eingabe von einer französischen AZERTY-Tastatur wird als
Shift+&dekodiert, oder alsShift+"auf BÉPO, - Sie müssen daher alle Ihre zahlenbasierten Tastenkürzel für jede Art der Zahleneingabe duplizieren und darauf gefasst sein, dass das Einstellungsfenster für die Tastenkürzel keine einzige echte Zahl in den Tastenkombinationen enthält.
- eine „1"-Eingabe vom Ziffernblock wird als
- das nutzerseitige Design ist absolut furchtbar, mit viel zu vielen zu konfigurierenden Aktionen und Emulationen („Effekte"), die selbst 4 Jahre später nicht einmal vollständig dokumentiert sind (was ist „ctrl-toggle"? „right-activate"?), und die Konfiguration der Tastenkürzel verwendet ein seltsames geteiltes Fenster, das keinerlei Sinn ergibt,
- die Implementierung ist ebenfalls furchtbar: die Funktion kennt die gesamte GUI der Software, und die GUI der Software kennt den Code der Tastenkürzel. Hier gibt es keine Modularität, und eine Änderung an irgendetwas im Code der Tastenkürzel kann unerwartete und unerwünschte Auswirkungen an jeder Stelle der Software haben.2 Sehen Sie sich nur den Abhängigkeitsgraphen unten an,
- mehrere „Tastenkürzel" (oder MIDI-Bindungen) können an dieselbe Aktion angehängt werden, was bedeutet, dass jede Nutzerinteraktion die gesamte Liste der verfügbaren Aktionen durchsuchen muss, was eine sehr ineffiziente Handhabung der Tastenkürzel, in manchen Fällen GUI-Verzögerungen und in eigentümlichen Fällen „unbekannte Tastenkombination"-Falschmeldungen verursacht.


Der Abhängigkeitsgraph von src/gui/accelerators.c (Great MIDI turducken) vor der Neufassung. Raten Sie, warum wir das „Spaghetti-Code " nennen… Das macht deutlich, dass es eine beidseitige Abhängigkeit zwischen dem Accels-Code und dem restlichen GUI-Code gibt. Das ist ein Albtraum in der Wartung.