Pulisci passaggio parametri deep code

5

Quindi Clean Code dice che dovresti separare ciascuna attività con una singola funzione (e aggiungere queste funzioni con un nome corretto).

Mi piace l'idea, ma finora ho affrontato questo problema: ricevi un parametro che vuoi usare anche nella funzione più in alto, ma ne hai bisogno anche al livello più basso, quindi devi passare parametro per ogni funzione intermedia, che non è cool.

Ecco il mio codice:

onUpdate = function(currentSeconds){
    updateRoute(currentSeconds);
    updateAlerts(currentSeconds);
};
updateAlerts = function(currentSeconds){
    for(var i = 0; i < alertMarkers.length; ++i)
        oneAlertUpdate(currentSeconds, alertMarkers[i], alertAll[i]);
}
oneAlertUpdate = function(currentSeconds, alertMarker, alert){
        updateAlertMarker(alertMarker, alert[entryIndex]);
        changeMarkerOpacityIfNeeded(alertMarker, currentSeconds);
    }
}
changeMarkerOpacityIfNeeded = function(alertMarker, currentSeconds){
    //set opacity based on currentSeconds
    var opacity = alertMarker.opacityTime < currentSeconds ? 1 : 0.5;
    if(alertMarker.getOpacity() != opacity)
        alertMarker.setOpacity(opacity);
}
  • il parametro qui è currentSeconds deve essere passato, ma è usato solo al livello più basso
  • tieni presente che non uso currentSeconds direttamente nella funzione più in alto, ma è cruciale che venga passato lì, scriverò il motivo se dici che è pertinente
posta Ferenc Dajka 05.04.2016 - 11:41
fonte

2 risposte

2

Un'opzione potrebbe essere quella di creare una "classe" (o l'equivalente JavaScript in questo caso), che si comporta come un functionoid / functor e memorizza currentSeconds , quindi chiama in quella 'classe' [sic] da un proxy funzione per assicurarti di chiamare ancora onUpdate dal codice chiamante:

var Alerter = (function () {
    function Alerter(currentSeconds) {
        this.currentSeconds = currentSeconds;
    }

    Alerter.prototype.onUpdate = function () {
        this.updateRoute();
        this.updateAlerts();
    };

    Alerter.prototype.updateAlerts = function () {
        for (var i = 0; i < alertMarkers.length; ++i)
            this.oneAlertUpdate(alertMarkers[i], alertAll[i]);
    };

    Alerter.prototype.oneAlertUpdate = function (alertMarker, alert) {
        this.updateAlertMarker(alertMarker, alert[entryIndex]);
        this.changeMarkerOpacityIfNeeded(alertMarker);
    };

    Alerter.prototype.changeMarkerOpacityIfNeeded = function (alertMarker) {
        //set opacity based on currentSeconds
        var opacity = alertMarker.opacityTime < this.currentSeconds ? 1 : 0.5;
        if (alertMarker.getOpacity() != opacity)
            alertMarker.setOpacity(opacity);
    };

    return Alerter;
}());


function onUpdate(currentSeconds) {
    new Alerter(currentSeconds).onUpdate();
}

Lo svantaggio principale di questo è una maggiore complessità aggiuntiva nel codice, che nega la maggior parte dei vantaggi nell'evitare di passare ripetutamente le stesse variabili in primo luogo.

Tuttavia evita quel po 'di duplicazione, e il codice chiamante non dovrebbe notare alcuna differenza almeno:

var currentSeconds = 5;
onUpdate(currentSeconds);

Ma nel complesso, non sono sicuro che questo approccio sia davvero "più pulito"; le soluzioni più semplici sono spesso le migliori.

    
risposta data 05.04.2016 - 12:17
fonte
0

Funzioni come oneAlertUpdate e changeMarkerOpacityIfNeeded devono essere visibili al di fuori di updateAlerts ? In caso contrario, potrebbe essere facile evitare di dover "passare" i valori lungo la catena di chiamate.

onUpdate = function(currentSeconds){
    updateRoute(currentSeconds);
    updateAlerts(currentSeconds);
};

updateAlerts = function(currentSeconds){
    oneAlertUpdate = function(alertMarker, alert){
            updateAlertMarker(alertMarker, alert[entryIndex]);
            changeMarkerOpacityIfNeeded(alertMarker);
        }
    }
    changeMarkerOpacityIfNeeded = function(alertMarker){
        //set opacity based on currentSeconds
        var opacity = alertMarker.opacityTime < currentSeconds ? 1 : 0.5;
        if(alertMarker.getOpacity() != opacity)
            alertMarker.setOpacity(opacity);
    }

    for(var i = 0; i < alertMarkers.length; ++i)
        oneAlertUpdate(alertMarkers[i], alertAll[i]);
}
    
risposta data 03.11.2016 - 06:47
fonte

Leggi altre domande sui tag