ugrás a tartalomhoz

Körkörös függésnél kivétel

inf · 2013. Ápr. 30. (K), 11.39
Szép napot!

Nem feltétlen a js témakörbe tartozik, inkább algoritmusok témakör lenne a megfelelő, de mivel js-ben van, és nincs algoritmusok témakör, ezért ide tettem.

        createYyyy: function (keys) {
            this.added = {};
            this.yyyy= [];
            _.each(keys, this.addTest, this);
            return this.yyyy;
        },
        addTest: function (key) {
            if (_.has(this.added, key))
                return;
            if (!_.has(this.use, key))
                throw new SyntaxError("Test " + key + " is not registered.");
            _.each(this.use[key].deps, this.addTest, this);
            this.added[key] = true;
            this.yyyy.push(key);
        }
Ez a kód azt csinálja, hogy megadok neki bizonyos kulcsokat, aztán ő a use-ból kiválogatja a kulcsoknak megfelelő teszteket, illetve azok függőségeit, és a végén visszatér egy listával, ami a teszteket tartalmazza függőségi sorban. (A use úgy néz ki, mint a requirejs shim.)

Két kérdésem van ezzel a kóddal kapcsolatban, az egyik, hogy minek nevezzem az yyyy példányváltozót, a másik, hogy hogyan lehetne a körkörös függést kivétellel elkaszálni?

Körkörös függést adó kód:

this.use = {a:{deps:["a"]}};
Illetve a _ az underscore.js a kódban.
 
1

...

inf · 2013. Ápr. 30. (K), 11.52

        createTestOrder: function (keys) {
            var added = {};
            var visited = {};
            var order = [];
            var addTest = function (key) {
                if (_.has(added, key))
                    return;
                if (!_.has(this.use, key))
                    throw new SyntaxError("Test " + key + " is not registered.");
                if (_.has(visited, key))
                    throw new SyntaxError("Circular dependency by test " + key + ".");
                visited[key] = true;
                _.each(this.use[key].deps, addTest, this);
                added[key] = true;
                order.push(key);
            };
            _.each(keys, addTest, this);
            return order;
        }
Már megint sikerült blogot csinálnom az oldalból :S :S :S
2

Nyugodtan, számomra hasznos

bamegakapa · 2013. Ápr. 30. (K), 12.30
Nyugodtan, számomra hasznos volt olvasni.

Kérdés: miért SyntaxError-t dobsz?
3

Más nyelvben csinálnék egy

inf · 2013. Ápr. 30. (K), 12.48
Más nyelvben csinálnék egy külön CircularDependencyException osztályt erre a célra, js-ben viszont nem használhatóak a saját kivétel típusok emiatt: http://stackoverflow.com/questions/783818/how-do-i-create-a-custom-error-in-javascript, illetve a jasmine is csak a kivétel szövegét veszi figyelembe, a típusát nem...

Error lista:
  • EvalError
    Creates an instance representing an error that occurs regarding the global function eval()
  • RangeError
    Creates an instance representing an error that occurs when a numeric variable or parameter is outside of its valid range
  • ReferenceError
    Creates an instance representing an error that occurs when de-referencing an invalid reference
  • SyntaxError
    Creates an instance representing a syntax error that occurs while parsing code in eval()
  • TypeError
    Creates an instance representing an error that occurs when a variable or parameter is not of a valid type
  • URIError
    Creates an instance representing an error that occurs when encodeURI() or decodeURI() are passed invalid parameters



Következtetés:
  • EvalError nyilván nem, mert nem eval függvényt hívok.
  • RangeError nem, mert nem számokkal dolgozok.
  • ReferenceError az lehet az egyik, amikor a use-ban nem találom a tesztet.
  • SyntaxError-nál szintén eval-al kapcsolatos, szóval az sem.
  • TypeError nem lehet, mert nem a típus rossz, hanem a felépítés.
  • URIError nem lehet, mert semmi köze az url-hez.



Úgyhogy annyit tudnék tenni az ügyben, hogy simán Error-al szórom el, viszont akkor már inkább a SyntaxError-et válaszottam, mert valamilyen struktúra parsolása során keletkezett a hiba, annak ellenére, hogy nem eval-al parsolok...
4

var a = {}; var b =

MadBence · 2013. Ápr. 30. (K), 13.04
var a = {};
var b = {foo:a};
a.bar = b;
JSON.stringify(a); //TypeError: Converting circular structure to JSON
A króm sem különösebben izgatja magát a kivételek szemantikája miatt... :-)
6

laza :D

inf · 2013. Ápr. 30. (K), 13.28
laza :D

Azt hiszem nem fogok error típusokat használni, legalábbis ha a böngészők képtelenek kezelni őket, akkor nem látom értelmét. Volt tervben olyan, hogy elfogok egy hibaüzenetet, és hozzácsapok plusz információkat, de akkor lehet, hogy leteszek erről, és nem lesznek annyira részletesek a hibaüzeneteim...
8

Nekem első blikkre a

bamegakapa · 2013. Ápr. 30. (K), 19.43
Nekem első blikkre a ReferenceError lett volna, ami talán legjobban odaerőszakolható.

Amúgy ideje lenne valamit kezdeniük ezzel a JS-ben.
9

Nem tartom annyira fontosnak,

inf · 2013. Ápr. 30. (K), 20.28
Nem tartom annyira fontosnak, és szerintem mások sem. Kicsit fapados a nyelv, de azért vannak előnyei is, pl a korlátlan számú egymásba rakható függvény... :-) Néha hagyományos oo stílusban állok neki js-t fejleszteni, de mindig rá kell jönnöm, hogy úgy nem az igazi, mert nincs információ rejtés csak closure-ban... Szerintem js-ben nem érdemes try-catch blokkokkal bíbelődni, csak ritka esetben, legalábbis kliens oldalon...
10

Információrejtés

Hidvégi Gábor · 2013. Ápr. 30. (K), 20.50
Meg aztán ki elől szeretnéd elrejteni az információt?
11

Elsősorban a fejlesztő saját

MadBence · 2013. Ápr. 30. (K), 21.14
Elsősorban a fejlesztő saját maga elől rejti el az osztály belső működését, így kényszeríti rá magát (több-kevesebb sikerrel) a moduláris(abb) fejlesztésre.
5

Ez azt vizsgálja, hogy fa-e,

tgr · 2013. Ápr. 30. (K), 13.15
Ez azt vizsgálja, hogy fa-e, nem azt, hogy van-e benne kör. Irányított gráfnál a kettő nem ugyanaz, pl:

  A
 / \
B   C
 \ /
  D
Ez egy teljesen valid függőségi gráf (A függ B-től és C-től, B és C függ D-től), aminek a bejárásakor a D-t kétszer fogod meglátogatni.

A valid függőségi gráfokat irányított aciklikus gráfnak (DAG) hívják, erre guglizva lehet egy csomó releváns algoritmust találni. A legegyszerűbb, ha csinálsz egy nem rekurzív mélységi bejárást, aminek a során nyilvántartod, mik az éppen nézett elem ősei; ha a gráfban van kör, akkor lesz olyan elem, ami az egyik ősére linkel.

var ancestors = []
function visit(node) {
    ancestors.push(node)
    _.each(node.children, function(child) {
        if (child in ancestors) {
             circle = ancestors.slice(ancestors.indexOf(child)).push(child);
             throw new Exception('Circular dependency: ' + circle.join('->'));
        }
        visit(child);
    });
    ancestors.pop()
}
7

Tévedsz, nem dob kivételt

inf · 2013. Ápr. 30. (K), 13.32
Tévedsz, nem dob kivételt erre.

use: {
  a: { deps: [ 'b', 'c' ] },
  b: { deps: [ 'd' ] },
  c: { deps: [ 'd' ] },
  d: { deps: [] }
}

in: ['a']

out: [ 'd', 'b', 'c', 'a' ]
A hozzáadott kód csak azt nézi, hogy magasabb szinten várakozik e ugyanaz a kulcs hozzáadásra. Ha igen, akkor valahol körbeért...

Gyakorlatilag ugyanazt csinálja az én kódom is, mint amit te írsz, annyi extra van benne, hogy nézi azt is, hogy szerepelt e már valami, és ha igen, akkor nem adja hozzá újra a kimenethez.

your.ancestor = my.waiting = my.visited - my.added
12

SyntaxError

F · 2013. Május. 11. (Szo), 11.15
Syntax Error : Commodore 64
(valamikor általános iskolás koromban.)