<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Usabilità on Ansel</title><link>https://ansel.photos/it/tags/usabilita/</link><description>Recent content in Usabilità on Ansel</description><generator>Hugo -- gohugo.io</generator><language>it</language><copyright>© Copyright 2022-2025 – Aurélien Pierre</copyright><lastBuildDate>Sun, 01 Jun 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://ansel.photos/it/tags/usabilita/index.xml" rel="self" type="application/rss+xml"/><item><title>Riscrivere da zero le scorciatoie da tastiera (acceleratori)</title><link>https://ansel.photos/it/news/rewriting-key-shortcuts/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate><updated>Sun, 01 Jun 2025 00:00:00 +0000</updated><guid>62133c97250d75e13c47c263452928f733d87e7702113c1661c9458acb5d42b2</guid><description>&lt;p>Nel mio articolo fondativo, &lt;a href="https://ansel.photos/it/news/darktable-dans-le-mur-au-ralenti/" title="" rel="dofollow" >&lt;em>Darktable: schiantarsi contro il muro al rallentatore&lt;/em>&lt;/a>, ho presentato il disastro che era il nuovo «Grande turducken MIDI». Lo scopo di questo turducken&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> era riscrivere il sistema di scorciatoie da tastiera per estenderlo ai dispositivi MIDI.&lt;/p>
&lt;p>Ancora oggi sono arrabbiato per questa impresa di distruzione di massa, ecco un riepilogo delle ragioni:&lt;/p>
&lt;ol>
&lt;li>nel 2021 ha sostituito un sistema di scorciatoie da tastiera che era piuttosto buono, completo di funzioni, ben testato, stabile e scritto in meno di &lt;strong>1500 righe&lt;/strong> (commenti inclusi),&lt;/li>
&lt;li>…per aggiungere il supporto ai dispositivi MIDI e ai gamepad PlayStation (!?!)…&lt;/li>
&lt;li>…ma nel mio sondaggio Darktable del 2022, un anno dopo questa nuova funzione, su oltre 1251 utenti che vi hanno partecipato:
&lt;ul>
&lt;li>l'81% degli utenti non aveva un dispositivo MIDI e non aveva intenzione di procurarsene uno,&lt;/li>
&lt;li>il 2% non sapeva nemmeno cosa fosse un dispositivo MIDI.&lt;/li>
&lt;li>l'8% degli utenti aveva un dispositivo MIDI ma non lo usava con Darktable,&lt;/li>
&lt;li>il 6% stava valutando l&amp;rsquo;idea di procurarsi &lt;em>forse&lt;/em> un dispositivo MIDI in futuro,&lt;/li>
&lt;li>&lt;strong>il 2% degli utenti aveva un dispositivo MIDI che usava davvero in Darktable&lt;/strong>,&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>il codice era assolutamente terribile, in termini di:
&lt;ul>
&lt;li>qualità del codice: istruzioni &lt;code>if&lt;/code>/&lt;code>switch-case&lt;/code> illeggibili annidate su 4 livelli, nel bel mezzo di funzioni da 1000 righe (ho pubblicato esempi di frammenti nel mio &lt;a href="https://ansel.photos/it/news/darktable-dans-le-mur-au-ralenti/#keyboard-shortcuts" title="" rel="dofollow" >articolo&lt;/a>),&lt;/li>
&lt;li>volume del codice:
&lt;ul>
&lt;li>&lt;strong>3546 righe&lt;/strong> di codice per Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>4397 righe&lt;/strong> di codice per Darktable 5.0,&lt;/li>
&lt;li>l&amp;rsquo;aumento di volume è una conseguenza diretta del tentativo di correggere bug in un&amp;rsquo;architettura che non può essere corretta perché la sua complessità favorisce ulteriore complessità. Tutto ciò deriva dal design, ma risolvere problemi creati dalla complessità aggiungendo altra complessità non è una soluzione.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>complessità del codice:
&lt;ul>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Cyclomatic_complexity" title="Wikipedia link" target="_blank" rel="noopener noreferrer nofollow" >complessità ciclomatica&amp;thinsp;&lt;sup class="icon">&lt;i class="fab fa-wikipedia-w">&lt;/i>&lt;/sup>&lt;/a>:
&lt;ul>
&lt;li>&lt;strong>1088&lt;/strong> per Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>1245&lt;/strong> per Darktable 5.0 (&lt;a href="https://sonarcloud.io/component_measures?id=aurelienpierreeng_darktable-5&amp;amp;metric=complexity&amp;amp;view=list" title="External link" target="_blank" rel="noopener noreferrer nofollow" >dettagli&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>),&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.sonarsource.com/blog/cognitive-complexity-because-testability-understandability/" title="External link" target="_blank" rel="noopener noreferrer nofollow" >complessità cognitiva&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>:
&lt;ul>
&lt;li>&lt;strong>1885&lt;/strong> per Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>2098&lt;/strong> per Darktable 5.0 (&lt;a href="https://sonarcloud.io/component_measures?metric=cognitive_complexity&amp;amp;view=list&amp;amp;id=aurelienpierreeng_darktable-5" title="External link" target="_blank" rel="noopener noreferrer nofollow" >dettagli&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>è di gran lunga la funzione più complessa del software, anche se non opera sulle immagini. Per fare un confronto, la seconda funzione più complessa è la decodifica dei metadati EXIF, che ha una complessità cognitiva di &lt;strong>1348&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>non decodifica i modificatori dei tasti &lt;strong>per progettazione&lt;/strong>, ma gestisce soltanto le pressioni fisiche dei tasti, il che significa che:
&lt;ul>
&lt;li>l&amp;rsquo;input «1» dal tastierino numerico viene decodificato come &lt;code>Keypad End&lt;/code>,&lt;/li>
&lt;li>l&amp;rsquo;input «1» da una tastiera francese AZERTY viene decodificato come &lt;code>Shift+&amp;amp;&lt;/code>, o &lt;code>Shift+&amp;quot;&lt;/code> su BÉPO,&lt;/li>
&lt;li>devi quindi duplicare tutte le tue scorciatoie basate sui numeri per ogni modo di inserire un numero, ed essere pronto al fatto che la finestra delle impostazioni delle scorciatoie non contenga alcun numero effettivo nelle combinazioni di tasti.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>il design lato utente è assolutamente terribile, con troppe azioni ed emulazioni da configurare («effetti»), che dopo 4 anni non sono nemmeno completamente documentate (cos&amp;rsquo;è «ctrl-toggle»? «right-activate»?), e la configurazione delle scorciatoie usa una strana finestra divisa che non ha alcun senso,&lt;/li>
&lt;li>anche l&amp;rsquo;implementazione è terribile: la funzione è a conoscenza di tutta la GUI del software, e la GUI del software è a conoscenza del codice delle scorciatoie. Qui non c&amp;rsquo;è alcuna modularità, e modificare qualsiasi cosa nel codice delle scorciatoie può avere effetti inaspettati e indesiderati in qualsiasi punto del software.&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> Basta guardare il grafo delle dipendenze qui sotto,&lt;/li>
&lt;li>diverse «scorciatoie» (o associazioni MIDI) possono essere collegate alla stessa azione, il che significa che ogni interazione dell&amp;rsquo;utente deve consultare l&amp;rsquo;intera lista delle azioni disponibili, comportando una gestione delle scorciatoie molto inefficiente, in alcuni casi rallentamenti della GUI e falsi positivi «combinazione di tasti sconosciuta» in casi particolari.&lt;/li>
&lt;/ol>
&lt;figure class="img-wrapper caption-figure" id="shortcuts-brokenpng">
&lt;button class="open-lightbox-button" onclick="lightbox(&amp;#34;shortcuts-brokenpng&amp;#34;)">
&lt;i class="fa fa-expand-alt open-lightbox-icon fa-fw">&lt;/i>
&lt;/button>
&lt;button class="open-link-button" onclick="window.open('https:\/\/ansel.photos\/shortcuts-broken.png', '_blank');">
&lt;i class="fa fa-external-link-alt open-link-icon fa-fw">&lt;/i>
&lt;/button>
&lt;div class="img-container" onclick="lightbox(&amp;#34;shortcuts-brokenpng&amp;#34;)" style="cursor: pointer;" >
&lt;img src=https://ansel.photos/shortcuts-broken.png alt="image"
style=" "
decoding="async" loading="lazy"sizes="(max-width: 992px) 100vw, (max-width: 1200px) 66.67vw, 50vw" srcset="https://ansel.photos/shortcuts-broken_hu_e37121e26018e231.png 140w, https://ansel.photos/shortcuts-broken_hu_8766cdc7ed4c0ffe.png 264w, https://ansel.photos/shortcuts-broken_hu_3b7b1b3ab0c67aa4.png 331w, https://ansel.photos/shortcuts-broken_hu_4ce881621b99a2f7.png 400w, https://ansel.photos/shortcuts-broken_hu_41339900c3d3c228.png 496w, https://ansel.photos/shortcuts-broken_hu_b92319103d74af03.png 576w, https://ansel.photos/shortcuts-broken_hu_e47c9ad52cb7218b.png 600w, https://ansel.photos/shortcuts-broken_hu_2084be612ea1c347.png 720w, https://ansel.photos/shortcuts-broken_hu_c71b36b9691e7e8b.png 800w, https://ansel.photos/shortcuts-broken_hu_2febe49d8584f2b1.png 992w, https://ansel.photos/shortcuts-broken_hu_d31c96ca69e52d05.png 1200w, https://ansel.photos/shortcuts-broken_hu_98feacdcc50345e.png 1320w, https://ansel.photos/shortcuts-broken_hu_d99d42c5ec93ce86.png 1440w, https://ansel.photos/shortcuts-broken_hu_1f781700c7610d93.png 1600w, https://ansel.photos/shortcuts-broken_hu_f1176a8dfd24e2cb.png 1920w, https://ansel.photos/shortcuts-broken_hu_2c23e9088e4fe430.png 2048w"width="2508" height="1674"/>
&lt;/div>
&lt;figcaption>
Tasti numerici non decodificati e strana divisione della finestra tra «azione» e «scorciatoia».
&lt;/figcaption>
&lt;/figure>
&lt;figure class="img-wrapper caption-figure" id="accelerators-beforejpg">
&lt;button class="open-lightbox-button" onclick="lightbox(&amp;#34;accelerators-beforejpg&amp;#34;)">
&lt;i class="fa fa-expand-alt open-lightbox-icon fa-fw">&lt;/i>
&lt;/button>
&lt;button class="open-link-button" onclick="window.open('https:\/\/ansel.photos\/accelerators-before.jpg', '_blank');">
&lt;i class="fa fa-external-link-alt open-link-icon fa-fw">&lt;/i>
&lt;/button>
&lt;div class="img-container" onclick="lightbox(&amp;#34;accelerators-beforejpg&amp;#34;)" style="cursor: pointer;" >
&lt;img src=https://ansel.photos/accelerators-before.jpg alt="image"
style=" "
decoding="async" loading="lazy"sizes="(max-width: 992px) 100vw, (max-width: 1200px) 66.67vw, 50vw" srcset="https://ansel.photos/accelerators-before_hu_5f28983ffa269553.jpg 140w, https://ansel.photos/accelerators-before_hu_7622d56153ebaa50.jpg 264w, https://ansel.photos/accelerators-before_hu_6047a51a0a471dd7.jpg 331w, https://ansel.photos/accelerators-before_hu_11921ace387df1ec.jpg 400w, https://ansel.photos/accelerators-before_hu_85ed35537ae98e7.jpg 496w, https://ansel.photos/accelerators-before_hu_93478e0a0c240e0f.jpg 576w, https://ansel.photos/accelerators-before_hu_5b4f95f36ee81e48.jpg 600w, https://ansel.photos/accelerators-before_hu_8c81fb4523fe5064.jpg 720w, https://ansel.photos/accelerators-before_hu_3cc8ddd08babe7e5.jpg 800w, https://ansel.photos/accelerators-before_hu_5b099d695d7c6396.jpg 992w, https://ansel.photos/accelerators-before_hu_2dc23bad4b919367.jpg 1200w, https://ansel.photos/accelerators-before_hu_a20b8485baa1c620.jpg 1320w, https://ansel.photos/accelerators-before_hu_cef15eb2da9b6ff7.jpg 1440w, https://ansel.photos/accelerators-before_hu_efac0aace80f01eb.jpg 1600w, https://ansel.photos/accelerators-before_hu_fee979325612c769.jpg 1920w, https://ansel.photos/accelerators-before_hu_a5ad2ea57d9b2659.jpg 2048w"width="3730" height="1912"/>
&lt;/div>
&lt;figcaption>
&lt;p>Il grafo delle dipendenze di &lt;code>src/gui/accelerators.c&lt;/code> (Grande turducken MIDI) prima della riscrittura. Indovina perché lo chiamiamo «&lt;a href="https://en.wikipedia.org/wiki/Spaghetti_code" title="Wikipedia link" target="_blank" rel="noopener noreferrer nofollow" >spaghetti code&amp;thinsp;&lt;sup class="icon">&lt;i class="fab fa-wikipedia-w">&lt;/i>&lt;/sup>&lt;/a>»… Questo rende evidente che esiste una dipendenza a doppio senso tra il codice degli acceleratori e il resto del codice della GUI. È un incubo da mantenere.&lt;/p></description></item></channel></rss>