Domanda concettuale se passare dati tra le funzioni o usare una classe

2

Ho difficoltà a trovare un concetto / design ideale e apprezzerei le tue opinioni su questo.

Ho 16 "tessuti" di cui ho bisogno per tenere traccia. Ogni tessuto contiene una pressione che deve essere calcolata in base all'ultimo valore.

Quindi stavo riflettendo su come organizzarlo / strutturarlo.

1. Usa array di fazzoletti

e passando il valore precedente a una funzione per restituire il nuovo valore calcolato.

Ad esempio:

load_tissue = function(value, tissue) {
  return { pressure: tissue.pressure + value };
}

tissue = { pressure: 1 }

newTissue = load_tissue(2,tissue);
// newTissue = { pressure: 3 }

Ovviamente questa è una funzione molto semplificata che non fa altro che restituire un nuovo oggetto con il valore aggiunto. Lo farei per ogni 16 scomparti.

Questa versione funziona ma non sembra molto intuitiva e orientata agli oggetti.

2. Crea un oggetto Tissue

La prossima versione dovrebbe avere un oggetto Tissue che contiene i dati e ha una funzione da calcolare. Questa versione mi sembra molto intuitiva perché nel mondo reale è la stessa.

Tissue = function() {
  this.pressure = 1;
}

Tissue.prototype.load_tissue(value) {
  this.pressure = this.pressure + value;
}

tissue = new Tissue();
newTissue = tissue.load_tissue(2);

// newTissue.pressure = 3;

Il problema che ho con questo è che non riesco a mantenere l'ultimo stato a causa del riferimento.

tissue = new Tissue();
tissue1 = tissue.load_tissue(2); // tissue1 = 3;
tissue2 = tissue.load_tissue(3); // tissue2 = 6 BUT tissue1 = 6 as well.

Anche se mi piace che l'oggetto Tissue conosca lo stato, in alcune circostanze devo essere in grado di "prevedere" un valore senza salvarlo sull'oggetto.

Ora sono un po 'confuso quale sia la soluzione ideale per questo. Stavo pensando di clonare l'oggetto ..

La vera classe Tissue () è un po 'più complessa e assomiglia a questa

Tissue = function(n2_half_time, he_half_time, n2_A, n2_B, he_A, he_B, p_surface) {

   this.startPN2 = 0.7902;
   this.startPHE = 0.0;

   this.half_time = {
       n2: n2_half_time,
       he: he_half_time
   };

   this.k_decay = {
       n2: Math.LN2 / n2_half_time,
       he: Math.LN2 / he_half_time
   };

   this.A = {
       n2: n2_A,                                                                                                                                                          he: he_A
   };

   this.B = {
       n2: n2_B,
       he: he_B
   };

   this.pN2;
   this.pHe;
                                                                                                                                                                      this.init(p_surface);
}

Tissue.prototype.init = function(p_surface) {
   var ambient_pressure = (p_surface == false) ? PRESSURE_AMBIENT_SEA_LEVEL : p_surface;
   this.pN2 = this.startPN2 * (ambient_pressure - PRESSURE_WATER_VAPOUR);
   this.pHe = this.startPHE;
}

Tissue.prototype.load_tissue = function(p_abs, gas, rate, time) {
    var kN2 = this.k_decay.n2;
    var p_alv_n2 = (gas.n2 / 100) * (p_abs - PRESSURE_WATER_VAPOUR);
    var R_n2 = (gas.n2 / 100) * rate;

    var kHe = this.k_decay.he;
    var p_alv_he = (gas.he / 100) * (p_abs - PRESSURE_WATER_VAPOUR);
    var R_he = (gas.he / 100) * rate;

    this.pN2 = this.schreiner_equation(p_alv_n2, R_n2, time, kN2, this.pN2);
    this.pHe = this.schreiner_equation(p_alv_he, R_he, time, kHe, this.pHe);
}
    
posta Chris 02.07.2015 - 13:51
fonte

1 risposta

2

La tua confusione intorno

tissue = new Tissue();
tissue1 = tissue.load_tissue(2); // tissue1 = 3;
tissue2 = tissue.load_tissue(3); // tissue2 = 6 BUT tissue1 = 6 as well.

deriva dal valore di confusione e dalla semantica orientata agli oggetti nell'astrazione dei tessuti. Questo è chiamato "aliasing".

Per scoprire quale usare, poni la seguente domanda "Se due tessuti hanno la stessa pressione, sono sempre la stessa cosa?". Se si dice SÌ, il primo approccio (restituire un nuovo oggetto quando si modifica il valore) è corretto. Se dici NO (cioè ci possono essere due diversi tessuti che hanno la stessa pressione), allora il tuo secondo approccio è corretto.

Se un tessuto orientato agli oggetti deve conoscere la cronologia dei suoi valori per l'elaborazione successiva, allora l'oggetto deve mantenere tale lista, come la seguente:

Tissue = function() {
  this.history = [];
  this.pressure = 1;
}

Tissue.prototype.load_tissue(value) {
  this.history.push(this.pressure);
  this.pressure = this.pressure + value;
}
    
risposta data 02.07.2015 - 14:23
fonte

Leggi altre domande sui tag