Stavo eseguendo il nostro codice tramite JSHint, e ho deciso di passare i controlli contro la complessità ciclomatica, per poi proseguire con uno sprint a lungo refactoring. Un posto però mi ha sconcertato, ecco un frammento 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 sorprendentemente, in questa implementazione CM è 5, il primo tentativo è stato quello di utilizzare la soluzione da MDN:
var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
window.requestAnimationFrame = requestAnimationFrame;
Che mi sembra semplicemente un trucco (sì, lo so, la maggior parte dei programmatori javascript a tempo pieno non sono d'accordo con me, tuttavia questo è un parere prevalente all'interno del nostro team). Scarabocchiando attorno al mio codice, ho trovato altri hack che potrei impiegare per il code-linter completo, tra quelli di cui ero fiero per circa 5 secondi c'era l'utilizzo delle comprensibilità degli 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 curioso di sapere se esiste una pratica più o meno standard di refactoring del codice di ramificazione lunga (che non è banale da ridurre)?