Approcci per ridurre la complessità ciclomatica
https://softwareengineering.stackexchange.com/questions/193923
-
06-11-2019 - |
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