Consigli folli da Microsoft: JScript vs Javascript (parte 1)
Venerdì 5 Gennaio, 2007Ormai da Microsoft ci aspettiamo davvero di tutto, soprattutto quando si parla di browser. Offendere l'intelligenza della comunità, tuttavia, risulta un po' sgradevole da accettare.
Sul Blog di IE7 è uscito oggi un articolo (IE+JScript Performance Recommendations Part 3: JavaScript Code Inefficiencies), se così possiamo definirlo di Peter Gurevich, Performance PM for IE, con la parte III dei suoi "consigli" per gli sviluppatori.
Primo appunto: perchè Microsoft si ostina ad implementare una sua versione di Javascript - che chiama appunto JScript - complicando la vita a tutti?
Secondo appunto: proprio perchè il motore di JScript è proprietà della Microsoft, invece di perdere tempo a dire a "noi" come aggirare i difetti, perchè non li sistemano una volta per tutte?
Lasciando stare il primo consiglio di questa III parte, che potete leggere direttamente sul Blog o su Ajaxian, il secondo è davvero eclatante, e sinceramente non lo diregisco proprio.
Don't use Property Accessor Functions
Quando si dice il progresso! In pieno 2007, un Project Manager della Microsoft viene a dire a noi sviluppatori di Non usare le funzioni di get e set in JScript!
La follia, evidentemente, è uno strano male, che colpisce in modo repentino e fuorviante. JScript - sullo stile di Javascript - è implementato seguendo un modello ad oggetti! È un linguaggio ad oggetti, sulla scia del C++. Il fatto che le variabili siano accessibili dall'esterno (come sottolineato nell'articolo - cosa ovvia tra l'altro) non è assolutamente un vanto, anzi. La tecnica dell'incapsulamento è propria della filosofia della programmazione OO. Incapsulare le proprietà, passando dai virtual-method get e set è una forza del linguaggio Object Oriented, non un limite. Consigliare di non farne uso è a dir poco criminale, e gli eventuali problemi di performance sono a carico dell'interprete e dei suoi autori, non certo dell'end-developer.
Quindi, alla fine, JScript va usato come un semplice C, guai a trattarlo come C++, pena "impallare" il browser o chissà cos'altro.
Inoltre, come segnalato sul Blog, il tutto è un falso problema in quanto JScript NON implemente le vere funzioni di get e set, solo Javascript lo fa!
Ma il problema, evidentemente, rimane. In Javascript (scusate ma JScript non riesco proprio a digerirlo) ci sono varie tecniche per creare un oggetto. Ad esempio lo si può creare in modo immediato in questo modo:
-
var myObject = {
-
miaProprieta: 0,
-
-
mioMethodo: function() { alert("Hello"); }
-
};
In questo modo non ho dichiarato una classe. L'oggetto viene per così dire dichiarato e creato contemporaneamente. È un modo rapido quando l'oggetto che ci serve è unico.
Oppure, il che è equivalente ai fini pratici:
-
function CmyObject() {
-
this.miaProprieta = 0;
-
-
this.mioMetodo = function () { alert("Hello") }
-
-
}
-
//
-
var iMyObject = new CmyObject();
In questo caso prima si definisce la classe - tramite una function - (CmyObject) e poi si crea esplicitamente l'oggetto con new.
A parte le questioni stilistiche relative al singolo sviluppatore, il problema di come accedere alle proprietà di una classe rimane. Consiglio vivamente a tutti gli interessati, comumque, di leggere le risposte al Blog di Microsoft, davvero interessanti.
Sul Blog erano presenti tre modi di accesso: con le funzioni get e set, diretto e passando da prototype. Alla fine la cosa simpatica è stata che sul Blog c'è un codice per eseguire un Testdrive, una prova dei tre metodi indicati sopra. Il codice è presente sul Blog ma lo riporto qui per completezza:
-
<script>
-
// Slow Car definition
-
function SlowCar()
-
{
-
this.m_tireSize = 17;
-
this.m_maxSpeed = 250; // One can always dream!
-
this.GetTireSize = SlowCar_get_tireSize;
-
this.SetTireSize = SlowCar_put_tireSize;
-
}
-
function SlowCar_get_tireSize()
-
{
-
return this.m_tireSize;
-
}
-
function SlowCar_put_tireSize(value)
-
{
-
this.m_tireSize = value;
-
}
-
</script>
-
-
-
<script>
-
// Faster Car, no more property accessors
-
function FasterCar()
-
{
-
this.m_tireSize = 17;
-
this.m_maxSpeed = 250; // One can always dream!
-
}
-
</script>
-
-
-
<script>
-
// Prototype Car, use the language features!
-
function PrototypeCar()
-
{
-
this.m_tireSize = 17;
-
this.m_maxSpeed = 250; // One can always dream!
-
}
-
-
PrototypeCar.prototype.GetTireSize = function() { return this.m_tireSize; };
-
PrototypeCar.prototype.SetTireSize = function(value) { this.m_tireSize = value; };
-
</script>
-
-
-
<script>
-
function TestDrive()
-
{
-
var slowCar = new SlowCar(); // Safe and reliable, probably not fast
-
var fasterCar = new FasterCar(); // Lacks air-bags, probably faster
-
var protoCar = new PrototypeCar(); // Can technology win the day?
-
-
-
var start = (new Date()).getTime();
-
for(var i = 0; i <100000; i++) { slowCar.SetTireSize(slowCar.GetTireSize() + 1); }
-
var end = (new Date()).getTime();
-
output.innerHTML += "Slow Car " + (end - start) + "<br>";
-
-
-
start = (new Date()).getTime();
-
for(var i = 0; i <100000; i++) { fasterCar.m_tireSize += 1; }
-
end = (new Date()).getTime();
-
output.innerHTML += "Faster Car " + (end - start) + "<br>";
-
-
-
start = (new Date()).getTime();
-
for(var i = 0; i <100000; i++) { protoCar.SetTireSize(protoCar.GetTireSize() + 1); }
-
end = (new Date()).getTime();
-
output.innerHTML += "Prototype Car " + (end - start) + "<br>";
-
}
-
</script>
-
-
<button onclick="TestDrive();">Test Drive Cars!</button>
-
<div id="output"></div>
Ora, questo è l'output (relativo alla mia macchina) con IE7:
Slow Car 515
Faster Car 63
Prototype Car 547
Con FireFox (v.2.0.0.1):
Slow Car 156
Faster Car 47
Prototype Car 172
Con Opera (v.9.10):
Slow Car 172
Faster Car 47
Prototype Car 172
Insomma
IE7 ne esce davvero male... non so se notate l'enorme differenza. Quindi direi che JScript potrebbe essere abolito, eliminato, cancellato, vaporizzato. Speriamo che Microsoft si decida anche lei ad adottare Javscript e non i surrogati.






















Lascia un commento