Nella programmazione ad oggetti spesso si sente l'esigenza di comporre gli oggetti anziche creare complesse gerarchie di codice e per questo sono state introdotte tutta usa serie di tecniche oltre a nuove caratteristiche dei linguaggi stessi.
Ad esempio se avessi voluto"Mescolare" del codice in Ruby per ottenere un nuovo oggetto con le caratteristiche risultati (e senza dover usare un foglio A3 per disegnarne l'albero genealogico ;-)) avrei avuto a mia disposizione i Mixin, qualcosa del tipo:
module InutilityModule
def important_method
@obj_var = 5
end
end
class TClass
include InutilityModule
def initialize
@obj_var2 = 2
end
def add
return @obj_var2+@obj_var
end
end
Le istanze della classe TClass avranno il metodo important_method oltre ai propri.
In JavaScript le cose vanno un po' diversamente in quanto non ci sono
classi ma oggetti prototipo, e inoltre gli oggetti altro non sono se non
Hash tables.
Se vogliamo aggiungere un metodo ad un oggetto JavaScript ci basta definirne
la nuova proprietà:
var myobj = {
method1: function() {
this._var1 = 5;
}
};
myobj.method2 = function() {
this._var2 = 3;
}
myobj["method3"] = function() {
alert(this._var1+this._var2);
}
alle volte pero' mi e' capitato di doverne aggiungere un gruppo e quindi
per pulizia ciclo su tutti gli attributi dell'oggetto sorgente:
var codetomix = {
method2: function() {
alert("method2");
},
method3: function() {
alert("method3");
}
}
for (var property_name in codetomix) {
myobj[property_name] = codetomix[property_name];
}
volendo (come fanno molti framework javascript) si puo' incapsulare la funzionalita'
in una funzione di comodo:
function apply(src, dst) {
for (var prop in src) {
dst[prop] = src[prop];
}
}
apply(codetomix,myobj);
chiaramente questa versione di "apply" è moooolto minimale ma nella sua minimalita' puo' essere molto utile quando non si vuole ricorrere all'implementazione di un particolare framework (che introduce in genere una maggiore complessita' avendo come obiettivo quello di realizzare l'ereditarietà alla maniera classica)
IMHO la cosa simpatica di snippet come questo è che rendono evidente la propensione a scheme del design di JavaScript ;-)
0 commenti:
Posta un commento