Dědičnost dnes

SB

Re:Dědičnost dnes
« Odpověď #390 kdy: 26. 01. 2017, 08:20:13 »
Nijak, stary stav se zahodi a vytvori se novy, kopie stareho s pozmenymi vlastnostmi.
U monád se nic nezahazuje.

To je nasměrování - děkuji, kouknu (i když ten aparát vypadá docela nepřehledně...).


SB

Re:Dědičnost dnes
« Odpověď #391 kdy: 26. 01. 2017, 08:23:37 »
Ja psal jak to bylo puvodne navrzeny a nekomu se taky zdalo, ze je to komplikovany a vznikla... Java

Java vznikla, aby céčkaři mohli začít používat vyšší abstrakci a "objekty" a neposrali se z toho. Nehledejte složitosti, kde nejsou.

SB

Re:Dědičnost dnes
« Odpověď #392 kdy: 26. 01. 2017, 08:26:11 »

Tak to je super a máme z toho nejpopulárnější jazyk. Tak si to představuju.


Takovej Justin Bieber je taky nejpopularnejsi...

Asi tak. Nejpoužívanější a kvalitní můžou být (a obvykle jsou) zcela nesouvisející pojmy. Já bych se rád přidržel té kvality.

SB

Re:Dědičnost dnes
« Odpověď #393 kdy: 26. 01. 2017, 08:40:19 »
Dynamické a použitelné jsou i např. Ruby nebo Python.
Právě ani jeden není. Python je na malé skriptíky a Ruby také. Oba se dají dost dobře použít na webíky, ale to je tak všechno. Přesně ta jejich dynamičnost je vyřazuje z použití. Také metatřídy v Pythonu to všechno jen dodělají :D Jako nic proti nim, jen to je přesně ten příklad jazyků, které použít na větší věci nejde. Proto se tam ani nepoužívají. Kdyby ta dynamičnost byla tak úžasná, tak to nepoužívají hlavně admini, kteří vyvíjet neumí.

Tohleto tady nezavádějte, každý jazyk je dobrý nejen na něco jiného, ale hlavně pro někoho jiného. Někdo má rád bezpečí typové kontroly překladače, někoho sere slabá abstrakce a složitá syntaxe. Jestli vám to nejde, není to jazyk pro vás.

SB

Re:Dědičnost dnes
« Odpověď #394 kdy: 26. 01. 2017, 09:10:45 »
...Také metatřídy v Pythonu to všechno jen dodělají...

Smalltalk je má taky https://en.wikipedia.org/wiki/Metaclass#In_Smalltalk-80. Umožňují jednoduchou implementaci nových vlastností jazyku a reflexivity, funkční polymorfismus na straně třídy, jednoduché ukládání do objektové DB... Přitom s nimi nemusí běžný vývojář přijít do styku.
Který jazyk to má?


SB

Re:Dědičnost dnes
« Odpověď #395 kdy: 26. 01. 2017, 09:14:29 »
Za prvé můžeš mít neschopné kolegy, kteří je nacpou všude...

Ti do metatříd nikdy nepůjdou, budou mít co dělat, aby přišli na to, jak v Pythonu programovat jako v C++.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #396 kdy: 26. 01. 2017, 10:09:44 »
Nijak, stary stav se zahodi a vytvori se novy, kopie stareho s pozmenymi vlastnostmi.
U monád se nic nezahazuje.

To je nasměrování - děkuji, kouknu (i když ten aparát vypadá docela nepřehledně...).
Ono to je poměrně přehledné, ale moc abstraktní. Doporučuju něco o monádách pro vývojáře než knihu pro matematiky (aspoň pro začátek). Nejlépe to člověk asi pochopí z příkladů.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #397 kdy: 26. 01. 2017, 10:11:16 »
...Také metatřídy v Pythonu to všechno jen dodělají...

Smalltalk je má taky https://en.wikipedia.org/wiki/Metaclass#In_Smalltalk-80. Umožňují jednoduchou implementaci nových vlastností jazyku a reflexivity, funkční polymorfismus na straně třídy, jednoduché ukládání do objektové DB... Přitom s nimi nemusí běžný vývojář přijít do styku.
Který jazyk to má?
ObjC :)

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #398 kdy: 26. 01. 2017, 10:12:04 »
Ja psal jak to bylo puvodne navrzeny a nekomu se taky zdalo, ze je to komplikovany a vznikla... Java

Java vznikla, aby céčkaři mohli začít používat vyšší abstrakci a "objekty" a neposrali se z toho. Nehledejte složitosti, kde nejsou.
Nebylo to spíše pro to, aby mohli psát fungující kód i necéčkaři? ;)

bob

Re:Dědičnost dnes
« Odpověď #399 kdy: 26. 01. 2017, 11:25:47 »
Nijak, stary stav se zahodi a vytvori se novy, kopie stareho s pozmenymi vlastnostmi.
U monád se nic nezahazuje.

To je nasměrování - děkuji, kouknu (i když ten aparát vypadá docela nepřehledně...).
Ono to je poměrně přehledné, ale moc abstraktní. Doporučuju něco o monádách pro vývojáře než knihu pro matematiky (aspoň pro začátek). Nejlépe to člověk asi pochopí z příkladů.

Pro cloveka, co nikdy nevidel funkcionalni programovani je to naprosto nepochopitelne. Dostat odpoved Monady na takovy dotaz, je stejne jako, kdyz se ctyrlete dite zepta proc je v noci tma a vy mu reknete: geometrie trirozmerneho prostoru.

Klasicky akademicky pristup nasich skol...

Nijak, stary stav se zahodi a vytvori se novy, kopie stareho s pozmenymi vlastnostmi.

Tahle odpověď mi připomíná kamaráda, když jsme hráli pingpong: "A kdo vyhraje?" "No přece ten, kdo bude mít nejvíc bodů."

To je nejspis prvni pravidlo ne? Nepsal jste, ze FP neznate? Ale, lepsi je to zacit resit pekne od konce, problemem fyziky rotace micku a jehova vlivu na dopad na stul.


Java vznikla, aby céčkaři mohli začít používat vyšší abstrakci a "objekty" a neposrali se z toho. Nehledejte složitosti, kde nejsou.
Nebylo to spíše pro to, aby mohli psát fungující kód i necéčkaři? ;)

Tak se jim to moc nepovedlo. Java je v Guinessove knize. Na Hello World do terminal musite napsat nejvic radku kodu ze vsech jazyku.

noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #400 kdy: 26. 01. 2017, 11:30:36 »
Tak se jim to moc nepovedlo. Java je v Guinessove knize. Na Hello World do terminal musite napsat nejvic radku kodu ze vsech jazyku.

To je lez, se podivejte na Java vs. C verzi treba:

Kód: [Vybrat]
public class Java {
public static void main(String[] args) {
System.out.println("Hello World");
}
}

Kód: [Vybrat]
#include<stdio.h>

int main() {
printf("Hello World\n");
return 0;
}

SB

Re:Dědičnost dnes
« Odpověď #401 kdy: 26. 01. 2017, 12:13:27 »
Zprávy mají s funkcemi společnou jedinou věc, a to, že synchronně vracejí odpověď. Tím jejich podobnost končí.

To je minimálně zavádějící tvrzení.

1. funkce jsou statické, zprávy jsou akce
...

Tady jsme si spíš nerozuměli, předpokládal jsem, že se porovnává funkce z imperativních jazyků (tj. v podstatě procedura) s objektovým posíláním. Funkcionální funkci (tj. v podstatě matematickou funkci) jsem na mysli neměl.

2. zprávy nemusí být synchronní

...a dokonce je lepší, když defaultně nejsou, protože sesynchronizovat asynchronní události je v dobře navrženém jazyce triviální (kód v jazyce Elixir):
Kód: [Vybrat]
...

To vypadá dobře. I když implementovat asynchronní v synchronním jde tady.

3. odeslání zprávy nemusí nic "vracet" nebo může "vracet" víc hodnot postupně
...

To už je věcí implementace na druhé straně, to bych tu nerozebíral. Ale vypadá to zajímavě.

Immutable je immutable, takže pokud si pod "změnou stavu" představuješ změnu in situ, tak nijak. Jinak to ale může vypadat třeba takhle (jeden příklad z jiného světa, když odpověď "monády" ti nestačila):

Kód: [Vybrat]
# zjednodušený ilustrační příklad, v reálu by to vypadalo trochu jinak
defmodule StateHolder do
  # tahle funkce spustí agenta držícího stav
  def start_link() do
    # spustí funkci loop s parametry [0] v novém vlákně
    spawn_link(fn -> loop(0) end)
  end

  def loop(state) do
    receive do
      {:add,k} ->
        new_state = state + k
        IO.puts "stav se meni z #{state} na #{new_state}"
        loop(new_state)
      {:get_state,pid} ->
        send(pid,{:state_is,state})
        loop(state)
    end
  end

end

Monády mi stačila, jen jsem je nestihl prostudovat.
Pěkně jste napsal ten příklad (včetně použití). Jestli to chápu správně, tak z něj jde znát, že stav je pochopitelně v modulu přítomen, ale ve formě hodnoty state vznikající v novém kontextu při volání funkce loop (new_state). Zde odhaduju, že volání loop není jako call (rekurzivní), ale spíše něco jako goto, any bylo možno zahazovat opuštěný kontext předchozího volání funkce (jinak by se zaplnila paměť). Každopádně důsledkem je, že vnitřně je modul sice immutable, ale navenek (a to mě v interakci s ostatními zajímá) pochopitelně mutable. Tzn. tvrzení, že v FP je vše immutable, asi nebude pravdivé. Dále předpokládám, že jsou hodnoty při volání funkce či posílání zprávy předávány odkazem, jinak by celé toto čarování nemělo smysl.

bob

Re:Dědičnost dnes
« Odpověď #402 kdy: 26. 01. 2017, 12:30:47 »

Pěkně jste napsal ten příklad (včetně použití). Jestli to chápu správně, tak z něj jde znát, že stav je pochopitelně v modulu přítomen, ale ve formě hodnoty state vznikající v novém kontextu při volání funkce loop (new_state). Zde odhaduju, že volání loop není jako call (rekurzivní), ale spíše něco jako goto, any bylo možno zahazovat opuštěný kontext předchozího volání funkce (jinak by se zaplnila paměť). Každopádně důsledkem je, že vnitřně je modul sice immutable, ale navenek (a to mě v interakci s ostatními zajímá) pochopitelně mutable. Tzn. tvrzení, že v FP je vše immutable, asi nebude pravdivé. Dále předpokládám, že jsou hodnoty při volání funkce či posílání zprávy předávány odkazem, jinak by celé toto čarování nemělo smysl.

Ano v immutable je to jen z pohledu programatora. Pocitac samozrejme pamet fyzicky meni.
Toto je implementovano jako tail-call optimisation. Kdyz je volani sebe sama jako posledni a neni tam zadna hodnota, ktera se rekurzivne vraci (return 1+ callme(n) vs return callme(n+1)), tak neni nutne alokovat na stacku novou pamet. Lze pouzit stejny stack s jakym byl zavolan pro nove volani.

SB

Re:Dědičnost dnes
« Odpověď #403 kdy: 26. 01. 2017, 12:38:18 »
Anemický model/objekt je taky objekt. Chyba programátora, že definuje debilní chování. Ale s OOP to nesouvisí ani ho neporušuje.

I ten nejjednodušší objekt mívá nějaké chování, jestliže jej nemá, je třeba se zamyslet, zda není něco špatně. Téměř vždy je anemický model objekt zdegenerovaný do céčkového recordu jen proto, aby s ním šlo dělat zvenku.

Primitivní typy v OOP neexistují. To je optimalizace Javy a spol. V OOP nemůžeš z objektu vybalit nějakou hodnotu primitivního typu. Můžeš jen objektu poslat zprávu a ona ti vrátí opět nějakou instanci nějakého objektu.

To jsem přece napsal proto, aby si někteří uvědomili, že jazyk, který pracuje s primitivy (hodnotami, ne lidmi) není pure object language, jestli je vůbec OOP. Vy mi chcete vysvětlovat, co je to čisté OP? To nemyslíte vážně!

Podle mne není to vybalení nějaký problém. Prostě mám objekt, ten má stav, a ten stav si můžu vyserializovat - tedy to jsem si pojmenoval po svém to vybalení. No, a ten stav je samozřejmě taky složen z objektů (alespoň teoreticky).

Serializace je výstup objektu jako každý jiný, pak je "vybalení" i výstup osoba.prijmeni() -> "Jebáček".

SB

Re:Dědičnost dnes
« Odpověď #404 kdy: 26. 01. 2017, 13:11:06 »
...Ještě jednou, private v Javě i podtržitko v Pythonu mají úplně stejný význam, který říká:

"Tento field by se neměl měnit zvenku, není na to určený. Vím, že jde zvenku změnit, ale prosím nedělejte to. Něco by to mohlo ošklivě rozbít. Jestli ho opravdu budete měnit, dobře si to předtím rozmyslete, nenesu žádnou odpovědnost za nic. Děkuji za pochopení. S úctou Váš vývojář."
...

Není to to samé - v Javě je technologická viditelnost - do private se mimo třídu (ne objekt!) díky překladači nijak nedá. V Pythonu je psychologická - "__" znamená: "Ahoj! Já jsem metoda private, ale ve skutečnosti až tak moc private nejsem, vlastně nejsem ani protected (tatík byl líný a nedomyslel to), ale to nevadí, budeme dělat, jakože ano, a doufat, že si toho nikdo nevšimne. Děkuji, že děláte dobrou věc a dodržujete naši dohodu o neviditelnosti. Ještě jednou děkuji. Ahoj!"

Já v tom teda rozdíl vidím.