Co si myslíte o OOP?

lopata

Re:Co si myslíte o OOP?
« Odpověď #285 kdy: 31. 12. 2018, 15:11:25 »
A btw. taky se domnivam, ze nejde udelat (plnotucny) REPL v kazdem jazyce... Treba ta java ho pokud vim nema. Co treba C?

REPL jde udělat s trochou snahy v každém jazyce: https://github.com/root-project/cling

S hot swapem to není tak jednoduché, vem si třeba inlinované funkce,  jak bys je chtěl hot swapovat? Jediné rozumné řešení je všechno překompilovat, což už se dá dost těžko považovat za hot swap.


anonym

Re:Co si myslíte o OOP?
« Odpověď #286 kdy: 31. 12. 2018, 15:11:29 »
A ja si prave myslim, ze plyne. A koukal jsem na par prikladu jak se to dela v tom erlangu a prijde mi to velmi podobne. Neni eshell vlastne takovy REPL?
Ne "vlastne takovy", eshell je REPL.

Akorat porad nezorumim tomu, proc tyhle dve vlastnosti spojujes, jsou uplne ortogonalni. REPL muzes udelat v jakemkoliv jazyce, k hot code (re)loadingu potrebujes nekolik predpokladu, ktere ne kazdy jazyk splnuje.

V JVM, co jsem se dočetl, hot reloading jde, ale nemůžeš měnit signatury ani odstraňovat nebo přidávat metody. Takže vlastně můžeš jenom měnit implementaci existujících věcí.

Synku, Java to neni jen tak nejaka technologie s fajnovym marketingem, muzes metody pridavat, i tridy, potrebujes jen JVM opatchovat s DCEVM.

S Hot swapem se vsak (jak jinak) nedaji menit jakekoliv inicializace cehosi. Proto me stve, kdyz nekdo udela nejaky framework co ma byt jakoze jednoduchy, ale pitome a zbytecne tam dela nejaky inicializace, cimz znemozni hot swap. (treba hotswap kdyz menis rest api)

Nicmene v praxi se v Jave stejne da pouzit JRebel, ktery vylepsuje nejen hotswap, ale taky zna implementacni detaily ruznych frameworku a tak dokaze udelat i reinicializaci. Jenze stoji 10000,- rocne, coz sockam, ktere by nejradeji nezaplatily ani za IntelliJ Ideu a pouzili misto toho Eclipse, pripada jako hodne.

Nicmene v praxi v korporatech neni vetsinou potreba neco hotswapovat, kdyz se dodrzuje TDD. Takze to pak tolik nechybi

Kit

Re:Co si myslíte o OOP?
« Odpověď #287 kdy: 31. 12. 2018, 15:30:47 »
Jake jsou ty predpoklady ktere myslis, ze jsou k hot swapu potreba?
No napriklad musis mit moznost nejak zabezpecit, ze kod nepoleze do kodu, ktery prave reloadujes. Nebo musis mit moznost mit zaraz v pameti dve verze tehoz. Pak musis mit vubec moznost kod za behu menit. Nesmi existovat zpusob, jak se na kod odkazovat (pointerem nebo necim podobnym), nebo musis mit moznost ty odkazy automaticky updatovat. Atd. atd. těch věcí je moře.

To není tak složité. Vytvoříš nový derivační strom a přehodíš na něj pointer z předchozího stromu. Proces, který běží v předchozím stromu, v něm normálně doběhne a další procesy už běží v novém stromu. Starý strom je zrušen teprve tehdy, až na něj žádný pointer neukazuje.

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #288 kdy: 31. 12. 2018, 15:51:50 »
2. Někdy se hodí, zejména na prototypování, když jsou typy volitelné, a následně to při refactoringu upřesňovat. Protože ze začátku člověk třeba nemá jasno, jak to má vypadat, a tak samozřejmě dost dobře nemůže ty typy určit.

Tohle mi prijde zvlastni. refactoring chapu jako "cisteni" kodu v pripade, ze uz funguje spravne tzn. beze zmeny funkcionality... Abych mohl delat refactoring "bezpecne" potrebuju mit uz v ruce nejaky kontrolni mechanizmus (testy nebo typovou kontrolu), abych mohl po vycisteni prokazat, zachovani funcionality.

Takze, kdyz budu delat nejaky proof of concept tak muzu bez testu a bez typu, ale rozhodne to pak nebudu refactorovat do nejake produkcni verze, protoze bych se osypal.
Je možné, že výraz refactoring jsem nepoužil podle příručky.

Představ si funkci, která má argumenty a plní formulář:
Kód: [Vybrat]
function assetContactForm(form, name, age, email, content)
{
    form['name'].value = name
    form['age'].value = age
    form['email'].value = email
    form['content'].value = content
    return form
}
Ze začátku to plníš takhle. Pak si ale řekneš, že by si chtěl omezit vstupy  na číslo, text, etc. A nebo zjistíš, že vlastně ta funkce je celá blbě.
Využiješ situace, že na začátku pracuješ s ideálními podmínkami. Ale na závěr už chceš spolehlivý kód.

Re:Co si myslíte o OOP?
« Odpověď #289 kdy: 31. 12. 2018, 15:53:09 »
Jake jsou ty predpoklady ktere myslis, ze jsou k hot swapu potreba?
No napriklad musis mit moznost nejak zabezpecit, ze kod nepoleze do kodu, ktery prave reloadujes. Nebo musis mit moznost mit zaraz v pameti dve verze tehoz. Pak musis mit vubec moznost kod za behu menit. Nesmi existovat zpusob, jak se na kod odkazovat (pointerem nebo necim podobnym), nebo musis mit moznost ty odkazy automaticky updatovat. Atd. atd. těch věcí je moře.
No a ja tvrdim, ze pokud mas plnotucny REPL tak musis mit vsechny tyhle veci taky, protoze jinak bys nemohl mit ani ten.  A z toho vyvozuju, ze pokud mas REPL mas i hot swap.

A btw. taky se domnivam, ze nejde udelat (plnotucny) REPL v kazdem jazyce... Treba ta java ho pokud vim nema. Co treba C?
REPL není nic jiného než iteraktivní vyhodnocovač výrazů. Pokud pro nějaký jazyk není, tak spíš proto, že to u něj nedává moc smysl, např. proto, že výrazy jsou v tom jazyce podružná věc. Mám pocit, že máš nějaké mylné představy o magické podstatě REPLu :)

Pro Javu existuje: https://www.infoq.com/articles/jshell-java-repl

No a podle me to R v REPL znamena read a jeho reader by mel umet precist jakykoliv kod ktery jde zkompilovat/interpretovat i mimo repl. Pokud tomu tak neni tak to neni plnohodnotny REPL.
Napriklad jshell neumi package http://openjdk.java.net/jeps/222:
"A snippet may not declare a package or a module. All JShell code is placed in a single package in an unnamed module. The name of the package is controlled by JShell."



Re:Co si myslíte o OOP?
« Odpověď #290 kdy: 31. 12. 2018, 15:53:33 »
Synku, Java to neni jen tak nejaka technologie s fajnovym marketingem, muzes metody pridavat, i tridy, potrebujes jen JVM opatchovat s DCEVM.
Takže, tatínku, pro normální JVM od Sunu platí to, co jsem napsal :)

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #291 kdy: 31. 12. 2018, 15:54:08 »
Např. pokud víš, že ve výrazu x / y je y s jistotou "integer", je ti to víceméně na nic, protože situace, kdy je y nula má stejné důsledky jako kdyby to byl string. Dělení nulou je stejně nedefinované jako dělení stringem. Takže kdykoli se ti v programu objeví dělení (nebo jakákoli jiná parciální funkce), stane se ti ze statického jazyka efektivně dynamický - protože prostě v době překladu nejsi schopný ověřit korektnost.
S tím nemám problém. Já neobhajuji statické typování. Já hejtuju dynamické.

Re:Co si myslíte o OOP?
« Odpověď #292 kdy: 31. 12. 2018, 15:56:51 »
No a ja tvrdim, ze pokud mas plnotucny REPL tak musis mit vsechny tyhle veci taky, protoze jinak bys nemohl mit ani ten.  A z toho vyvozuju, ze pokud mas REPL mas i hot swap.
No tak to z chybného předpokladu vyvozuješ chybný závěr, no, co na to říct jiného? REPL máš třeba v pythonu a code reloading tam dělat nejde (AFAIK). Existující kód prostě běží dál, změny se projeví jenom v nově nataženém.

Pokud tomu tak neni tak to neni plnohodnotny REPL.
Beru na vědomí tvou definici "plnohodnotného REPLu".

Ani ten ti ale na hot code reload nestačí.

Re:Co si myslíte o OOP?
« Odpověď #293 kdy: 31. 12. 2018, 15:57:38 »
A btw. taky se domnivam, ze nejde udelat (plnotucny) REPL v kazdem jazyce... Treba ta java ho pokud vim nema. Co treba C?

REPL jde udělat s trochou snahy v každém jazyce: https://github.com/root-project/cling

S hot swapem to není tak jednoduché, vem si třeba inlinované funkce,  jak bys je chtěl hot swapovat? Jediné rozumné řešení je všechno překompilovat, což už se dá dost těžko považovat za hot swap.

Viz. odpoved Mirkovi. cling neznam, ale myslim, ze to nebude plnohodnotny REPL.

Re:Co si myslíte o OOP?
« Odpověď #294 kdy: 31. 12. 2018, 15:57:47 »
S tím nemám problém. Já neobhajuji statické typování. Já hejtuju dynamické.
Však jo. Já jenom, že ty tvoje hejty platí i pro statické, jenom v menší míře.

lopata

Re:Co si myslíte o OOP?
« Odpověď #295 kdy: 31. 12. 2018, 16:06:26 »
Viz. odpoved Mirkovi. cling neznam, ale myslim, ze to nebude plnohodnotny REPL.

Cling je plnohodnotný REPL. On totiž REPL nemusí vůbec inlinovat funkce, k ničemu to v REPLu není prakticky dobré.

Ale v produkčním kódu inlinované funkce jsou a to je jeden z důvodů, proč nejde udělat hot swap, i když existuje plnohodnotný REPL.

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #296 kdy: 31. 12. 2018, 16:07:07 »
1. Erlang dokáže za chodu opravovat/upravovat kód. A autoři prohlásili, že tam typy nedali, protože se jim nepovedlo vymyslet jak na to.
Měl bys k tomuhle nějakej odkaz? Přijde mi divný, že by to zaznělo přesně takhle (že by tím důvodem byl právě hot code loading).
Bohužel. Někde jsem to četl. A klidně to může být kec, nestojí mi na tom můj světonázor :-)

1. Několikrát opakuješ obrat "nemá typy". To je minimálně zavádějící. Dynamické jazyky mají typy. Od staticky typovaných se liší jenom tím, jestli informaci o typu znáš (pozitivně, s jistotou) při překladu, nebo až v době běhu. V principu provádíš tu stejnou kontrolu, jenom jindy. Výhoda statických jazyků je v tom, že kontrolu provedeš (ve většině případů - viz 2) jenom jednou, zatímco u dynamického ji musíš provádět pořád dokola, za běhu.
Snažil jsem se bavit o statickém typování, nikoliv o staticky typovaných jazycích. A pro mě podstatný rozdíl je právě a hlavně v tom, že jsem schopen ten kód zkontrolovat při překladu. Jak píšeš. To, že při dynamickém typování ty výrazy si nesou typy, to jsem (doufám) nikde nerozporoval. Každopádně to nepovažuji za výhodu, ale za znouzecnost. Ale někteří tvrdí, že by to měla být výhoda.

2. Z bodu 1 přímo vyplývá, že statický jazyk má problém v situacích, kdy typ v době překladu z principu nemůžeš znát - to je ten příklad s načítáním JSONu, ale můžeš jich vymyslet bambilion jiných. Můžeš to řešit dvěma způsoby (možná i jinak, ale teď mě jiná možnost nenapadá):

A) buď máš k dispozici algebraické typy a (v době překladu neznámý) typ prohlásíš za nějakou nadmnožinu různých typů, v extrémním případě všech myslitelných a dál pracuješ s tímhle nadtypem

B) nebo typ zjistíš za běhu (dynamické typování!) a program podle typu větvíš, takže i v době překladu víš, že do určité větve ti jde už jenom určitý typ
Uváděl jsem příklad jakéhosi kódu s JSONem. IMHO pro staticky typovaný jazyk to není problém. Dokonce bych se troufal tvrdit, že je na to šikovnější.

Zajímalo  by mě pár kousků  těch bambilionu jiných, kde dynamické typování je vhodnější (nikoliv jediné technicky možné).

3. Někde jsi řekl, že do dynamických jazyků nejdou typy (při překladu) dodat. To není pravda. Stejně jako se u statického jazyka občas musíš uchýlit k dynamickému typování, můžeš u dynamického jazyka otypovat ty části programu, kde v době překladu víš, co tam bude za typ. A můžeš to i kontrolovat, úplně stejně jako u statického (viz např. u Erlangu Dializer). Dokonce by asi i šlo (ale nevím o žádném dynamickém jazyce, který by to uměl) třeba některé části programu otypovat staticky a u nich vyhodit kontroly typů za běhu.
Myslím, že to jsem nebyl já.

Prostě, ty dva přístupy se vzájemně nevylučují. Je třeba si jenom uvědomit, že u některých částí programu víš předem, s jakými daty může pracovat, u jiných částí to nevíš (ani u jednoho typu jazyka). Ty části můžou být různě velké.
Já vím.

Na druhou stranu s tebou docela souhlasím v tom, že udržovat tu část, kde typy znáš, co největší (a tím se vyvarovat runtime chybám) je docela dobrý přístup. Ale i kdyby ses na hlavu postavil, nemůžeš mít takových 100% programu. Někde prostě z principu věci dostaneš data, jejichž typ v době překladu neznáš.
Otázka narážela na tvrzení, že dynamické typování má nějaké nesporné výhody. To, že mám blbej jazyk, který to neumí, nepovažuji za výhodu. To, že typy neumím, také nepovažuji za výhodu (i když...).

Troufám si neskromě tvrdit, že celkem vím, jaký je rozdíl mezi staticky a dynamicky typováním. Ale ať nad tím dumám jak dumám, tak mi vychází, že dynamické typování je znouzecnost. Nemá žádné benefity. Pletu se?
« Poslední změna: 31. 12. 2018, 16:09:26 od BoneFlute »

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #297 kdy: 31. 12. 2018, 16:12:49 »
S tím nemám problém. Já neobhajuji statické typování. Já hejtuju dynamické.
Však jo. Já jenom, že ty tvoje hejty platí i pro statické, jenom v menší míře.

Jsem si toho vědom. Ale to už je úplně jiná otázka. (Můj velký sen je typový systém (nebo cokoliv jiného), kterým budu schopen zajistit absolutní korektnost. Ale to už jsme tu tuším probírali, a narážel jsem na nepochopení :-))

Kit

Re:Co si myslíte o OOP?
« Odpověď #298 kdy: 31. 12. 2018, 16:13:36 »
Představ si funkci, která má argumenty a plní formulář:
Kód: [Vybrat]
function assetContactForm(form, name, age, email, content)
{
    form['name'].value = name
    form['age'].value = age
    form['email'].value = email
    form['content'].value = content
    return form
}
Ze začátku to plníš takhle. Pak si ale řekneš, že by si chtěl omezit vstupy  na číslo, text, etc. A nebo zjistíš, že vlastně ta funkce je celá blbě.
Využiješ situace, že na začátku pracuješ s ideálními podmínkami. Ale na závěr už chceš spolehlivý kód.

V PHP to jde docela snadno. Prostě ty typy nacpeš do formálních parametrů a máš hotovo.
Kód: [Vybrat]
function assetContactForm(array $form, string $name, int $age, string $email, string $content) {
    $form['name'] = $name;
    $form['age'] = $age;
    $form['email'] = $email;
    $form['content'] = $content;
    return $form;
}

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #299 kdy: 31. 12. 2018, 16:17:52 »
Dokonce by asi i šlo (ale nevím o žádném dynamickém jazyce, který by to uměl) třeba některé části programu otypovat staticky a u nich vyhodit kontroly typů za běhu.
PHP, google-closure-compiler, Flow, TypeScript.

Nevím jak je na tom to vyhození kontroly typů za běhu (minimálně snad google-closure-compiler by to měl splňovat). Ale zatím pozoruju, že 1) to vyhození kontroly není potřeba, 2) jen z dynamicky typovaného jazyka děláš staticky typovaný jazyk. Takže jsme IMHO u slovíčkaření.