Látva azt, hogy mostanában mit művel a Microsoft, a minőség szót egy lapon emlegetni velük kimeríti a gúnyolódás kategóriáját. Ez már nem ugyanaz a cég, amelyik az újításaival messze megelőzte a korát az Internet Explorer 4-5-6 sorozattal, hanem dilettáns hipszterek gyülekezete.
Kiváló példa a minőségre a Skype: a tipikus szoftver, ami minden verzióval csak rosszabb lesz.
Évekbe tellett kijavítani azt a hibát, hogy ne szivárogjon a memória, mert nap végére már négy-ötszáz megabájtot is megevett.
Évekbe tellett megcsinálni, hogy az Escape billentyű lenyomására megbízhatóan bezárja a chat ablakot.
Bizonyos partnereknél az üzenetek néha órák alatt érkeznek meg.
A képernyőmegosztás bizonyos gépeken nem működik, az első képkocka átvitele után nem küld többet.
Bizonyos partnereknél konferenciát csak egy bizonyos sorrendben lehet indítani.
Feltételezem, hogy a cégnél egységes minőségpolitika van, azaz minden szoftver fejlesztésénél vannak bizonyos követelmények. Ha a Skype-ból vagy a Windows-ból indulok ki, messze vannak attól, amit minőségnek lehet nevezni.
Igyekszem. Ettől függetlenül nézted te azokat a kódokat? Véletlenszerűen kiválasztottam egyet: imageQueryBuilder.js. Attól lesz egy metódus belső használatú, hogy a neve elé tesznek egy aláhúzást, és odaírják mellé, hogy "Internal method" (188. sor)? Ha belső használatú, akkor miért írhatja felül bárki?
Miért nem a hagyományos módon definiálnak belső változókat és metódusokat?
<script type="text/javascript"> function obj() { var beallitasok = {};
function beallitas(_tulajdonsag, _ertek) { if (_ertek === undefined) { beallitasok[_tulajdonsag] = _ertek; } return beallitasok[_tulajdonsag]; }
this.beallitas = beallitas; }
var Obj = new obj; obj.beallitas('tulajdonság', 'érték'); </script>
Vagy statikus tagoknál "Type members are often called »static« members, though in JavaScript they are not actually static.".
Ha nincsenek JS-ben statikus tagok, akkor miért nevezzük úgy őket? Ez félrevezető lehet sokak számára.
Miért használnak .forEach metódust, amikor egyrészt kevesebbet tud, mint egy hagyományos for ciklus (nincs benne a break-hez hasonló funkció), valamint akár tízszer lassabb hozzá képest?
Kíváncsiságból utánaolvastam a WinJS.Class-ban pár dolognak. A Custom types and WinJS Class oldalon például a következőképp ad új tagot a Robothoz:
Object.defineProperty(Robot.prototype, "modelName", { get: function () { this.computeModelName(); } });
Ennek mi az előnye a következőhöz képest?
Robot.prototype.modelName = { get: function () { this.computeModelName(); } };
Vagy vegyük az oldal végén lévő örököltetést. Miben jobb az a következőnél?
function SpaceRobot(_name) { this.name = _name; } SpaceRobot.prototype = new Robot(); SpaceRobot.prototype.constructor = SpaceRobot; SpaceRobot.prototype.airSupply = ''; SpaceRobot.prototype.saveSelf = true;
Csak azért kérdem, mert a WinJS.Class.derive oldalán semmilyen információt nem lehet olvasni arról, milyen dolgokat művel a derive a kapott paraméterekkel. Aggat rájuk más metódusokat, tagokat? Ha igen, miért nincs leírva? Ha nem, miért használjuk egyáltalán?
(Szerkesztve: közben utánaolvastam, hogy a SpaceRobot.prototype = new Robot(); nem túl szerencsés, ha a konstruktornak vannak mellékhatásai.)
Object.defineProperty(Robot.prototype, "modelName", {
get: function () { this.computeModelName(); }
});
Ennek mi az előnye a következőhöz képest?
Robot.prototype.modelName = {
get: function () { this.computeModelName(); }
};
Az az előnye, hogy a new Robot().modelName automatikusan meghívja a computeModelName metódust, anélkül, hogy neked explicit meg kellene hívni. Ezen kívül a te általad javasolt, egy teljesen más objektum architektúrát eredményez, ahol a modelName-nek van egy get metódusa, míg a Object.defineProperty a modelName nem listázandó, nem módosítható stb.
Hogyan portolnád a kódot nyelvek közt? Ha arra gondolsz, hogy az API nem feleltethető meg egy az egyben két különböző nyelvű implementáció esetén, azt egyrészt az API felhasználójaként nem érzem problémának, másrészt szinte elkerülhetetlen.
Hogy kezdetben nem kell megírnod a függvényeket, csak ha idővel írás-olvasás helyett valami mást akarsz csinálni a tulajdonság használatakor. Ilyenkor a változás nem érinti azokat, akik használják a kódod.
Elsőre nem tűnik túl erős érvnek. Egyrészt a mass replace-t már ezer éve kitalálták, másrészt komplexitást rejt el. Ha függvényt hívsz, arról feltételezheted, hogy megváltoztathatja egy objektum állapotát, de egy adattag értékének közvetlen állításakor ez nem feltétlenül igaz.
Pedig az előző hozzászólásod alapján már elfogadtad a universal access principle-t, hisz a konzisztensen függvényeken keresztül végzett írás-olvasás célja is ez. A property szintakszis csupán segít elkerülni a függvények megírását, ahol az felesleges.
Az, hogy elfedi a komplexitást, egy ismert velejárója, ilyenkor az adott művelet komplexitása dokumentálható. Ez a bizonytalanság egyébként nyelvi szinten is ismert, a tömbhossz a klasszikus példája, ami általában tulajdonságként érhető el, de legalább egyszer minden programozó elgondolkodik rajta, hogy nem kellene-e tárolni a ciklus előtt.
A mass replace pedig még ha nem is vezet be hibát sehol, akkor is minden hívó újrafordítását eredményezi, míg ha változatlan marad az API, akkor elég az újralinkelés.
Nem, én a setter/getter függvényekre gondoltam, amiket adattagok írásakor/olvasásakor hívunk.
Ha nincsenek publikus adattagok, csak függvények, akkor van okod feltételezni, hogy más is történik. Ezért írtam, hogy a setter függvények nem intuitívak, ugyanis ránézésre egy külső adattag írásakor nem tudod megmondani, hogy fog-e egyéb függvény lefutni a háttérben.
Ezért írtam, hogy a setter függvények nem intuitívak, ugyanis ránézésre egy külső adattag írásakor nem tudod megmondani, hogy fog-e egyéb függvény lefutni a háttérben.
Ezt semmilyen függvény hívásakor nem tudod megmondani, miért pont a settereknél hiányolod?
Amikor átnézed a kódot, az elsőnél azt várod, hogy az objektumnak csak a tulajdonsag adattagja fog változni, a második esetben viszont bármi történhet, azaz más állapot is megváltozhat. Ekkor nyilvánvaló, hogy a setTulajdonsag metódusba is bele kell nézni hiba esetén.
Az első sorra ránézve nem derül ki, hogy van mögötte setter, ezért írtam, hogy nem intuitív a használata.
Értem amit mondasz, csak arra próbállak ráébreszteni, hogy egy tulajdonság írása egy adattípus felhasználója szemszögéből pont ugyanolyan művelet mint bármilyen másik, és így önkényes ettől az egytől várni, hogy garanciát adjon a műveleti komplexitásra.
Visszatekintve jobb lett volna, ha a nyelvek tervezői soha nem különböztetik meg az operátorokat az eljárásoktól, akkor nem zavarna meg az intuíciód.
Best practice: kerülni kell a költséges implementációkat (tipikus példa: DOM innerHTML property), illetve nyilván egy getternek nem illik módosítania az objektum állapotát. Viszont egy setter esetén pl sokkal kényelmesebb API-t kapunk (tipikus példa: koa). Azt, hogy egy property írásától "mit várunk el", az meg rajtunk múlik: elolvassuk-e az API dokumentációt/forráskódot, vagy sem.
A kényelemnek mindig ára van, ami jelen esetben további komplexitás a kódban a fentebb leírtak miatt, komplexitás a futtatókörnyezetben, emellett a setter függvényeknek, ha jól sejtem, csak egy paramétert lehet adni.
Látva azt, hogy mostanában
Kiváló példa a minőségre a Skype: a tipikus szoftver, ami minden verzióval csak rosszabb lesz.
Feltételezem, hogy a cégnél egységes minőségpolitika van, azaz minden szoftver fejlesztésénél vannak bizonyos követelmények. Ha a Skype-ból vagy a Windows-ból indulok ki, messze vannak attól, amit minőségnek lehet nevezni.
Ha ez neked annyira fáj,
De neki mindenhová le kell
Oké
Miért nem a hagyományos módon definiálnak belső változókat és metódusokat?
function obj() {
var beallitasok = {};
function beallitas(_tulajdonsag, _ertek) {
if (_ertek === undefined) {
beallitasok[_tulajdonsag] = _ertek;
}
return beallitasok[_tulajdonsag];
}
this.beallitas = beallitas;
}
var Obj = new obj;
obj.beallitas('tulajdonság', 'érték');
</script>
Vagy statikus tagoknál "Type members are often called »static« members, though in JavaScript they are not actually static.".
Ha nincsenek JS-ben statikus tagok, akkor miért nevezzük úgy őket? Ez félrevezető lehet sokak számára.
Miért használnak
.forEach
metódust, amikor egyrészt kevesebbet tud, mint egy hagyományosfor
ciklus (nincs benne abreak
-hez hasonló funkció), valamint akár tízszer lassabb hozzá képest?Kíváncsiságból utánaolvastam a WinJS.Class-ban pár dolognak. A Custom types and WinJS Class oldalon például a következőképp ad új tagot a Robothoz:
get: function () { this.computeModelName(); }
});
Ennek mi az előnye a következőhöz képest?
get: function () { this.computeModelName(); }
};
Vagy vegyük az oldal végén lévő örököltetést. Miben jobb az a következőnél?
this.name = _name;
}
SpaceRobot.prototype = new Robot();
SpaceRobot.prototype.constructor = SpaceRobot;
SpaceRobot.prototype.airSupply = '';
SpaceRobot.prototype.saveSelf = true;
Csak azért kérdem, mert a WinJS.Class.derive oldalán semmilyen információt nem lehet olvasni arról, milyen dolgokat művel a
derive
a kapott paraméterekkel. Aggat rájuk más metódusokat, tagokat? Ha igen, miért nincs leírva? Ha nem, miért használjuk egyáltalán?(Szerkesztve: közben utánaolvastam, hogy a
SpaceRobot.prototype = new Robot();
nem túl szerencsés, ha a konstruktornak vannak mellékhatásai.)Egy kódot néztem, mert nekem
Object.defineProperty(Robot.p
Az az előnye, hogy a
new Robot().modelName
automatikusan meghívja acomputeModelName
metódust, anélkül, hogy neked explicit meg kellene hívni. Ezen kívül a te általad javasolt, egy teljesen más objektum architektúrát eredményez, ahol amodelName
-nek van egyget
metódusa, míg aObject.defineProperty
amodelName
nem listázandó, nem módosítható stb.Így világos, köszönöm, és ez
Semmiben
Az ilyen property-k
Hogyan portolnád a kódot
Hogy kezdetben nem kell
Elsőre nem tűnik túl erős
Pedig az előző hozzászólásod
Az, hogy elfedi a komplexitást, egy ismert velejárója, ilyenkor az adott művelet komplexitása dokumentálható. Ez a bizonytalanság egyébként nyelvi szinten is ismert, a tömbhossz a klasszikus példája, ami általában tulajdonságként érhető el, de legalább egyszer minden programozó elgondolkodik rajta, hogy nem kellene-e tárolni a ciklus előtt.
A mass replace pedig még ha nem is vezet be hibát sehol, akkor is minden hívó újrafordítását eredményezi, míg ha változatlan marad az API, akkor elég az újralinkelés.
Az, hogy elfedi a
Minden függvény elfedi a
Nem, én a setter/getter
Ha nincsenek publikus adattagok, csak függvények, akkor van okod feltételezni, hogy más is történik. Ezért írtam, hogy a setter függvények nem intuitívak, ugyanis ránézésre egy külső adattag írásakor nem tudod megmondani, hogy fog-e egyéb függvény lefutni a háttérben.
Ezért írtam, hogy a setter
Ezt semmilyen függvény hívásakor nem tudod megmondani, miért pont a settereknél hiányolod?
$Objektum->tulajdonsag =
$Objektum->setTulajdonsag(5);
Amikor átnézed a kódot, az elsőnél azt várod, hogy az objektumnak csak a
tulajdonsag
adattagja fog változni, a második esetben viszont bármi történhet, azaz más állapot is megváltozhat. Ekkor nyilvánvaló, hogy asetTulajdonsag
metódusba is bele kell nézni hiba esetén.Az első sorra ránézve nem derül ki, hogy van mögötte setter, ezért írtam, hogy nem intuitív a használata.
Értem, amit mondasz, csak
Visszatekintve jobb lett volna, ha a nyelvek tervezői soha nem különböztetik meg az operátorokat az eljárásoktól, akkor nem zavarna meg az intuíciód.
Így viszont zavar
Best practice: kerülni kell a
A kényelemnek mindig ára van,