Ministerstvo průmyslu a obchodu vyhlásilo druhou veřejnou soutěž v programu TWIST, který podporuje výzkum, vývoj a využití umělé inteligence v podnikání. Firmy mohou získat až 30 milionů korun na jeden projekt zaměřený na nové produkty či inovaci podnikových procesů. Návrhy projektů lze podávat od 31. října do 17. prosince 2025. Celková alokace výzvy činí 800 milionů korun.
Google v srpnu oznámil, že na „certifikovaných“ zařízeních s Androidem omezí instalaci aplikací (včetně „sideloadingu“) tak, že bude vyžadovat, aby aplikace byly podepsány centrálně registrovanými vývojáři s ověřenou identitou. Iniciativa Keep Android Open se to snaží zvrátit. Podepsat lze otevřený dopis adresovaný Googlu nebo petici na Change.org.
Byla vydána nová verze 18 integrovaného vývojového prostředí (IDE) Qt Creator. S podporou Development Containers. Podrobný přehled novinek v changelogu.
Cursor (Wikipedie) od společnosti Anysphere byl vydán ve verzi 2.0. Jedná se o multiplatformní proprietární editor kódů s podporou AI (vibe coding).
Google Chrome 142 byl prohlášen za stabilní. Nejnovější stabilní verze 142.0.7444.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 20 bezpečnostních chyb. Za nejvážnější z nich bylo vyplaceno 50 000 dolarů. Vylepšeny byly také nástroje pro vývojáře.
Pro moddery Minecraftu: Java edice Minecraftu bude bez obfuskace.
Národní identitní autorita, tedy NIA ID, MeG a eOP jsou nedostupné. Na nápravě se pracuje [𝕏].
Americký výrobce čipů Nvidia se stal první firmou na světě, jejíž tržní hodnota dosáhla pěti bilionů USD (104,5 bilionu Kč). Nvidia stojí v čele světového trhu s čipy pro umělou inteligenci (AI) a výrazně těží z prudkého růstu zájmu o tuto technologii. Nvidia již byla první firmou, která překonala hranici čtyř bilionů USD, a to letos v červenci.
Po Canonicalu a SUSE oznámil také Red Hat, že bude podporovat a distribuovat toolkit NVIDIA CUDA (Wikipedie).
TrueNAS (Wikipedie), tj. open source storage platforma postavená na Linuxu, byl vydán ve verzi 25.10 Goldeye. Přináší NVMe over Fabric (NVMe-oF) nebo OpenZFS 2.3.4.
Imho pro člověka zvyklýho na C++ by to mělo být celkem intuitivní až na pár detailů...
Obj-C ? Takze bude KERNEL-ULTRAS applikace pro iPhone? 
I když rozdíly tam jsou.
D je programovací jazyk, jehož záměrem bylo „C++ done right“To mi připomíná Subversion („CVS done right.“)...
.
#include <stdio.h>
#include <complex.h>
int main(void)
{
double complex a = 2+3*I;
double complex b = 1-2*I;
double complex c = a * b;
printf("%f %f\n", creal(c), cimag(c));
return 0;
}
To je sice hezké, ale pořád mi to přijde multiplatformní asi jako pouštět hru pro Windows ve Wine.Což vzhledem ke věcem jako je winelib, nebo i obyčejnému zapouzdření wine do skriptu, není vůbec špatné. Ovšem pokud ta hra bude psána jako multiplatformní (což nevylučuje, že jednou z cílových platforem jsou windows).
//) do konce řádku (a to D má), absolutně k ničemu.
/* Začátek komentáře /* Předchozí komentář */ Konec předchozího komentáře, který ukončí blok komentářů */ Zamýšlený konec komentáře, ve skutečnosti chybavs
/+ Začátek komentáře /* Předchozí komentář */ +/ Konec komentářeBTW: Autor ještě zapomněl zmínit dokumentační komentáře.
char ch; // unsigned UTF-8 znak, hodnota 0xFFUTF-8 znak (čo to vlastne je?) asi nemôže mať hodnotu 0xFF...
import std.stdio;
void main(){
char ch;
writefln("0x%x", ch);
}
bystrousak@kitakitsune:~/Plocha$ rdmd char_test.d 0xffNěkolik dalších informací třeba v oficiální dokumentaci: Types, Porovnání C++ a D stringů.
může:
http://ideone.com/NGbmt
http://www.eki.ee/letter/chardata.cgi?ucode=00FF
http://www.utf8-chartable.de/
assert(mixin("5 + 10") * 2 == 30);
WTH? Tady mixiny jsou asi něco jiného než třeba v Ruby, ne? Já bych to pojmenoval "eval"
.
Autor poukazuje na linkovatelnost k objekovým souborům jiného kódu, ale zároveň dodává, že prototypy je nutné obalit do bloku extern C. To ovšem znamená, že se překladač používá pro symboly v objektu jiné názvy, než které používá programátor v D.
Táži se tudíž, jestli specificikace stanovuje name space mangling, nebo jestli to je ponecháno na libovůli překladače, jako to je u C++, pročež není možné míchat knihovny přeložené různými překladači (nebo dokonce jejich verzemi)?
foreach by som určite spomenul i foreach_reverse a mixiny by som ponechal na samostatný diel.
V poslednom príklade sú špatné úvodzovky:
throw new Exception(„second“);
Dík za seriál.
Z vaše výčtu v příkladech vidím jenom kontejnery přímo v jazyce, tady konkrétně hashtable, což považuji naopak za významné pokurvení jazyka, a lehkou zmínku o GC, který, když už teda na něm někdo trvá, lze mít v C++ také (ne, o smart_ptr nemluvím).
Ale třeba to bude v dalších dílech lepší.
IMO, kontejnery v jazyce jsou lepší přístup, ale to je asi věc osobního vkusu
Pro jednodušší programy je to samozřejmě výhoda, syntaxe je přehlednější, pohodlnější a názornější. Ale časem se dostanete do situace, kdy budete potřebovat nějaký kontejner, který v jazyce není. A pak se nutně ty ručně dopsané budou syntaxí lišit od těch standardních. Výhoda kontejnerů ve standardní C++ knihovně je, že si můžu napsat vlastní rb_map, který interně používá RB strom, ale navenek se chová stejně jako standardní std::map, takže v případě potřeby stačí vyměnit typ v deklaraci, přidat jeden #include a na kódu nemusím měnit vůbec nic.
A navíc funkčně to můžeš emulovat pomocí interfaces / mixins.
.
) mělo být řešeno přes interface. Ale nerad píšu interface pak funkční class-y a jednu/dvě/tři vnitřní implementace, které budou vždy totožné, můžu neustále kopírovat (to je blbost), nebo napíšu další třeba i „statickou“ třídu. Raději udělám „abstraktní“ objekt místo interface a totožnou funkcionalitu implementuji tam kam patří - v něm
.Mají a jsou super, nicméně vícenásobná dědičnost není zlo, ale umožňuje někdy výrazně méně psaní, když to je potřeba.Nevšiml jsem si.
Prostě nežeru myšlenku: „Interface nesmí nikdy obsahovat nějakou implementaci“.Tak to se shodnem. Já neměl namysli nutně pouze abstraktní interface. Ale ve většině případů s ním vystačím. Při dobrém návrhu se dá funkcionalita interface vyhodit do samostatné třídy, takže i absence implementace se dá obejít. Přijde mi to jako menší prasárna než řešit při vícenásobné dědičnosti problémy s vícenásobným předkem.
Chtělo by to jazykovou podporu pro delegaciTo by imho bylo dědičnosti velice podobné (onehdá se o tom vedl flejm). Byla by to vlastně dědičnost, akorát s trochu jinými pravidly přístupu.
Chtělo by to jazykovou podporu pro delegaci, ale to bohužel zatím nikdo nemáNevím přesně jakou formu podpory máte na mysli, ale některé jazyky dovolují rozšiřovat syntax, takže by neměl být problém si tu podporu dodělat.
IMHO odstranění vícenásobné dědičnosti je jen první krok směrem k nevyhnutelnému odstranění jakékoli dědičnosti,IMHO vyvráceno praxí.
Jsou to právě praktici, kdo zjistili, že dědičnost je mizerný způsob sdílení implementace a že by se jí programátor měl pokud možno vyhýbat.
Jo, tvrdím, že odstranění dědičnosti je nevyhnutelné, přináší prostě příliš mnoho problémů. Neřekl jsem, že odstranění vícenásobné dědičnosti vede nevyhnutelně na odstranění jednoduché, ale že to je IMHO první krok. Je ten významový rozdíl tak malý?
Z teoretického i praktického pohledu je vícenásobná dědičnost jen triviálním rozšířením té jednoduché, které přináší výrazně míň problémů, teoretických i praktických, než zavedení dědičnosti vůbec. Jsou nějaké problémy, které dědičnost docela dobře řeší (já vím teda o jednom, GUI toolkity a hierarchie widgetů), ale IMHO ten přínos zdaleka nevyvažuje zápory.
class A {
B b expose *; // řekněme, že B má metody m1 a m2
C c expose m3, m4;
D d expose * but m5, m6; // řekněme, že D má metody m5, m6 a m7
}
Triviální desugaring vypadá takhle:
class A {
B b;
C c;
D d;
m1() { b.m1(); }
m2() { b.m2(); }
m3() { c.m3(); }
m4() { c.m4(); }
m7() { d.m7(); }
}
Snaha vystavit metodu se stejnou signaturou z víc delegátů by vedla k chybě při překladu. Má to pár zajímavých sémantických problémů: Kdy se inicializují b, c a d? Smí se za běhu změnit? A vynullovat? Jak by se ta změna projevila v ostatních vláknech?
Jedna věc, která se mi líbí na traitech, kterou takovýmihle triviálními delegáty neuděláš: Trait smí deklarovat abstraktní metodu, kterou musí "implementující" třída definovat. Takže je tam ta vazba vlastně obousměrná. Je to užitečné, ale nejsem si jistý, jestli to nemá nějaké vlastní problémy.
Další související věc by byla jazyková podpora pro dependency injection
class A {
B b = new B() exposing *; // řekněme, že B má metody m1 a m2
C c = new C() exposing m3, m4 {
public int m4 {
// implementing abstract method
return 42;
}
}
}
Aby to bylo konzistentní, tak by metoda m4 asi neměla vidět nic ze symbolů v A. Jenže to právě ty mixed-in metody v Ruby dělají, což? Případně by m4 mohla definovat obalovací třída A, hmmm, máš pravdu, je to zajímavý problém.
Aby se s tím dalo pracovat, tak by to ještě chtělo taková ta implicitní rozhraní, co má Go: třída A podporuje taková rozhraní, pro něž jsou všechny potřebné metody vystavené.Jasně. Existuje totiž jeden rozdíl, o kterém už jsem na ábíčku několikrát mluvil, ale spousta lidí si ho pořád neuvědomuje, rozdíl mezi podtypem a podtřídou. Zdálo by se, že v mém příkladu výše bych nemohl napsat
B b = new A(), protože A přece není podtřídou B. To sice není, ale je jejím podtypem (viz substituční princip Báry Liskovové). To lze zjistit automaticky, jako v tom Go, nebo lze vyžadovat, aby to programátor deklaroval. Nemám vyhraněný názor na to, co je správné.
A k těm abstraktním metodám z traitů, v čem je problém?Já to asi řekl špatně. Traity umožňují něco takového:
trait T {
abstract int m1(); // jenom třída, která má m1, může includovat T
int m2() {
return 2 * m1();
}
}
class X with T { // to je OK
int m1() {
return 1;
}
}
class Y with T { // to je chyba při překladu, Y nemá m1
}
Je to taková rozumnější forma dědičnosti, která netrpí některými problémy (narozdíl od mixinů). Ale máš pravdu, mohli bychom uvažovat abstraktní třídy bez dědičnosti, a ve třídě, která by na někoho takového chtěla delegovat, bychom ty abstraktní metody museli dodefinovat. Ta dodefinovaná metoda by naopak měla přístup k vnějším symbolům, a měli bychom to kompletní.
To možná není špatný nápad. Delegát může mít svůj stav (trait ne; mixin ano, ale ten stav se dědí, zatímco tady by byl zapouzdřený), to je užitečné, vystavit z něj jde jenom metody, kolize je třeba řešit ručně, to by mohlo fungovat.
), eště by to chtělo vymyslet konstruktory, ale to by neměl být takový problém.
Vyměňování za běhu by taky neměl být problém, s tím, že typová kompatibilita by se kontrolovala při compile-time.
Tedy aspoň v současné podobě běžné v C++/Javě/C#, kde volající rozhoduje o tom, jaká třída se vlastně bude instancovat, o tom by měl rozhodovat volaný.
No, jestli považuješ agregaci za jiný druh dědičnosti, tak samozřejmě. Zrovna tak můžeš považovat dědičnost za jiný druh agregace.No já tadyto žonglování s těmihle pojmy celkově moc nemusím... mně to přijde jako buzzwordy. Ono totiž v praxi je "dědičnost" něco jinýho v C++, něco jinýho v Javě a něco jinýho v C# a tak dále. Každá z těhle implementací má svoje problémy, a tím pádem i svoje (různá) řešení. No a pak říkat, že "Návrhový vzor X bych nahradil Y" je takové mnhoznačné, protože v každým jazyce/prostředí by to způsobylo něco jinýho...
o tom by měl rozhodovat volanýKvůli tomu přece není potřeba rušit konstruktory. Nějakou formu kontruktoru mít musíš...
factory, která by jediná mohla používat operátor new, ale to v zásadě nic neřeší a jenom to přidělává bordel. Dependency injection je výborná věc, ale jen na určitou množinu problémů, univerzální řešení to není. Fakt nevím.
Buzzwordy, hmm, a co že toho nejsou plná všechna ta byznys-oryentyd mídia typu ITBiz? OOP byl buzzword, někdy před 20 lety, dneska letí NoSQL, ale dědičnost a agregace? Pojmy mají i svůj význam, proto existují, a že se ti zrovna nechce… no, to není můj problém.Ty pojmy mají svůj význam, ale jen v nějakém konkrétním kontextu. Ne ve filosofické debatě typu "Dědičnost je špatná, měla by se nahradit delegací/agregací/perforací/jánevimčim". Měla by se nahradit v jakém projektu? V linux kernelu? V GUI toolkitu? Ve webovém frameworku? A podobně... Prostě říct, že návrhový vzor X je lepší je jako říct, že operační systém X je lepší. Bez bližšího kontextu to nemá valný smysl.
Konstrukce objektu je hrozně magická operace.Houby magická operace
Je to jen alokace paměti a její inicializace. O co v tomhle případě jde, je nějak vhodně to syntakticky pocukrovat.
Například takhle:
class A
{
private:
B b::(*); // B má metody m1 a m2
C c::(m3,m4)
{
int m4()
{
// implementing abstract method
return 42;
}
}
D d::(^(m1)); // ^(m1) značí vše krom m1, D má metody m1 a m5
public:
A() :b(new B(...)), c(new C(...))
{
//...
d = new D(...);
}
}
Neříkám, že takhle to je vhodný způsob, jen mě to tak napadlo coby příklad...
Pojmy dědičnost a agregace mají svůj význam v kontextu objektově orientovaných programovacích jazyků.Jo? Takže můžu přístupovat stejným způsobem k třídám v C++, Javě, C# a třeba Objective-C? Neřekl bych...
Ve Smalltalku je AFAIK každá třída potomkem nějaké jiné třídy. A čím potomkem je ta prapůvodní třída, která stojí v kořeni hierarchie dědičnosti?Je bez rodiče. Stejný to je v Object Pascalu - tam mají TObject.
Už chápeš, jakou magii mám na mysli?Ne, to teda nechápu, já tam žádnou magii nevidim...
A agregace a dědičnost jsou dostatečně obecné koncepty na to, abys je mohl aplikovat i na ten Object Pascal, Simulu, Eiffel, Smalltalk, Ruby, Python a já nevím co ještě, i když se ty jazyky od sebe navzájem v jiných ohledech významně liší. (A rozdíl mezi vícenásobnou a jednoduchou dědičností je fakt minimální.)
No dobře, seš prostě Céčkař, zajímá tě implementace a filozofickou stránku věci neřešíš. Já jo, takže mne nejvíc zajímají "hraniční" případy. Konstruktor je takový hraniční případ: Je to metoda/funkce, která dělá něco, co žádná jiná metoda nedělá a dělat nemůže (a to se týká i jazyků s explicitní správou paměti – no i když, nejspíš by sis mohl v C++ ručně alokovat paměť, vyplnit hlavičku objektu, inicializovat všechny položky a pak ten ukazatel přetypovat, ale kdo by to dělal?). Dá se tomu vyhnout? Netoužím po vyloženě čistém jazyku, ale způsob, jak se vytváří objekty a hlavně jak se spojují dohromady do grafu, který tvoří aplikaci, je z praktického hlediska velmi důležitý (proto už jsem tady několikrát zmiňoval DI).
ale způsob, jak se vytváří objekty a hlavně jak se spojují dohromady do grafu, který tvoří aplikaci, je z praktického hlediska velmi důležitý (proto už jsem tady několikrát zmiňoval DI).S tím naprosto souhlasím. Mohli bychom říct, že aplikace je (z tohohle hlediska) nějaký graf objektů, buď to strom, nebo alespoň DAG, v něm jsou objekty rodičovské, potomci, a mezi nima nějaká "dědičnost" ... teď ale nemyslim tu konktrétní dědičnost známou z běžných OOP jazyků, ale obecně jakoukoli dědčinou, ať už se realizuje pomocí "běžné" dědičnosti, pomocí agregace nebo pomocí jánevím čeho. Pak tam samozřejmě existují všelijaké další vazby... Někteří lidé je rádi pojmenovávají... Takže už zbývá "jenom" to, jak to vyjádřit programovacím jazykem. Já bych osobně nejradši jazyk, který by poskytoval co nejvěší volnost a zároveň obsahoval syntaxi pro realizaci co nejvíce možných způsobů těch vazeb. Čili by asi (částečně) obsahoval nějakou meta-syntaxi. V tomhle se mně právě u D libí operator overloading - poskytuje opravdu velkou volnost.
Mohli bychom říct, že aplikace je (z tohohle hlediska) nějaký graf objektů, buď to strom, nebo alespoň DAGMohl by to být i graf s cykly s tím, že by pak mezi objekty nebyl vztah částečného uspořádání ale jen předuspořádání.
Přetěžování operátorů s použitím jmenné konvence pro metody se mi docela líbí, pokud teda na přetěžování operátorů přistoupím, a koukám, že chlapci v D se docela snaží i řešit asociativitu (ne jako ve Scale, kde se asociativita operátoru pozná podle toho, jestli je posledním znakem dvojtečka
), to je pěkné.
DI to je to, o čem se tak strašně zmateně píše na rootu?To je ono. Mluví se o tom už víc než deset let, ale do světa PHP se to dostalo až teď
Vytvoření objektu by mělo být zavolání metody třídy.A proc? Tohle me vzdycky prislo zbytecne svihle. Konstruktory objektu bych nechal jako normalni samostatne funkce (nikoliv metody objektu/trid/cehokoliv), a bylo by po problemu.
To, že to bývá instance třídy je spíš použitým jazykem a tím, že se Factory nepoužívá na triviální operace.To je naprosto v pořádku. Mezi náma, metoda __new__ v Pythonu má taky schopnost vracet jiný objekt, než o který si uživatel řekl. Takže taky funguje jako factory funkce dokonce má k dispozici stav třídy, tzn třída funguje jako factory objekt. Ale fakt je, že když chci opravdový factory objekt, vytvářím ho samostatně kvůli čistotě kódu.
Možná žádné lepší řešení není, nevim.
Vyjadřovací síla všech programovacích jazyků je stejná, ano.To není pravda.
Chtělo by to jazykovou podporu pro delegaci...Pokud jsem to pochopil, tak takovou delegaci umí Delphi (Object Pascal). Funguje to tak, že třída implementuje interface přez nějakou property, která implementuje daný interface. Je ale potřeba co nejdříve (např v konstruktoru) property nastavit na platnou instanci
type
TMyClass = class(TParent, IInterface1)
private
FInterface1: IInterface1;
public
constructor Create;
property Interface1:IInterface1 read FInterface1 implements IInterface1;
end;
Bohužel nevím, jak je to nyní, ale ve Free Pascalu s tímto byly problémy, ale jako jazyková vlastnost je to specialitka. Pascal jsem se časem odnaučil mít rád, ale tohle mě párkrát v C# chybělo.
).
Možná zamotané souvětí, ale některý kód může vypadat ještě složitější
Naštěstí jde používat debugger, který rozumí obsahu struktur, což je v dynamických jazycích obtížněji prezentovatelné, a kdo má potřebu, nakonec pochopí o co jde.
Interface v Object Pascalu fungují stejně jako interface v jiných jazycích, akorát že je možnost je používat ve spojení s technologiemi COM, DCOM a nejspíš už i .NET. Potíž s interfacy v Object Pascalu byla ta, že je většina programátorů chápala pouze takto a ne jako další prostředek jak expresivně vyjádřit svůj názor na další vývoj a rozvoj kódu. Chovám bláhovou naději, že se situace změnila. Dnes i PHP podporuje interface i když ty PHP standartní jsou atypické vzhledem k praxi zavedené v Javě i .NET a nejspíš atypické i z pohledu programátorů v ostatních jazycích.
Pokud se bavíme o tom, že interface má nějakou implementaci, tak to už není interface ve smyslu, že lze vícenásobně zdědit/implementovat pokud není povolená vícenásobná dědičnost.Parse error.
Pokud implementaci vyhodím do další třídy, tak je to právě to psaní navíc jen abych dostál nemožnosti vícenásobné dědičnost, ale principiálně je to „workaround“ a způsobí právě to, že se více píše.Asi jsem to špatně pochopil, myslel jsem, že „psaním navíc“ bylo myšleno zbytečné opakování kódu. Pokud jde o hlavičku jedné třídy navíc, tak pak beru zpět, že se v tomto shodnem. To mě u vícenásobné dědičnosti či interface opravdu netrápí. Mně osobně spíš jako workaround přijde implementace vícenásobné dědičnosti třeba v C++.
A jiném případě se zas musí zapouzdřovat a zveřejňovat a zas je to více psaní (zapouzdření není vždy ten správný přístup, i když bezpečný). Pokud se použije nějaká názvová konvence a používá se to „přímo“ ve „finální“ třídě, obvykle žádné problémy nenastanou, a efektivita je vyšší a čitelnost či přehlednost to neovlivní.Parse error.
Si prostě myslím, že vícenásobná dědičnost není zlo, zlo je když se používá místo „interface“ a její odstranění považuji za zbytečnou obstrukci jazyka.Nikde jsem nepsal, že je. Jen se mi nelíbí vícenásobná dědičnost à la C++, a tím pádem vícenásobná dědičnost ve všech jazycích, které se budou snažit optimalizovat do stejné míry jako C++.

.
. V minulosti to bylo kontroverzní téma, fčul už je to většinou klasifikováno jako zlo, (zlé) jazyky který touto možností nedisponují, závidí
.
No pokud obsahuje interface nějakou implementaci není to již interface, ale například abstarktní class a tudíž se neimplementuje, ale dědí a pokud nelze dědit vícekráte tak je to stopka, pokud chceme dědit s obou.To už je o něco srozumitelnější. To, že interface má přiřazené už nějaké hotové metody podle mě ještě nutně neimplikuje, že je to abstraktní třída (tzn že to má všechny vlastnosti, co abstraktní třída v daném jazyce). Nejspíš je to mixin.
To psaní: Ano hlavička další třídy, komentáře a volání dané metody a případné nadbytečné předávaní nějakých parametrů - ano to jsem myslelTak kvůli tomu bych se s vícenásobnou dědičností netrápil, pokud nejde implementovat nějak hezky a čistě.
No to je druhý případ psaní navíc, class má používat(dědit) třeba dvě třídy a rozhraní obou tříd má být veřejné. Takže pokud nelze dědit vícenásobně, tak se instance class-ů zapouzdří a buď se zveřejní metoda (getter) jednotlivých instancí (což má své nevýhody). Nebo se jednotlivé fce napíší znovu a jejich obsahem je jen provolání jednotlivých fcí zapouzdřených instancí.No... když vezmu dvě zcela nezávisle vytvořené třídy... a chci od obou dědit... tak budu mít docela problém s kolizemi, ne? Stejně nad tím nakonec budu muset postavit nějaký slušný interface, takže mám za to, že toho psaní navíc tak moc nebude a ta efektivita zdaleka jít do háje nemusí.
class A
{
public:
void delej();
};
class B
{
public:
void delej();
};
class C
: public A
, public B
{
public:
using A::delej;
};
C c;
c.delej(); // A::delej()
c.B::delej(); // Explicitně chceme delej z B
Asi si zase nadělám pár nepřátel, ale musím konstatovat, že nechápu všechny ty komentáře typu "super článek". Podle mne je ten článek z didaktického hlediska naopak velmi špatný. Tedy aspoň pokud byl zamýšlen jako výukový.
Článek mi připomněl jeden odstrašující příklad, jak by se učit nemělo, v osobě našeho učitele informatiky na gymnáziu (paradoxně zaměstnance KDM MFF UK). Typická hodina vypadala tak, že přišel, prohlásil: "Tak dneska si probereme pole. Pole se deklarují takhle: ...", napsal na tabuli syntaxi a když jsme měli štěstí, přidal i nějaký příklad. Pak nám dal nějaké zadání a nechal nás, ať se snažíme. Přičemž vůbec nevysvětlil, co to takové pole vlastně je a k čemu slouží. Výsledek? Kdo už Pascal uměl, ten se nic nedozvěděl, kdo ne, stejně neměl šanci to z jeho výkladu pochopit, takže byl odkázán na následný výklad od spolužáků.
Proč o tom mluvím? Protože tento článek funguje přesně stejně. Místo aby se začlo nějakým "filosofickým" úvodem o jazyce jako takovém, autor hned začne bez jakéhokoli systému chrlit úkázky, které ani moc neokomentuje, takže nám nezbývá než se dohadovat, jestli to int[string] je asociativní pole či co, co je to vlastně ten "mixin", proč má "UTF-8" znak maximální hodnotu 255 atd. Prostě jen výčet "podívejte se, co to všechno umí". A stejně jako v předchozím odstavci: kdo jazyk zná, tomu to nic nedá (až na ten příjemný pocit "jo, to znám"), kdo ho nezná, tomu také ne. Prostě to celé působí jako screenshotová "recenze" nové verze distribuce, ne jako výukový článek.
Neberte to jako že vás chci nějak strhat; vlastně jsem se ještě ani nepodíval, kdo je autorem, a záměrně to neudělám, dokud tento komentář neodešlu. Naopak, snažím se vám pomoci, protože nadšené komentáře "super článek" vám nepomohou, ty vás jen utvrdí v přesvědčení, že to děláte skvěle, což bohužel vůbec není pravda. Zkuste se nejdřív zamyslet nad tím, komu je článek vlastně určen, a pak si text procházet ne svýma očima (někoho, kdo jazyk zná a používá), ale očima právě té cílové skupiny (která ho dost možná vidí poprvé). A nepostupujte zdola, tj. od konkrétních ukázek demonstrujících nevysvětlené principy, ale naopak shora, tedy od těch principů, které pak teprve demonstrujete na ukázkách.
Ale neco jsem si presto z clanku odnesl. Ten dort, co kocicka s pejskem pekla byl patrne 'multi-paradigm'Malem jsem smichy spadnul ze zidle.
Filosoficky uvod o jazyce byl v prvni casti, imho dostatecny, prikladum z kodu jsem rozumel, napr. ty hodnoty jsem pochopil jako defaulty, je to zrejme z toho prikladu, zkuste se na nej podivat znovu.
Cili zaver - D jsem neznal, clanek jsem pochopil, tedy spor s vasi tezi. Pokud se chcete naucit programovat, nactete si neco jineho a ja se pripojuji k oslavovatelum a prosim autora, aby styl zachoval
Tiskni
Sdílej: