Domanda

Stavo eseguendo il nostro codice tramite Jshint e ho deciso di cambiare i controlli contro la complessità ciclomatica, e poi sono andato a lungo lo sprint di refactoring. Un posto per quanto mi sconcertasse, ecco uno snippet di codice:

var raf = null //raf stands for requestAnimationFrame

if (window.requestAnimationFrame) {
  raf = window.requestAnimationFrame;
} else if (window.webkitRequestAnimationFrame) {
  raf = window.webkitRequestAnimationFrame;
} else if (window.mozRequestAnimationFrame) {
  raf = window.mozRequestAnimationFrame;
} else if (window.msRequestAnimationFrame) {
  raf = window.msRequestAnimationFrame;
} else {
  raf = polyfillRequestAnimationFrame;
}

Non sorprende che in questa implementazione cm sia 5, il primo tentativo è stato quello di utilizzare la soluzione di MDN:

var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
                          window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
window.requestAnimationFrame = requestAnimationFrame;

Che mi sembra semplicemente un hack (sì, lo so, la maggior parte dei programmatori JavaScript a tempo pieno non sarà d'accordo con me, tuttavia questa è un'opinione prevalente all'interno del nostro team). Scarabocchiando attorno al mio codice, ho trovato un altro hack che potevo impiegare per il code-linter completo, tra quelli che ero orgoglioso per circa 5 secondi era l'uso di comprensioni dell'array:

var rafs = [
             window.requestAnimationFrame,
             window.webkitRequestAnimationFrame,
             window.mozRequestAnimationFrame,
             window.msRequestAnimationFrame,
             polyfillRequestAnimationFrame
           ].filter(function (rafClosure) {
             return rafClosure !== null && rafClosure !== undefined;
           });
return rafs[0];

Tuttavia, sono curiosa se esiste una pratica più o meno standard di refactoring a lungo codice di ramificazione (che non è banale da ridurre)?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top