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);
}