Dove dovresti inserire funzioni e variabili che sono necessarie solo per una funzione in una classe?

-2

Dì che hai una lezione di auto. Le proprietà che hanno senso per una classe Car potrebbero essere:

var make;
var model;
var year;
var turnOn; // a function

Ma la funzione turnOn è molto complicata e finisce per richiedere una variabile statica e una coppia di funzioni secondarie:

var isTurningOn; // too specific to be a class variable
function turnOn() {
    // 30 lines to start the engine
    // 30 lines to start the air conditioner
    // 30 lines to start the radio
}

Quindi ora abbiamo una funzione che forse non è propriamente adatta per essere creata nella sua classe e sta inquinando la classe Car con una variabile che utilizza solo la funzione turnOn . Inoltre la funzione contiene sezioni di codice che dovrebbero essere inserite nelle proprie funzioni. Quindi cosa fai in situazioni come questa?

    
posta user1873073 05.05.2014 - 03:54
fonte

4 risposte

3

Se una variabile è necessaria solo per una singola funzione, la variabile dovrebbe essere nella funzione che la usa. Ciò contribuirà a mantenere pulito il resto della classe. Se il resto della classe non usa quella variabile, non dovrebbe mai preoccuparsi di quella variabile o sapere che esiste anche.

Per quanto riguarda le 30 righe ciascuna per avviare i vari componenti, come motore, radio, ecc., pensi che quei componenti dovrebbero invece essere nella loro classe? Ciò significherebbe che la funzione "turnOn" è ridotta a 3 righe di codice (o 1 riga per componente da accendere). La classe dell'auto quindi non dovrebbe essere responsabile della creazione dei componenti come il motore, ecc. Invece, un costruttore della classe Car dovrebbe essere creato per accettare tutti i suoi componenti come parametri. Quando pensi nel mondo reale, la macchina non crea il suo motore, una fabbrica lo fa. Quindi è possibile creare una classe "EngineFactory", "RadioFactory", ecc. Per creare i singoli componenti. Tutti questi componenti verranno quindi passati a un "CarFactory", che chiama semplicemente il costruttore Car con tutti i suoi componenti.

    
risposta data 05.05.2014 - 04:08
fonte
1

La maggior parte delle risposte esistenti sembra indirizzarsi verso Complessità inutile .

Sono d'accordo che la funzione turnOn non abbia bisogno di essere nella sua classe, tuttavia isTurningOn ha senso come variabile membro di istanza, perché traccia una parte dello stato di ogni istanza Car . Dividere turnOn in metodi privati più brevi e specifici e lasciarlo per ora.

Semplifica le cose finché non trovi che aggiungere complessità semplifica qualcos'altro. Se Car è proprio come lo descrivi: un paio di variabili membro, una variabile stato e una funzione turnOn , non c'è assolutamente alcun motivo per dividerlo in più classi. Non è ancora così complesso.

    
risposta data 05.05.2014 - 17:46
fonte
0

Più di 120 righe di codice che richiedono sottofunzioni potrebbero facilmente diventare la loro classe veicolo di proprietà piuttosto che dover essere incorporate. Questo è probabilmente l'approccio che prenderei qui.

Se ti impegni a incorporare direttamente la funzione, inserirò le variabili della funzione all'interno del corpo della funzione che generalmente le spinge a tale funzione nella maggior parte delle piattaforme e almeno indica che queste sono variabili locali per i lettori. Per quanto riguarda le funzioni secondarie, puoi gestirle in modi diversi a seconda delle piattaforme. Se la piattaforma supporta concetti di programmazione funzionale, di solito è possibile trovare un modo per dichiarare una variabile come una funzione e trattarli efficacemente come variabili. Questo funziona sicuramente in javascript, che è quello che immagino tu stia scrivendo in base al tuo esempio.

    
risposta data 05.05.2014 - 04:07
fonte
0

Almeno per l'esempio che hai fornito sembra appropriato utilizzare il modello di stato per descrivere meglio la tua classe Car .

Quando si crea l'auto non si passano solo le dipendenze necessarie (come il motore, quando è stato creato e così via) come argomenti nel costruttore, ma anche il primissimo stato che implementa un'interfaccia ICarState . Puoi chiamarlo ad esempio NoActionState e salvarlo in un membro di classe privato come year o model .

Più tardi, quando l'auto viene avviata, non modifichi una variabile isTurningOn ma sostituisci l'istanza NoActionState con una nuova istanza di EngineStartingState . Il vantaggio ora è che non devi usare molte condizioni per verificare se variabili private come isTurningOn reagiscono correttamente allo stato dato ma puoi invece lasciare che le tue classi di stato implementino il comportamento desiderato.

E quando la tua auto ha la possibilità di iniziare, suppongo che lo stato successivo dopo l'avvio sia il DrivingState . Un altro vantaggio è che ora puoi aggiungere nuovi stati anche quando sono necessarie nuove funzionalità senza che le modifiche cambino nelle altre classi di stato.

In questo modo hai risolto il tuo problema in un modo in cui le informazioni di stato che hai utilizzato la tua variabile isTurningOn per ora vengono salvate in una variabile di stato che contiene lo stato corrente della tua auto e le informazioni più dettagliate per lo stato corrente vengono salvate in la sua classe.

    
risposta data 05.05.2014 - 08:47
fonte

Leggi altre domande sui tag