Postřehy ohledně architektury JavaScriptu

balki

Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #390 kdy: 31. 08. 2016, 13:43:51 »
To se mi nestává. U mě UI okno přebírá data od uživatele, validuje je, a snaží se z nich vytvořit objekt pro doménovou vrstvu. To UI okno se může do nevalidního stavu dostat leda tak, že bych se ho pokusil vytvořit bez odkazu na rodiče (což mu nedovolím konstruktorem). Ale kůli tomu, že user jako věk napíše "hodně" rozhodně nezpanikaří. Naopak. Přepne se do zcela validního stavu: "zadal jste chybnou hodnotu...".

Aha, takze existuje predsa okno v nevalidom stave. A potom zrazu sa prepne do validneho. Ale to je zle !!!11!!!! To se stat nesmi! To je pro lyny programatori. Gui cargo kult.
Kdes' to vyčet'?

No jednoduche, je tam prehlaseny nevalidny stav za validny.  Sposobom "ved tam user nieco setne  a potom sa to zvaliduje". Za nieco podobne ste sa mi vysmievali.

Nevím jestli tomu zcela rozumím... některý vstup se dá validovat až po tom, co to tam uživatel "setne" a potvrdí to. Pole s emailem umožňuje zapsat jakýkoliv text, nevím kdy tam uživatel zapíše zavináč a doménu. Jestli je vstup validní zjistím až po změně stavu -- odeslání, výstup z pole na jiný prvek... Ve view jsou potencionálně nevalidní data, ale view je v naprosto validním stavu.

Oby som obcerstvil mne bolo vycitane, ze injektujem zavislosti cez settre a potom zavolam init metodu. Taky objekt sa nachadza potom vo validnom stave "nenainicializovany". Az potom, ako je korektne "inicializovany", poskytne sa systemu na pracu.  Teraz som to povedal po boneflutovsky. So ziadnymi nevalidnymi objektami sa v systeme nepracuje, ale aj tak mu to dalo mandat ma zosmiesnovat.

Nepleteš si tak trochu věc, kdy je objekt v nevalidním stavu se situací, kdy objekt validuje nějakou hodnotu a výsledek si uchovává v sobě? To druhé není jen prohlášení nevalidního stavu za validní. To je zkrátka a dobře dost něco jiného.

Ok, strata casu, hrajte sa tu na validity nevalidneho. A nevaliditu validneho. Proste si vymyslate teorie a tie si obhajujete. Prosim, uz sa neodvolavajte na mna, aby som sa tu nemusel ozyvat.


v

Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #391 kdy: 31. 08. 2016, 13:57:45 »
Ok, strata casu, hrajte sa tu na validity nevalidneho. A nevaliditu validneho. Proste si vymyslate teorie a tie si obhajujete. Prosim, uz sa neodvolavajte na mna, aby som sa tu nemusel ozyvat.
IMHO čistě jazykový problém, pro mě je příklad nevalidního objektu třeba "dangling pointer" (nepoznám, že použití způsobí problém), příklad validního, ale "neinicializovaného" či nepoužitelného pak NULL pointer (umím zjistit, že to nejde použít pro žádanou činnost)

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #392 kdy: 01. 09. 2016, 13:19:22 »
Java není tak blbá, ale absence properties má nutit k více objektovému myšlení, kdy objekty mezi sebou komunikují jen a výhradně pomocí zpráv.

Getter/setter jako degenerovaná zpráva (protože je ve své podstatě servisní, souvisí s objeketem, nikoliv s tím, co objekt modeluje) je pak pronikání procedurálního přístupu do OOP.
Hodně častý je prostě jednoduchý objekt Person {name: String, surname: String}. Na tom toho moc nevymyslíš.
K čemu takový objekt potřebujete? To není OOP přístup, ale procedurální. Pochopil bych objekt Point(x,y) s metodami move, rotate, colorize, increase, decrease, hide. Ale jakou činnost chcete provádět se jménem? V realitě jedině print.
Hmm, to zní zajímavě.

Předpokládejme hru, ve které figuruje panáček a pomeranč a pomerančovník. Úkolem hráče je pravidelně krmit panáčka pomerančem. Přičemž pomeranč může panáček sníst, nebo jej uložit do batohu na pozdějc.

Jak by se to řešilo čistě OOP?

Já bych to čistě naivně řešil tak, že by se panáčkově metodě "jez", předal objekt "pomeranč". Ale nedaří se mi se naladit na tvůj způsob. Páč si nedovedu představit u pomeranče metodu být jezen. Vždycky se mi to roypane na něco jako: "extrahuj cukr".

Poznámka: toto není ironie :)
Kód: [Vybrat]

class Panacek
{
     function snez(pomeranc)
     {
           do {
              sousto = pomeranc.ukousni(rand(12))
           } while(sousto > 0)
     }
}

class Pomeranc
{
      private hmotnost = 1;

      function ukousni(apetit)
      {
            sousto = 0.9*(hmotnost/apetit);

            if (hmotnost > 0)
            {
                 hmotnost = hmotnost - sousto;
                 return sousto;
             }
            else
                 return 0;
      }
}
OK, hezký. Pokud to chápu dobře, tak sousto je (třeba) int, a to není, nemůže být objekt? Nelze mu měnit stav? (Teď myslím ideově, dle OOP, nikoliv fakticky. To abych tě dobře pochopil.)

A ještě druhá otázka: Pomeranč má metody pro ukousni, což je jen něco lépe vymyšleného pro to moje extrahuj-cukr (je mi úplně jasný, že sis představoval, že bych to dělal tak, že getterem vezmu hodnotu, odečtu, a pak ji setterem vrátím). Pak by se ale dalo očekávat, že panáček nebude jíst zelené (nezralé) pomeranče. Že si bude trhat jen pomeranče, které mají nějakou minimální váhu. Tedy chování panáčka ovlivňuje stav objektu. Jak by si na to šel?

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #393 kdy: 01. 09. 2016, 13:31:01 »
Ok, strata casu, hrajte sa tu na validity nevalidneho. A nevaliditu validneho. Proste si vymyslate teorie a tie si obhajujete. Prosim, uz sa neodvolavajte na mna, aby som sa tu nemusel ozyvat.
IMHO čistě jazykový problém, pro mě je příklad nevalidního objektu třeba "dangling pointer" (nepoznám, že použití způsobí problém), příklad validního, ale "neinicializovaného" či nepoužitelného pak NULL pointer (umím zjistit, že to nejde použít pro žádanou činnost)

Jak jsem se pokoušel popsat
Kód: [Vybrat]
Person obj = factory.get() // někde seber nějaký objekt, ať nemáme konstruktor
obj.toString() // -> "Jmeno: NULL, Příjmení: NULL"
dá se celkem dobře prohlásit, že objekt Person, který nemá vyplněno ani jméno a příjmení, nemá co existovat: "Znám člověka, sice nevím jak se jmenuje, nevím jaké má rodné číslo, ani jak vypadá, vlastně o něm nevím vůbec nic. Ale zcela jistě existuje."

Zatímco třeba:
Kód: [Vybrat]
Person obj = factory.get() // někde seber nějaký objekt, ať nemáme konstruktor
obj.toString() // -> "Jmeno: Petr, Příjmení: Novák, Adresa: neuvedena"
se použít dá, páč adresu prostě můžeme neznat.

A tohle třeba už ne:
Kód: [Vybrat]
Person obj = factory.get() // někde seber nějaký objekt, ať nemáme konstruktor
obj.toString() // -> "Jmeno: Petr, Příjmení: Novák, Adresa: ulice: NULL, město: NULL, stát: NULL"

Ivan Nový

Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #394 kdy: 01. 09. 2016, 14:47:21 »
OK, hezký. Pokud to chápu dobře, tak sousto je (třeba) int, a to není, nemůže být objekt? Nelze mu měnit stav? (Teď myslím ideově, dle OOP, nikoliv fakticky. To abych tě dobře pochopil.)

A ještě druhá otázka: Pomeranč má metody pro ukousni, což je jen něco lépe vymyšleného pro to moje extrahuj-cukr (je mi úplně jasný, že sis představoval, že bych to dělal tak, že getterem vezmu hodnotu, odečtu, a pak ji setterem vrátím). Pak by se ale dalo očekávat, že panáček nebude jíst zelené (nezralé) pomeranče. Že si bude trhat jen pomeranče, které mají nějakou minimální váhu. Tedy chování panáčka ovlivňuje stav objektu. Jak by si na to šel?
Třeba takto:
Kód: [Vybrat]
class Osatka
{
  private pomerance = [...]

  function najdiZralyPomeranc()
  {
    for (pomeranc in pomerance)
      if (pomeranc.jeZraly())
        return pomeranc;
  }
}

class Panacek
{
  function snezPomeranc(osatka)
  {
    pomeranc = vezmiPomeranc(osatka);

    do {
      sousto = pomeranc.ukousni(rand(12))
    } while(sousto.jeStavnate())
  }

  function vezmiPomeranc(osatka)
  {
    return osatka.najdiZralyPomeranc()
  }
}

class Sousto
{
  private hmotnost = 0;

  construct(hmotnost)
  {
    this.hmotnost = hmotnost;
  }

  function jeStavnate()
  {
    return true;
  }
}

class SkusNaprazdno extends Sousto
{
  construct() {}

  function jeStavnate()
  {
    return false;
  }
}

class Pomeranc
{
  private hmotnost = 1;
  private barva = 'zelena';

  construct(barva)
  {
    this.barva = barva;
  }

  function ukousni(apetit)
  {
    sousto = min(hmotnost, 0.9*(hmotnost/(12-min(11, apetit))));

    if (hmotnost > 0)
    {
      hmotnost = hmotnost - sousto;
      return new Sousto(sousto);
    }
    else
      return new SkusNaprazdno();
  }

  function jeZraly()
  {
    if (barva == 'cervena')
      return true;
    else
      return false; 
  }
}


BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #395 kdy: 01. 09. 2016, 14:57:27 »
OK, hezký. Pokud to chápu dobře, tak sousto je (třeba) int, a to není, nemůže být objekt? Nelze mu měnit stav? (Teď myslím ideově, dle OOP, nikoliv fakticky. To abych tě dobře pochopil.)

A ještě druhá otázka: Pomeranč má metody pro ukousni, což je jen něco lépe vymyšleného pro to moje extrahuj-cukr (je mi úplně jasný, že sis představoval, že bych to dělal tak, že getterem vezmu hodnotu, odečtu, a pak ji setterem vrátím). Pak by se ale dalo očekávat, že panáček nebude jíst zelené (nezralé) pomeranče. Že si bude trhat jen pomeranče, které mají nějakou minimální váhu. Tedy chování panáčka ovlivňuje stav objektu. Jak by si na to šel?
Třeba takto:
Kód: [Vybrat]
class Osatka
{
  private pomerance = [...]

  function najdiZralyPomeranc()
  {
    for (pomeranc in pomerance)
      if (pomeranc.jeZraly())
        return pomeranc;
  }
}

class Panacek
{
  function snezPomeranc(osatka)
  {
    pomeranc = vezmiPomeranc(osatka);

    do {
      sousto = pomeranc.ukousni(rand(12))
    } while(sousto.jeStavnate())
  }

  function vezmiPomeranc(osatka)
  {
    return osatka.najdiZralyPomeranc()
  }
}

class Sousto
{
  private hmotnost = 0;

  construct(hmotnost)
  {
    this.hmotnost = hmotnost;
  }

  function jeStavnate()
  {
    return true;
  }
}

class SkusNaprazdno extends Sousto
{
  construct() {}

  function jeStavnate()
  {
    return false;
  }
}

class Pomeranc
{
  private hmotnost = 1;
  private barva = 'zelena';

  construct(barva)
  {
    this.barva = barva;
  }

  function ukousni(apetit)
  {
    sousto = min(hmotnost, 0.9*(hmotnost/(12-min(11, apetit))));

    if (hmotnost > 0)
    {
      hmotnost = hmotnost - sousto;
      return new Sousto(sousto);
    }
    else
      return new SkusNaprazdno();
  }

  function jeZraly()
  {
    if (barva == 'cervena')
      return true;
    else
      return false; 
  }
}
Pro samou sradnu s ošatkou jsi vynechal tu část s minimální váhou.

Šťavnatost je vlastností Pomeranče. Ale chutnost třeba už ne.

YF

Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #396 kdy: 01. 09. 2016, 16:47:18 »
Java není tak blbá, ale absence properties má nutit k více objektovému myšlení, kdy objekty mezi sebou komunikují jen a výhradně pomocí zpráv.

Getter/setter jako degenerovaná zpráva (protože je ve své podstatě servisní, souvisí s objeketem, nikoliv s tím, co objekt modeluje) je pak pronikání procedurálního přístupu do OOP.
Hodně častý je prostě jednoduchý objekt Person {name: String, surname: String}. Na tom toho moc nevymyslíš.
K čemu takový objekt potřebujete? To není OOP přístup, ale procedurální. Pochopil bych objekt Point(x,y) s metodami move, rotate, colorize, increase, decrease, hide. Ale jakou činnost chcete provádět se jménem? V realitě jedině print.
Hmm, to zní zajímavě.

Předpokládejme hru, ve které figuruje panáček a pomeranč a pomerančovník. Úkolem hráče je pravidelně krmit panáčka pomerančem. Přičemž pomeranč může panáček sníst, nebo jej uložit do batohu na pozdějc.

Jak by se to řešilo čistě OOP?

Já bych to čistě naivně řešil tak, že by se panáčkově metodě "jez", předal objekt "pomeranč". Ale nedaří se mi se naladit na tvůj způsob. Páč si nedovedu představit u pomeranče metodu být jezen. Vždycky se mi to roypane na něco jako: "extrahuj cukr".

Poznámka: toto není ironie :)
Kód: [Vybrat]

class Panacek
{
     function snez(pomeranc)
     {
           do {
              sousto = pomeranc.ukousni(rand(12))
           } while(sousto > 0)
     }
}

class Pomeranc
{
      private hmotnost = 1;

      function ukousni(apetit)
      {
            sousto = 0.9*(hmotnost/apetit);

            if (hmotnost > 0)
            {
                 hmotnost = hmotnost - sousto;
                 return sousto;
             }
            else
                 return 0;
      }
}
OK, hezký. Pokud to chápu dobře, tak sousto je (třeba) int, a to není, nemůže být objekt? Nelze mu měnit stav? (Teď myslím ideově, dle OOP, nikoliv fakticky. To abych tě dobře pochopil.)

A ještě druhá otázka: Pomeranč má metody pro ukousni, což je jen něco lépe vymyšleného pro to moje extrahuj-cukr (je mi úplně jasný, že sis představoval, že bych to dělal tak, že getterem vezmu hodnotu, odečtu, a pak ji setterem vrátím). Pak by se ale dalo očekávat, že panáček nebude jíst zelené (nezralé) pomeranče. Že si bude trhat jen pomeranče, které mají nějakou minimální váhu. Tedy chování panáčka ovlivňuje stav objektu. Jak by si na to šel?

pomeranc ma metodu ukousni? vy ste zabijaci :)

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #397 kdy: 01. 09. 2016, 16:52:34 »
pomeranc ma metodu ukousni? vy ste zabijaci :)
Otázka blbého názvosloví. To neprožívám. Si to překládám jako že ten pomeranč má schopnost se rozpadnou na ty měsíčky.

čumil

Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #398 kdy: 01. 09. 2016, 23:20:01 »
pomeranc ma metodu ukousni? vy ste zabijaci :)
Otázka blbého názvosloví. To neprožívám. Si to překládám jako že ten pomeranč má schopnost se rozpadnou na ty měsíčky.
Pokud objekt nemá žádnou logicky vymyslitelnou akci, prostě místo něj pošlu mapu (či objekt s pouze datovými sloty). Metoda ukousni na pomeranči je padlá na hlavu. Pomeranč sám o sobě není schopen interakce, takže by neměl mít ani schopnost někam posílat/přímat zprávy.

YF

Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #399 kdy: 03. 10. 2016, 23:21:53 »

loki

Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #400 kdy: 05. 10. 2016, 04:32:47 »
Dobře víš, o co se jedná, ale chceš rozpoutat další flame na téma C++ (Java, C#, Python...) nejsou objektové jazyky, správně je to jedině ve Smalltalku a vy všichni, co nepoužíváte Smalltalk, jste jen pojídači koláčů. Promiň, ale toho se nehodlám účastnit.

Já vím, o co se jedná, ale nevím, co myslíte vy všichni. Takže jednodušeji: Čím se liší gettery/settery od metod (vynechte pojednání o způsobu zápisu, jde mi o funkcionalitu, neboli co to má dělat).
Liší se tím, že zveřejňují vnitřní stav objektu, což je špatně. Ovšem je to ale příjemnév a zjednodušuje to práci, asi jako příkaz GOTO :-)))

Ani goto neni zlo, zle je len jeho nadpouzivanie. Goto maju najviac v zuboch ludia, ktori ho nikdy neboli nuteni pouzivat a nemaju predstavu ako dokaze skutocne doprasit kod. kedysi ked som programoval na 8bity a basic nepoznal procedury ani funkcie, len goto a gosub / return, vsetko bolo globalne, kazdy riadok zacinal cislom (navestie) a príkazom goto sa dalo skocit doslova hocikam, tak z toho vznikali strasny bordel. Ale v dnesnych jazykoch je goto implementovane celkom rozumne da sa pouzivat iba v ramci jednej metody (neda sa vyskocit von z metody alebo skocit do inej metody). Niekedy dokaze tento prikaz dost zrychlit vykonavamy kod. inak aj cyklus a procesura je len vylepsene goto.

Objekt je syntakticky ocukrovana struktura, anemicke objekty aka struktury sa tiez casto hodia, aj ked objektami sa zvyknu nazyvat referencne typy a strukturami value typy, struktury tiez patria k programovaniu ziadna presna hranica medzi objektom a strukturou nie je.

Getter a seter vôbec nemusi sluzit na zmenu jedneho konkrétneho atributu, setter je jednoducho metoda ktora sa tvari ako premenna nemusia sa pisat uvozdovky pise sa rovnitko, a da sa aj overridnut. Je to podobny cukor ako pretazovanie operatorov, alebo indexery, malo by sa to pouzivat tam kde sa to hodi.

SB

Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #401 kdy: 05. 10. 2016, 15:03:58 »
Dlouhodobě mě děsí představa, že se v IT pohybují lidé jako vy.

YF

Re:Postřehy ohledně architektury JavaScriptu
« Odpověď #402 kdy: 05. 10. 2016, 17:02:24 »
Dlouhodobě mě děsí představa, že se v IT pohybují lidé jako vy.

Loki's positive relations with the gods end with his role in engineering the death of the god Baldr and Loki is eventually bound by the gods with the entrails of one of his sons.