Problém OOP vidím spíš v tom, že ho nikdo pořádně neumí. A i když už ví vo co go, tak ho neumí správně a efektivně použít. Tím neříkám, že třeba já jsem výjimka.
OOP neberu jako dogma, jen jako forma pohledu. Objektově jsem programovál v době, kdy jsem OOP neznal. Jen jsem si to neuvědomoval. Tíhnul jsem k vytváření instancí, černých soběstačných krabiček, které lze snadno instanciovat. Samostatně fungujících jednotek, které standardním způsobem komunikují s okolím a imitují vztahy mezi lidma.
Příchodem lambda funkcí zejména v javascriptu ale i v C++ je to opět posunuto trochu jinam... jenže... ona taková funkce může být chápána jako objekt. Nezřdka kdy přepisuju funkce na rozhraní, protože prostě jedna funkce je málo na nějaký obecnější vyjádření. Jindy zase přizpůsobuju objekty, aby dobře pracovaly jak s objektem, tak s funkcí. V javascriptu může mít funkce vnitřní stav.
function create_counter(start) {
var cnt = start;
return function() {return cnt++;}
}
var counter = create_counter(10);
console.log(counter());
console.log(counter());
console.log(counter());
Je to funkce nebo objekt?
Pokud tento objekt voláním přijme message, aby vrátil jako výsledek jinou message, je to objekt. Je to jen úhel pohledu.
Totálne si to nepochopil. Nekritizuje to bunka A posle data bunke B ale kritizuje cely ten nezmysel čo je v Jave. Tvoj priklad je navyše nezmyselný, lebo ani nevieš čo je a čo neni OOP, porovnavaš OOP s OOP a na jedno OOP nadavas zatial co druhe vyzdvihujes, ale pri tom je to ten isty OOP. Až bys vyskúšal Golang, Ruby, ERLang a pod. a psal bys neOOP, pochopil by si jak moc je OOP v podobe javy nezmyselné, už to kolik design patternov potřebuješ vedieť abys to OOP samotne docielil svedčí o tom že celú prácu to komplikuje.
Tys to nepochopil. Ne bez patternov to nejde, pokiaľ sa jedná čo i len o trocha komplexnejší projekt. Když sa pokúšaš o to to psať bez patternov, pak to vyzerá tak že všade sa len kód "hackuje" a "ohýba" a když máš projekt s 20 tisíc riadkami kódu s 80 triedami, s 500 metodami, tak jedna metóda ovplivní funkčnosť polovice tried, metód a kódu. Chceš osoliť hranolky a odpáliš nukleárnu bombu. Kdyby to šlo bez design patternov, proč by boli vôbec vymyslené?
23. 7. 2019, 13:17 editováno autorem komentáře
myslíte counter? No to byl příklad. Ale já takle mám dělané streamy.
function parse(stream) {... whatever....}
function create_string_stream(string) {
var s = string;
var l = string.length;
var i = 0;
return function() {
if (i >= l) return null; else return s.charAt(i++);
}
}
$ var s = create_string_stream("hello world")
undefined
$ s()
"h"
$ s()
"e"
$ s()
"l"
$ s()
"l"
$ s()
"o"
$ s()
" "
$ s()
"w"
$ s()
"o"
$ s()
"r"
$ s()
"l"
$ s()
"d"
$ s()
null
$ s()
null
Zkuste si v prohlížeči. Parser samozřejmě očekává funkci co vrací další znak dokud není konec streamu. Mam plnou svobodu mu jako zdroj znaků poskytnout cokoliv.
Jinak používám javascript k vyjádření algoritmu. Všechny tyhle postupy používám v C++. Ale to si asi těžko vyzkoušíte
U class bych musel vymýšlet rozhraní. musel bych pak dědit ten class - moc komplikovaný
takhle mohu napsat
parse(function() {
//...
return ...
})
a vyšvihnout tam inline generátor. Jde o to, že rozhraní je jasně daný. Je to funkce, volá se bez parametrů a vrací další znak. string_stream je jen jedna možná implementace. Čtení ze souboru bude vypadat jinak ale bude mít stejně jednoduché rozhraní.
Zápis do streamu je zase funkce, která přijímá znak. Případně null (zapíše EOF)
Funkce nemůže mít „vnitřní stav“, funkce může mít jen kontext, to je tento případ.
V případě, že bychom připustili, že counter je objekt s jedinou metodou, jejíž desktiptor se tudíž při posílání zprávy neuvádí, tak by to OOP sice připomínalo, ale OOP to vlastně není, protože klíčovou vlastností je, že objekt může přijmout JAKOUKOLIV zprávu a zpracovat ji. To zde neplatí.
Kdyby return vracel dictionary funkcí, pak by bylo možno uvedením názvu jednotlivé spouštět, ale opět by to nebylo OOP, protože situaci, kdy se odkážeme na neexistující položku dictionary, nevede na zachycení neznámého deskriptoru metody a vyřešení situace „objektem“.
Závěr: Tohle OOP není.
Asi jsem totálně mimo. Funkce že nemůže mít vnitřní stav? A co tedy vidíte?
Ale jo, rozumím tomu, že "správně zadefinovaná" funkce nesmí mít vnitřní stav. Ale běžně píšu funkce a potažno lambda funkce, který běžný vnitřní stav mají. Je to OOP programování nebo funkcionální programování?
vemte si objekt. Objekt příjme zprávu, a zpracuje ji, eventuálně generuje další zprávy na jíne objekty.
function vytvor_objekt(params) {
var vnitrni_stav = params;
return function(zprava) {
switch (zprava.nazev) {
case "get" : return vnitrni_stav;
case "set" : vnitrni_stav = zprava.hodnota;return;
default: return "neumim";
}
}
}
$ var obj = vytvor_objekt(10)
undefined
$ obj({nazev:"get"})
10
$ obj({nazev:"set", hodnota:20})
undefined
$ obj({nazev:"get"})
20
$obj({nazev:"aaa"})
"neumim"
Je to funkce nebo objekt? Přijímá to zprávy, zapouzdřuje to vnitřní stav, dědičnost by se dala udělat dekompozicí (prostě by potomek do vnitřního stavu zahrnul předka a neznámé zprávy by forwardoval předkovi) a to by řešilo i polymorfismus.
Pořád ne? Musíte mít na to úředně razítko, nebo umíte změnit úhel pohledu? O tom to totiž je
Je to uzávěr, ne funkce s vnitřním stavem (interně nějaká struktura s funkcí a ukazatelem na její okolí, což mimochodem komplikuje vůbec základní způsob práce s těmito strukturami).
Jinak to myslíš a píšeš dobře, jen nepoužíváš správnou terminologii a lidi se na to chytají (a mají taky pravdu).
Nechme ale mluvit klasika nejklasičtějšího:
The venerable master Qc Na was walking with his student, Anton. Hoping to
prompt the master into a discussion, Anton said "Master, I have heard that
objects are a very good thing - is this true?" Qc Na looked pityingly at
his student and replied, "Foolish pupil - objects are merely a poor man's
closures."
Chastised, Anton took his leave from his master and returned to his cell,
intent on studying closures. He carefully read the entire "Lambda: The
Ultimate..." series of papers and its cousins, and implemented a small
Scheme interpreter with a closure-based object system. He learned much, and
looked forward to informing his master of his progress.
On his next walk with Qc Na, Anton attempted to impress his master by
saying "Master, I have diligently studied the matter, and now understand
that objects are truly a poor man's closures." Qc Na responded by hitting
Anton with his stick, saying "When will you learn? Closures are a poor man's
object." At that moment, Anton became enlightened.
Bude to stačit takto?
https://stackoverflow.com/questions/2497801/closures-are-poor-mans-objects-and-vice-versa-what-does-this-mean
popř. v kontextu JavaScriptu: http://skilldrick.co.uk/2011/09/closures-vs-objects-fight/
Zkráceně: jedno není náhrada druhého (ani naopak). Jedná se spíše o dva přístupy, které sice mají společný průnik, ale spíše se doplňují, než aby se všude používaly buď uzávěry nebo naopak všude objekty (nezávisle na tom, zda class-based nebo prototype-based).
Nikdy by mě nenapadlo srovnávat uzávěry a objekty jenom proto, že v každém je kdesi jakýsi stav, asi proto jsem to nepochopil. Že jde uzávěra olemplovat objektem, bych pochopil, ale jak jde zasílání zpráv objektu olemplovat uzávěrami, to nechápu.
Každopádně děkuji za odkaz, kde nejúspěšnější vysvětlení začíná větou „Consider Java.“.
Psal jsem, že objekty a uzávěry jsou 2 různé věci, které se sotva můžou vzájemně nahrazovat!
Jsou to dva ruzne koncepty, ktere se v praxi bezne nahrazuji.
Z jedne strany v Jave jsou lambda vyrazy a s nima spojene uzavery reseny pomoci objektu.
Z opacne strany neni problem nad uzavery postavit objektovy system, bezne se to pouziva pri vyuce programovani vychazejici z Lispu/Scheme. Objekt lze udelat jako variadickou funkci, ktera jako prvni argument bere zpravu a funguje jako dispatch, ktera preda argumenty dal prislusne metode. Kdyz se to hezky obali makry, vypada to, jako by to v tom jazyce bylo odjakziva.
„...Objekt lze udelat jako variadickou funkci, ktera jako prvni argument bere zpravu a funguje jako dispatch, ktera preda argumenty dal prislusne metode...“
Tohle je první funkční řešení objektu uzávěrami, co jsem tu viděl.
Tohle teoreticky funguje, z praktického hlediska je nevýhodou, jestliže každý objekt obsahuje svoje vlastní instance funkcí, protože to často zabírá více místa než stavy, což se při např. desetitisících objektů projeví. Asi by se daly „dispatchované“ funkce vyčlenit do něčeho jako prototyp či třída a odkazovat je na kontext jednotlivých objektů...