Jaký jazyk zvolit pro začátečníka

iwtu

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #75 kdy: 01. 11. 2010, 14:30:38 »
Ti co napíšou, že ne, tak dal bych ruku do ohně za to, že neumí OOP programovat (nebo jsou to geniové, ale kolik jich bude, že?) OOP totiž není vůbec o tom pochopit význam klíčového slova class. OOP je o něčem úplně jiném. O umění umět popsat realitu (čili reálné věci z okolí) pomocí objektů. Dokonce bych řekl, že OOP není vůbec o programování, ale o stylu myšlení. 

Myslim si, ze poznam OOP aj ho viem relativne vhonde pouzivat. Pamatam si, ako som zacinal s C++, vadilo mi, ze nerozumiem, co su namespace ale musel som pisat namemspace std. V Jave jednak musis pisat class, jednak public static void main(), co by bolo pre mna (keby som nevedel co je to premenna a cyklus) osobne kopu cudnych slovicok, ktore netusim na co su ale musia tam byt a nemal pocit, ze tomu rozumiem, lebo pisem slovicka, ktorym nerozumiem. Kdez to v Haskell, C, Python by som rozumel kazdemu slovicku co by som bol napisal, co by pre mna ako zaciatocnika velka vyhoda...

Asi mas nejake komplexy, neviem, kazdopadne tlacit do cloveku, ktory nevie co je premenna,  UML, ktore je myslienkovo uplne nad vsetkym mi pride ako zaciatocnika ucit hrat na gitare rovno Lennyho Kravitza.

Zacinal som struktruralne, zvladol som OOP a poznam kopu takych ludi... Ak sa chce, da sa vsetko, ak clovek nazatvrdne pri C...

Resp. neviem ako pre Vas, ale pre mna vzdy bolo lepsie, ako som niecomu rozumel uplne a mal som aj z toho radost.

Inac vela ludi zacinajucich s OOP si mysli, ze vyhladanie nejakeho znaku v stringu trva konstatny cas. A je potom problem ukazat cloveku, ze to tak nie je... Lebo pristup OOP je fakt taky, ze tu si spravime metodu, ona nam vrati co chceme a nikde sa nestarame ako dlho to trva atd... vrati nam co chceme a to je jedine dolezite.

Co poznam studentov, ktori zacinali s OOP a ktori strukturalne, OOP kod pisali rovnako kvalitny a ked nebolo vhodne pouzit OOP tak ti OOP sprasili OOP ako sa dalo (nemal som chut ani citat) a ti druhi to krasne elegatne vyriesili...

Myslim, ze uz fakt nemas otvorenu mysel, nemapatas ako si zacinal ty a zijes mimo realneho sveta ak chces zaciatocnikovi tlacit do hlavy UML, z ktoreho by sa asi zblaznil a uz by v zivote nehcem programovat. Resp. ja by so sa zblaznil z toho ako zaciatonik urcite...

Ludia, doparoma, ucili ste zaciatocnikov vobec? Viete, ako uvazuju? Pamate si este ako ste uvazovali vy, ked ste nevedeli cyklus for? Ako to je rapidny pokrok v mysleni a zaciatocnik uvazuje ale uplne inac ako vy... A na to ste uz ocividne zabudli...



Logik

  • *****
  • 1 049
    • Zobrazit profil
    • E-mail
Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #76 kdy: 01. 11. 2010, 15:26:05 »
No ono je OOP a (pseudo)OOP. Třeba namespace s OOP nesouvisí naprosto vůbec, má svoje místo jak v OOP, tak i procedurálním programování a jestli je něco, kam by šlo namespace zařadit, tak je to "modulární programování".

Stejnětak vyhledávání v řetězci? Jakej je rozdíl mezi strpos(retezec, znak) a retezec.pos(znak)? To co popisuješ nesouvisí s OOP, ale se znalostí vnitřností počítače a nějakého nízkoúrovňového jazyka.

Lidi co umí OOP se musí naučit procedurálně programovat, lidi co umí procedurálně se zas musí naučit objektově. Ani bez jednoho se dobrej progr. neobejde.

Protože objektovost se lépe ukazuje na větších celcích, tak je imho vhodnější začít s procedurálním stylem, jakmile ale člověk začne psát větší celky, tak na ně je OOP vhodnější paradigma a tedy čas ho začít používat.
Jakmile totiž člověk začne psát větší celky neobjektově, už si imho "kazí styl". Lepší je učit se oba přístupy najednou, aby si člověk mohl na správnou věc vybrat správnej přístup - oni totiž nejsou v protikladu, spíše se doplňujou.

A co se týče UML, tak nevím, jestli zrovna tendle jazyk je na to vhodnej - sám v něm takovou praxi nemám, ale analýza problému bez použití konkrétního jazyka, jen jako analýzu entit a jejich vztahů, je imho základní dovedností programátora a neni důvod, proč se jí neučit od začátku...



ondra.novacisko.cz

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #77 kdy: 01. 11. 2010, 16:14:45 »
Ti co napíšou, že ne, tak dal bych ruku do ohně za to, že neumí OOP programovat .... 
Ludia, doparoma, ucili ste zaciatocnikov vobec? Viete, ako uvazuju? Pamate si este ako ste uvazovali vy, ked ste nevedeli cyklus for? Ako to je rapidny pokrok v mysleni a zaciatocnik uvazuje ale uplne inac ako vy... A na to ste uz ocividne zabudli...
Ano, tak přesně Vy potvrzujete moje slova :-) OOP prostě nechápete, vůbec nevíte která bije, možná jste se o to někdy snažil, ale nikdo Vám to pořádně neukázal, nebo jste četl špatnou literaturu. Takže teď už Vám nezbylo nic jiného, než se divit a nadávat.

UML se dá naučit celkem dobře. Stejně jako v mých začátcích, kdy jsme se učili vývojové diagramy. Ty v UML najdete taky (jen se jmenují jinak, a mají trošku jiné symboly). v UML ale najdete spoustu dalších názorných diagramů, které mnohem lépe popisují problém. MImochodem, smyslem UML je ten, aby tomu diagramu nerozuměl jen programátor (ten ho nepotřebuje, všechno si sestaví v hlavě), ale zpravidla produkťák, nebo někdo takový, který moc neprogramuje a přesto potřebuje, abyste mu nějak předvedl, na čem budete dělat.

alef0

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #78 kdy: 01. 11. 2010, 17:06:28 »
UML nemusi znamenat, ze na zaciatocnika sa vybafne kompletna specifikacia, pokojne sa daju kreslit zakladne skatule, pripadne to pouzit ako analogia vyvojakov. Na cvikach (ale nie pre uplnych zaciatocnikov) som standardne kreslil UML boxy, hoci ti ludia nemuseli vediet, ze je to UML.

Napr. Head First Java od O'Reilly natrepe do zaciatocnika objekty rovno od zaciatku, ukazuje zakladne uvazovanie v duchu ,,toto je objekt a toto vieme s nim robit" (prirodzene mapovanie na metody), nasledne ukazuju foreach, a klasicky for cyklus pride az daleko daleko neskor.

To je pozitivny priklad toho, ako je kopa ludi zakonzervovanych v zmyslani, ze ,,ja som sa ucil [meno jazyka] ako prve a kto robi inak, robi chybu, pricom velmi zriedka je vyargumentovane, preco ta chyba je.

Napr. netusim, preco musi zaciatocnik rozmyslat nad vypoctovou zlozitostou: ked idem hrat na klavir, tiez nemusim vediet vsetky fyzikalne javy, ktore stoja za uderom klapky. Ano, zlozitost je treba vediet, ano algoritmy je treba vediet, ano pointre treba vediet, ale je dobre si polozit otazku, ci hned od zaciatku.

Mozno by to chcelo viac prikladov a spomienok ludi z minulosti, resp. skusenosti z ucenia.

iwtu

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #79 kdy: 01. 11. 2010, 17:27:46 »
Ti co napíšou, že ne, tak dal bych ruku do ohně za to, že neumí OOP programovat .... 
Ludia, doparoma, ucili ste zaciatocnikov vobec? Viete, ako uvazuju? Pamate si este ako ste uvazovali vy, ked ste nevedeli cyklus for? Ako to je rapidny pokrok v mysleni a zaciatocnik uvazuje ale uplne inac ako vy... A na to ste uz ocividne zabudli...
Ano, tak přesně Vy potvrzujete moje slova :-) OOP prostě nechápete, vůbec nevíte která bije, možná jste se o to někdy snažil, ale nikdo Vám to pořádně neukázal, nebo jste četl špatnou literaturu. Takže teď už Vám nezbylo nic jiného, než se divit a nadávat.

Ja si pamatam davne dni, kde som sa ucil cykly a ulohu typu vypisat zrkadlovy obraz cisla (nie retazca) mi trvalo cely den a dnes do dam do 3 minut... Ano, nerozumiem, ako sa da v tejto ulohe vyuzit OOP.

OK, predpokladajme, ze mate pravdu a nerozumiem OOP. To si nemyslim, ze je pravda ale urcite su nejake suvislosti a vynimky, ktore som nepochopil. Lebo OOP je podla mna silno netrivialny koncept a zaciatocnik travi hodiny nad trivialnymi ulohami...  Teda ja neviem OOP ale od zaciatocnika cakate, ze sa to nauci. Pritom OOP je nad strukturalnym a mne dava rozumu ucit sa radsej po castiach a nie nieco najprv vetu o kompaktonosti a potom az, co je to formula vlastne je...  Preto je podla mna vhodny Python, lebo odsteni co moze a najviac priestoru dostava logika programu... Inac za cias vyvojovych diagramov OOP nebolo a v sucasni sa ukazeje, ze OOP na fakt velke projekty nestaci a hlada sa nieco nove. Preto aj OOP vzniklo, lebo sa ukazalo ze strukturalne programovanie na vacsie veci nestaci. Asi cakate, ze zaciatocnik bude rovno robit velke veci, kde je OOP vhodne...

Dalsia vec, mam znamych vo firmach, ktori robia pohovory. Vela ludi si mysli, ze ked hladaju programatora v Jave a oni sa Javu kvazi naucili, tak ich prijmu. 98% z nich leti oknom, lebo nie su schopni spravit fukcny a stabilny program a o programovani maju uplne skreslenu predstavu. Dalsia zaujimavost, ked niekto programoval v C a pozna zbezne aj v C++, tak za kratku dobu pise v Jave ovela lepsi kod ako ten, kto videl iba Javu. Ak nahodou neviete, v Jave sa neda zacat inac ako OOP + myslim si, ze pre zaciatocnika je problem kazde slovicko, ktoremu nerozumie.  Chodia im na pohovory stovky takych pseudoprogramatorov a vsetci letia oknom. Ono ak clovek robi drivery pre liedadla, letecke simulatori, soft pre zdravotne zariadania tak sa neodpusta ziadna chyba...

Bola tu poznamka, ze treba vediet aj OOP aj struktularne. Ano. Len prax ukazuje, ze zo strukturalneho programovania sa lahsie naucit OOP ako opacne. Ak si myslite, ze strukturalne programovanie netreba vediet, tak je zbytocne sa s Vami bavit. Mne so strukturalneho prechod na OOP dava zmysel. Naopak nie, lebo by som mal pocit, ze sa ucim historiu a netesilo by ma to ani. A ked si myslite, ze OOP nie je nadmnozina strukturalneho programovia, tak sa s Vami tiez nemam o com bavit.

Ved len kolko ludi ma problem pochopit, co je to relace, triedy ekvivalencie atd...

A uprimne, nepoznam jedneho schopneho programatora, ktory zacinal s OOP. Ale kopec ludi, co zacinali s OOP a pchaju ho totalne vsade a povacsine nemaju sajnu o nejakej lower layer...

A k tomu zaciatonik sa dlho nestretne s ulohou, kde by sa OOP naozaj hodilo...

Uz sa nepovazujem zaciatnika, a chces od zaciatocnika nieco, co podla Vas neviem ani ja, tak nemozem to pochopit (mozno preto, ze nechapem OOP).

OOP je silno abstraktny pojdem a abstrakcia je to, co je na programovani najtazsie. A zacinat rovno s natazsiou vecou mi pride daleko odvaznejsie ako zacat s cistym C...

Ale neviem. Myslim, ze by mohli existovat schopny programatori, odchovanci cisto OOP, ale naozaj ziadneho nepoznam. (ale programovat v ramci Unix API by som im nedal) Samozrejme, UML je pri OOP velmi vhodne.

Neviem ako ostatnym, ale mne sa fakt naljlepsie uci jedna vec a ked sa ju naucim, tak sa potom ucim dalsie. Preto mi pride fajn Python, kde sa budem venovat najviac logike programu a minimalne vsetkym ostatnym veciam. Potom by bolo vyskusat si fajn struktularne programovanie, mozno aj ciste C (ono to ide rychlo, ak uz clovek zvlada logiku), kde si vyskusa riesit problemy, kde je najvhodnejsie strukturalne programovanie a potom nieco OOP. Dava mi zmysel, aby sa to tak mohlo naucit aj rychlejsie ako vsetko vramci nejakeho umeleho OOP.

Vlastne, aj vsetky problemy sa snazim tak riesit, ze ich rozdelim na mensie casti... A ked sa bavime o programovani obecne, nie iba o OOP, tak na zaciatok pride OOP ako zbytocny kanon.


iwtu

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #80 kdy: 01. 11. 2010, 17:42:11 »
Myslim si, ze jazyk by mal byt zvoleny podla konceptu a ako som spominal, najvacsi zmysel mi dava ist na to postupne: logika programu (vyvojove diagrami, alebo z toho by som nemal taku radost ako si naprogramovat a najlahsie to bude napr. v jazyku typu Python), potom strukturalne (kedze je to podmnozina OOP) a potom OOP (kedze je nad vsetkym).

Dalej si myslim, ze pre zaciatocnika je kazde slovicko zlo, ak nepozna jeho vyznam a v takom poriadi sa daju zvolit jazyky, ze bude rozumiet kazdemu napisanemu slovu, co mi pride fajn.

Ono, dlho som si myslel, ze volba uvodneho jazyka zavisy od vlastnoti jazyka, ale to bola hlupost. Zavisi to od konceptu a mnou vymenova cesta sa mi javi ako naschodnejsia a teda aj najrychlejsia, ak je cielom kvalitny programator. Je pekne aj to, ze sa vdaka teorii konceptov by sa mal na ceste stretnut aspon s dvoma, idealne 3 jazykmi. Potom by aj tu spojitost a abstrakciu mohol vnimat celkom tak... prirodzene.

Ale ako, velmi uvidim nejaku inu, najlepsie odskusanu teoriu :-)

P.S.: Neschopnych cistyvh OOP programatorov poznam daleko viac ako tych, ktory nezacinali s OOP.

ondra.novacisko.cz

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #81 kdy: 02. 11. 2010, 12:38:41 »
Koukám, že pro mne je problém se naučit slovensky chápat Váš text  :D

Mám z toho ale pocit, že si myslíte, že o OOP se akorát mluví a nikdo v něm skoro neumí, že je to plné chyb a je vznikají obrovské nefunkční programy. Nemáte pravdu. Třeba například Seznam jede komplet v C++, objekty tady napsat umí každý programátor v C++. Je pravda, že je to kus od kusu na jiné úrovni. Pracovat s třídami po některých lidech je přímo radost, je to tak dobře navržený, že člověk nemá ani potřebu skoumat, co je obsahem těch tříd a objektů. U některých samozřejmě ne, najdou se i případy, kdy je vidět, že ten člověk viděl C++ poprvé první den ve svém novém zaměstnání. Ale v zásadě každá analýza začína takto: "potřebujeme udělat tohle: takže vytvoříme objekt, který bude mít tyhle metody"... a takhle se tu jede pořád.

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #82 kdy: 02. 11. 2010, 13:58:45 »
Třeba například Seznam jede komplet v C++, objekty tady napsat umí každý programátor v C++.

To, že Seznam nepoužívá objektový jazyk neznamená, že ho ostatní nepoužívají.

;)

ondra.novacisko.cz

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #83 kdy: 02. 11. 2010, 14:18:46 »
Třeba například Seznam jede komplet v C++, objekty tady napsat umí každý programátor v C++.
To, že Seznam nepoužívá objektový jazyk neznamená, že ho ostatní nepoužívají.
;)

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #84 kdy: 02. 11. 2010, 14:26:22 »


Ale ne, to byl jenom pokus o hloupý vtip :)

iwtu

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #85 kdy: 02. 11. 2010, 15:21:30 »
Mám z toho ale pocit, že si myslíte, že o OOP se akorát mluví a nikdo v něm skoro neumí, že je to plné chyb a je vznikají obrovské nefunkční programy.

To som nikde nepovedal. Cely cas hovorim, ze OOP je netrivialny koncept a chce nezanedbatelne mnozstvo casu naucit sa ho spravne pouzivat...

Dalej vravim, ze zaciatocnik by mal zapasit s ulohami typu: zrkadlovo vypis cislo, kde je hlupost pchat OOP. (aspon ja v tom nevidim ziaden zmysel). Dalej si myslim, ze OOP potrebuje pre zaciatocnika kopu slovicok, pri ktorych nebude rozumiet, preco ich musi pisat ale musia tam byt, lebo to vyzaduje koncept OOP. Co si taktiez nemyslim, ze je dobre. Dalej si myslim, ze OOP v sebe zahrnuje logiku, struktularne programovanie, navrch OOP. Co tu 3 podstatne entity, ktore sa vidia velmi tazke, ak sa ich ma ucit clovek naraz, zvlast ak nevie za 3 minuty naprogramovat zrkadlovy obraz cisla. Mam pocit, ze lepsie sa je tie veci ucit postupne, teda najprv logiku programu, potom navrh struktur a funkcii a potom navrh OOP. Snazim sa problem naucit sa programovat rozdelit na 3 mensie problemy, zlozenim ktorych (konkretne inkluziou) sa vyriesit problem seriozne sa naucit programovat. Neviem, ako riesite problemy Vy, ale sa snazim vsetky problem riesit tak, ze si ich rozdelim na mensie, urcim disjuktne, urcim inkluziu a zacnem tie problem riesit postupne (sekvecne (mam iba jednu hlavu)). A na zaver si myslim, ze vediet kvalitne programovat v OOP vyzaduje vsetky spominane entity.

Snad je uz jasne. Dakujem.

ava

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #86 kdy: 03. 11. 2010, 10:45:49 »
To je porad s tim zrkadlovym obrazem cisla - v ciste OOP jazyce Smalltalk napisu
Kód: [Vybrat]
12345 printString reversed 3 minuty mi to fakt netrvalo, a nemam pocit ze by to bylo pro zacatecnika nejak obtizne pochopitelne nebo ze by bylo hloupost delat to v OOP jazyce..

ondra.novacisko.cz

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #87 kdy: 03. 11. 2010, 12:00:31 »
To je porad s tim zrkadlovym obrazem cisla - v ciste OOP jazyce Smalltalk napisu
Kód: [Vybrat]
12345 printString reversed 3 minuty mi to fakt netrvalo, a nemam pocit ze by to bylo pro zacatecnika nejak obtizne pochopitelne nebo ze by bylo hloupost delat to v OOP jazyce..

Number(12345).toString().reversed();

Jo. tohle není Java, ale C++. Nicméně to vyžaduje knihovnu, stejně jako v tom smalltalku (a v Javě). Z OOP tam je snad jen to, že číslo je objekt, ale jinak to o OOP nic nevypovídá  ;D

Medvědí služba (váš příspěvek)

iwtu

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #88 kdy: 03. 11. 2010, 12:51:07 »
Number(12345).toString().reversed();

Jo. tohle není Java, ale C++. Nicméně to vyžaduje knihovnu, stejně jako v tom smalltalku (a v Javě). Z OOP tam je snad jen to, že číslo je objekt, ale jinak to o OOP nic nevypovídá  ;D

myslel som, ze chcete viest zaciatocnika ku algoritmizacii... Kludne by namiesto toho mohlo byt aj vypisat ciferny sucet... (panecku, strelil som prvu ulohu co ma napadla a uz sa musite predhanat...) Btw, stale ste nepovedali jediny rozumny dovod (aspon som ho nikde nepostrehol) preco zacat s OOP.

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

int
main(void)
{
int cislo, obraz;
scanf("%d", &cislo);

obraz = 0;
while (cislo > 0 ) {
obraz *= 10;
obraz += cislo % 10;
cislo /= 10;
}

printf("Obraz je: %d\n", obraz);
}

V Pythone som dlho nerobil, tak to nedam za 2 minuty ale mal by ten zdrojak vyzerat krajsie i jednoduchsie

ava

Re: Jaký jazyk zvolit pro začátečníka
« Odpověď #89 kdy: 03. 11. 2010, 19:37:59 »
Nehoruji primo pro OOP, jen jsem chtel ukazat, ze v OOP jazyku clovek muze programovat, aniz by zpocatku musel znat tu furu netrivialnich konceptu (mimochodem, objekty = data + metody a posilani zprav, coz jsou skutecne asi jedine podstatne koncepty OOP, prijdou pomerne intuitivni). Vas "algoritmizujici" priklad na zrcadlovy obraz cisla by ve smalltalku doslovne vypadal takto:

Kód: [Vybrat]
| cislo obraz |
cislo := 12345.
obraz := 0.
[cislo > 0] whileTrue: [
obraz := obraz * 10 + (cislo \\ 10)).
cislo := cislo // 10.
].
obraz.

Mozna je to profesni slepota, ale prijde mi, ze je pomerne dobre citelny i pro cloveka co smalltalk vubec nezna.

Jinak samozrejme netvrdim, ze OOP je jedina spravna cesta. Ale myslim si, ze jazyk C, Pascal apod. NEJSOU dobre jazyky na vyuku algoritmizace.

Priklad: Jako zadani jakehosi algoritmizacniho prikladu je implementace stromu, vcetne metod (funkci, procedur, podle jazyka), ktere strom prochazeji preorder, inorder, postorder. Aby tyto byly zaroven uzitecne, a zaroven obecne, musi byt (jinak to podle me opravdu nejde) naimplementovany tak, aby braly jako parametr kus vykonavatelneho kodu, ktery se pro kazdy prochazeny element zavola s timto elementem jako parametrem. Nyni mame podle schopnosti jazyka nasledujici moznosti:
1)
Jazyky, ktere to podporuji (Smalltalk, Ruby, Lisp, Python, Scala, C#) maji syntaxi pro anonymni (lambda) funkce, muzeme tedy primo psat napr:
Kód: [Vybrat]
aTree inorderDo: [:eachElement | eachElement echo]2)
V OOP jazycich udelame tridu, ktera implementuje pozadovanym zpusobem napr. metodu
Kód: [Vybrat]
EchoExecutor::executeOnElement(e: TreeElement)
{
 echo(e)
}

, a volame
Kód: [Vybrat]
aTree.inOrderDo(new EchoExecutor)
3)
Konecne v jazyce C, kde nemame ani jedno, ani druhe, nam zbyva ukazatel na funkci, Ten ma ovsem dve nevyhody:
a) "Ukazatel na funkci, ktera bere jako parametr ukazatel na TreeElement" je podle me nejobtizneji uchopitelny koncept ze vsech tri
b) Predstavme si, ze by prvky stromu byla cisla, a my chceme jejich soucet. V tomto pripade je nutne nekde ukladat mezisoucet. V pripade lambda funkci to neni problem, protoze mohou referencovat promennou z blizkeho kontextu, napr.

Kód: [Vybrat]
| sum |
sum := 0.
aTree inOrderDo: [:eachElement | sum := sum + eachElement]

V pripade OOP jazyku mame situaci snad jeste jednodussi, protoze staci do EchoExecutora pridat instancni promennou. Ovsem v pripade jazyka C a ukazatelu na funkce mame jedinou moznost, pouzit statickou (globalni v souboru) promennou. Ze jsou tyto spatne, vi kazdy slusny programator. Kdyz nic jineho, nas kod nyni neni thread-safe. Samozrejme, ze jsou cesty, jak tento problem obejit, myslim ze asi vetsina C-Ckaru by vycouvala tak, ze by funkce, ktera se vykonava nad elementem stromu, brala jeste druhy parametr, nejake void *data (chceme preci byt obecni a neomezovat se jenom na scitacky), do ktereho by bylo mozne ukladat mezistavy (pozn: to je presne pripad napr. knihovni funkce strtok vs. strtok_r). V pripade souctu by tam byl int *sum, a v tele funkce by se pretypovavalo - cimz jsme se efektivne zbavili typove kontroly, kterou za nas prekladac delal, a zavedli koncepty, ktere spolehlive maloktery zacatecnik rozdycha. A proc? Abychom simulovali, to co za nas delaji OOP jazyky samy - svazali data a kod do jednoho zapouzdreneho objektu. Ovsem zatimco OOP jazyky to za nas delaji vsude, rady a efektivne, my to delame ad-hoc, kod je tezko srozumitelny, a ztracime typovou kontrolu.

Zaver
Tvrdim, ze na vyuku algoritmizace je potreba jazyk, ktery snadno podporuje kod-jako-data. Ja znam pouze blokove uzavery a OOP instance v objektech (v LISPu je ovsem veskery kod zaroven data, ale nevim, jestli se to da povazovat za blokovy uzaver). Toto je nezbytne k budovani algoritmickych stavebnich bloku. Jake jsou dusledky? U ktereho kodu rozhodnete rychleji, co dela?

Kód: [Vybrat]
int coAsiDelaTahleFunkce(const int pole[], const int velikostPole)
{
int i;

for (i = 0; i < velikostPole; i++)
    if (odd(pole[i]))
        return true;
return false
}

vs

Kód: [Vybrat]
coAsiDelaTahleFunkce: pole

    ^pole anySatisfy: [:element | element isOdd]

Osobne nepovazuji za podvod to, ze v C-ckove verzi je zaroven implementovan algoritmus anySatisfy, protoze v praxi ho kazdy C-ckovy programator proste naimplementuje znovu a znovu. Jako jedinou alternativu ma totiz udelat si funkci,
Kód: [Vybrat]
int isOdd(void *arg)
{
    return odd(*((int *)arg))
} /* (doufam, ze jsem tam ty hvezdicky dal spravne, melo jit o pretypovani na int* a naslednou dereferenci) */
, a to proste nikdo delat nebude. Pritom smyslem algoritmizace neni vsechny, i ty nejtrivialnejsi konstrukty, prepisovat pomoci assembler-like primitiv jako jsou for-smycky, ale vybudouvat rozumne stavebni bloky prislusne domene algoritmu, a z tech pak srozumitelne algoritmus vybudovat.  V zaplave smycek clovek nepozna, co je allSatisfy, co anySatisfy, co je map, co je reduce, a tak, misto aby se vzdelaval v tom, jake konstrukty se pro tvorbu algoritmu hodi, cvici se jen ve for/while/break/continue/ukazatel na funkci, co ma jako parametr ukazatel na funkci vracejici ukazatel na pole charu a jak na nej pretypovat z void* idiomech, ktere jsou stejne neprenositelne do jinych jazyku.

Takze jeste jednou. Netvrdim ze OOP je jedina moznost jak lepe programovat. Jazyky podporujici funkce vyssiho radu (lambda funkce) jsou dalsi. Nicmene, jazyky ktere neumoznuji snadno reprezentovat kod jako data a manipulovat s nim, jsou proste velice omezujici a na vyuku programovani se nehodi. Pokud si myslite, ze jsou obtizne, vyzaduji kupu novych a tezko pochopitelnych pojmu, vezte, ze zadny z nich neni ani zdaleka tak komplikovany jako pretypovani void* ukazatele na ukazatel na funkci, ktera zpracovava pole stringu. Naopak, jak blokove uzavery (closures/lambda funkce), tak objektove programovani (tedy zasilani zprav a zapouzdreni kodu a dat do objektu) jsou velice intuitivni, pokud nejsou ovsem zkomplikovany kupou dalsich, s OOP vubec nebo jen vzdalene souvisejicich pojmu, jako je tomu napr. v jazyce C++.

Doufam ze tento post byl konstruktivnejsi nez muj predchozi :-)