Quando si confrontano le prestazioni dei legami fluenti con espressioni di legame svizzero/Tibet in MVVMCRoss, vengono in gioco diversi fattori. Ecco una rottura dettagliata:
Panoramica dei tipi di rilegatura
- Binding fluenti: si tratta di espressioni di legame di tipo-sicuro create nel codice C#. Sono particolarmente utili su piattaforme come iOS e UWP in cui i file di layout XML non sono facilmente modificabili. I legami fluenti forniscono un modo chiaro e fortemente dal punto di vista per legare le proprietà di visualizzazione per visualizzare le proprietà del modello, che possono aiutare a ridurre gli errori di runtime catturando disallineamenti di tipo al momento della compilazione [1] [4].
- Espressioni di legame svizzero/Tibet: si tratta di espressioni di legame basate su stringhe in genere utilizzate nei file di layout XML (ad esempio, AXML di Android). I legami svizzeri sono più flessibili e consentono espressioni complesse come la concatenazione e la logica condizionale. Il legame tibet estende questo supportando una sintassi più avanzata simile a un mini-linguaggio per espressioni di legame [1] [6].
Confronto delle prestazioni
Compile-Time vs. Valutazione di runtime
- legami fluenti: poiché i legami fluenti sono definiti in C#, vengono valutati al momento della compilazione. Ciò significa che qualsiasi errore di tipo o problemi di vincolo viene catturato in anticipo, migliorando potenzialmente l'efficienza di sviluppo. Tuttavia, le prestazioni effettive in fase di esecuzione sono generalmente simili ad altri metodi di associazione poiché la configurazione di associazione è ancora eseguita in fase di esecuzione.
- Binding svizzeri/Tibet: questi attacchi vengono valutati in fase di esecuzione perché sono definiti come stringhe in file XML. Ciò significa che eventuali errori nelle espressioni vincolanti vengono scoperti solo quando l'app viene eseguita, il che può portare a cicli di sviluppo più lenti se non correttamente testati. Tuttavia, la valutazione del tempo di esecuzione non li rende intrinsecamente più lenti degli attacchi fluenti una volta impostati i legami.
Overhead runtime
- Associazioni fluenti: il sovraccarico di legami fluenti è minimo perché creano direttamente gli oggetti di legame necessari nel codice. Questo approccio diretto può essere leggermente più efficiente rispetto alle espressioni di stringa di analisi in fase di esecuzione.
- Binding svizzeri/Tibet: questi richiedono l'analisi delle espressioni di legame da XML in fase di esecuzione, che introduce alcuni sovraccarichi rispetto ai legami fluenti. Tuttavia, questo sovraccarico è in genere piccolo a meno che non si occupi di legami molto complessi o numerosi.
Efficienza di sviluppo e gestione degli errori
- Binding fluenti: fornire una migliore efficienza di sviluppo dovuta ai controlli a tempo di compilazione, che possono migliorare indirettamente le prestazioni riducendo il tempo trascorso a debug di questioni vincolanti di runtime.
- Binding svizzeri/Tibet: sebbene più flessibili per espressioni complesse, richiedono più controlli di runtime e possono portare a uno sviluppo più lento se non correttamente testato.
Conclusione
In termini di prestazioni grezze, sia i legami fluenti che svizzeri/tibeti sono generalmente comparabili una volta impostati. Tuttavia, i legami fluenti offrono vantaggi nell'efficienza dello sviluppo e nel rilevamento degli errori di compilazione, che possono migliorare indirettamente le prestazioni complessive dell'applicazione riducendo i tempi di debug. I binding svizzeri/tibet forniscono maggiore flessibilità in scenari complessi ma richiedono più controlli di runtime. La scelta tra loro dipende spesso dalle esigenze specifiche del progetto e dalla preferenza dello sviluppatore per le definizioni di vincolo basate su Codice rispetto a XML.
Citazioni:[1] https://blog.ostebaronen.dk/2018/01/mvvmcross-binding-target.html
[2] https://stackoverflow.com/questions/46522577/mvvmcross-issues-with-fluent binding
[3] https://stackoverflow.com/questions/48422489/mvvmcross-tibet-binding-to-viewmodel-itself
[4] https://www.mvvmcross.com/documentation/fundamentals/data-binding
[5] https://www.youtube.com/watch?v=3-CT97SBMXM
[6] https://stackoverflow.com/questions/48824612
[7] https://github.com/mvvmcross/mvvmcross/issues/1342
[8] https://github.com/mvvmcross/mvvmcross
[9] https://www.mvvmcross.com/documentation/fundamentals/value-converters
[10] https://stackoverflow.com/questions/48066268/xamarin-mvvmcross-fluent-binding-on-uwp
[11] https://crosscuttingconcerns.com/mvvmcross-fluent-databinding