Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Filip Jirsák

Stran: 1 ... 163 164 [165] 166 167 ... 375
2461
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 19:19:45 »
Je potřeba dívat se na to v historickém kontextu. Java vypadá tak, jak vypadá, kvůli rozhodnutím z minulosti (primitivní typy, boxing/unboxing...) a držení zpětné kompatibility. To není kritika, byl to prostě historický výjoj. Kdyby se dělala Java znovu od nuly, určitě by vypadala jinak než teď. Stejně jako by vypadalo jinak i C, kdyby se dělalo znovu od nuly. Ale obojí je nereálné, Java i C jsou etablované jazyky a nová Java ani nové C nebude, existující kód nikdo přepisovat nechce.

Jenomže ten historický vývoj nutně vedl ke kompromisům v designu jazyka, Java (stejně jako C(++)) si s sebou táhne spoustu špatných věcí z minulosti. A tahkle je to taky potřeba vnímat, operátor == je v Javě neintuitivní a špatně použitelný, snadno vznikne chyba. Takže je potřeba každému nováčkovi říct "Hele, dávej si pozor na operátor ==, protože nefunguje tak, jak bys čekal, dělají se v tom často chyby. Někdy to porovnává hodnoty, jindy reference, záleží na kontextu, pravidla jsou složitá. Radši to vůbec nepoužívej, když nebudeš muset". No a to je všechno, není potřeba to nějak víc řešit.
Kdybyste si nalistoval diskusi asi tak pět stran zpět, psal jsem tam to samé :-) Teda až na to, že nesouhlasím, že pravidla jsou složitá – jsou naopak velmi jednoduchá, když se porovnávají primitivní typy, porovnávají se hodnoty (nic jiného porovnat nejde), když se porovnávají objektové typy, porovnávají se reference (protože objekt je pro Javu blackbox, neví nic o tom, jestli existuje něco jako hodnota toho objektu).

2462
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 19:15:11 »
No jistě, protože porovnává adresu - hodnotu v pointeru. :D
Stejně jako při porovnání referencí v Javě, kdy se také porovnává adresa – hodnota v referenci.

Když dostane pointer a hodnotu, tak ti vynadá kompilátor.
Nikoli.

2463
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 18:38:36 »
Java je v tom špatném designu ještě dál než C++ a operátor ==  v Javě někdy porovnává hodnoty a jindy reference podle kontextu. Je to prostě blbě.
Ano, Java opravdu porovnává podle kontextu. Když dostane hodnoty, porovnává hodnoty. Když dostane reference, porovnává reference. Stejně jako C, které když dostane hodnoty, porovnává hodnoty, když dostane pointery, porovnává pointery, a když dostane hodnotu a pointer, klidně je také porovná. Když Java dostane hodnotu a referenci, kompilátor zařve. Pravda, poslední věc se změnila s i implementaci autoboxingu/unboxingu, kdy kompilátor nejprve zkusí provést autoboxing/unboxing a zařve teprve, když to není možné.

Takže je chyba v autoboxingu/unboxingu? Než se zavedl, byly diskuse plné komentářů o tom, jak je Java zastaralá a ukecaná a jako příklad se často objevovalo právě převádění mezi „malými“ a „velkými“ typy. Takže se zavedl autoboxing a autounboxing. Jak byste to řešili vy? Zakázali boxing u operátoru ==? Rozbili zpětnou kompatibilitu a zakázali úplně operátor == pro reference? Nebo jinak?

Rust mi řekně hned 3x, že dělám 3 prasárny a opravdu to není dobrý nápad:
Po dlouhé době něco, s čím mohu souhlasit.

2464
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 18:22:24 »
V tom popisu ale není nic o tom, že se ty hodnoty mají porovnávat operátorem ==.
Mně už zbývá v hlavě jediná otázka: připomíná mi tohle spíš Havla nebo Goebbelse? Nějak se nemůžu rozhodnout.
Já vám pomůžu – zkuste si do češtiny přeložit tyhle dvě věty (uznávám, je to docela dlouhé):

Citace
If the value p being boxed is an integer literal of type int between -128 and 127 inclusive (§3.10.1), or the boolean literal true or false (§3.10.3), or a character literal between '\u0000' and '\u007f' inclusive (§3.10.4), then let a and b be the results of any two boxing conversions of p. It is always the case that a == b.

Bude fajn, když se o ten překlad podělíte s ostatními, abychom věděli, o čem se tady podle vás bavíme.

Nebo samozřejmě můžete v té citaci zkusit najít jinou část, kde se mluví o operátoru ==.

2465
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 18:13:15 »
Což ale dělá úplně něco jiného než porovnání referencí. To je typový problém. Hrušky a jabka.
V tom příkladu bylo uvedeno, že dlouhý kód může způsobit, že programátor použije chybný operátor a kompilátor mu v tom nezabrání. Tohle je přesně ten případ. Proč je použití toho operátoru chybné je jedno. Navíc oba dva případy jsou o tom, že programátor si myslel, že porovnává jeden typ (int), ale ve skutečnosti porovnával jiný typ. To je podstat toho příkladu. Jestli místo intu porovnává reference, float nebo double je úplně jedno, protože ve všech třech případech nelze pro porovnání hodnoty použít operátor == (i když v prvním případě z jiného důvodu než ve druhých dvou).

Obávám se, že jsem právě odstartoval další diskusi na 200 příspěvků, kde mne budou všichni přesvědčovat, že porovnávat floaty na rovnost je přece úplně normální.

2466
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 18:04:01 »
Pohádka? Spíš absurdní komedie říznutá špatným tripem. Furt se tu opakuje, že je to častá chyba, protože je to pro programátory matoucí. A vy teď napíšete že to není opravdová chyba, že jsou jenom programátoři zmatení. Kde seženu ten matroš? ::)
Aby to bylo pro čtenáře jednodušší, vzal jsem ty body v tom pořadí, jak jsou na obrázku. 1. bod – skutečná chyba. 2. bod – programátoři jsou z něčeho zmatení. 3. bod – skutečná chyba a  zároveň věc, kterou tu řešíme. Nic o zmatení u třetího bodu, který tu řešíme, jsem nepsal. Zpochybnil jsem ten seznam „nejčastějších chyb“ – když půlka věcí je něco, co ani nejde zkompilovat, těžko to vzniklo analýzou existujícího kódu. Takže to není žádný seznam získaný měřením, je to jen něčí dojem.

2467
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 17:52:09 »
Tu chybu s dlouhým kódem v C++ nelze vyrobit.

Kód: [Vybrat]
float a = 2147483647;
double b = 2147483647;

// dlouhý kód
std::cout << (a == b);

2468
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 17:46:46 »
Ne, tohle neni nemusi byt zadna hruba chyba a doufam, ze tyhle nesmysly nevykladate juniorum. Je presne definovano, kdy se to rovnat musi a je to i zduvodnene. Naopak idealne by se chtelo, aby se to rovnalo, ale z performance duvodu to neni vyzadovane v celem oboru platnosti danych typu. Rikate to presne opacne nez to je.
Je to hrubá chyba. V Javě je opravdu přesně definováno, kdy operátor == při porovnání objektů vrací true – tehdy a jen tehdy, když se jedná o tytéž objekty (tj. stejné místo v paměti), nebo když jsou obě reference null.

String ani Integer nikdy nebyly v Javě definovány jako singletony, v žádném oboru hodnot. To, že mají vedle klasického konstruktoru také statické metody, které dělají jistou optimalizaci při vytváření instancí, na to nemá vliv.

To, co jste citoval, je popis toho, že pro určité hodnoty, u kterých se očekává časté použití, je udělaná optimalizace, aby se nevytvářely stále nové instance. Je to tedy čistě z výkonnostních důvodů, a ve specifikaci je to proto, aby bylo možné se na to spolehnout a někdo si neimplementoval vlastní pool instancí. V tom popisu ale není nic o tom, že se ty hodnoty mají porovnávat operátorem ==. Je tam jenom přesná specifikace, že v takových případech budou instance identické tehdy a jen tedy, pokud jsou identické i hodnoty. Vám to jistě připadá samozřejmé, ale specifikace má být přesná a popisovat i to, co se zdá samozřejmé.

2469
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 17:25:47 »
Pekna. A mate rad i tu o Budulinkovi?



Šest údajných „chyb“, z toho dvě jsou opravdu chyby, další je, že jsou programátoři z něčeho zmatení, a zbývající polovina jsou věci, které nejdou ani přeložit. Ještě tam chybí překlepy v názvech klíčových slov. Tohle je pohádka.

2470
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 17:20:57 »
Představil jsem si to a.. kde je problém? Ono se to bude chovat jinak při hodnotách "dostatečně malých" a "dostatečně velkých"?
Co je to zase za demagogii? Nikdy tady nebyla řeč o něčem, co by se chovalo jinak při malých hodnotách a jinak při velkých. Celou dobu je řeč jenom o tom, že někdo udělal začátečnickou chybu při použití operátoru ==. Někdo tu uváděl příklad s dlouhým kódem, programátor uvidí jen přiřazení a podle toho si odvodí (chybný) typ proměnných a následně použije chybný operátor. Jenom jsem uvedl příklad, kdy úplně tu stejnou chybu udělá programátor v C++.

2471
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 17:16:18 »
I to zastaralé C++, které má k dokonalosti hodně daleko, to má udělané líp než Java. Reference porovnávají hodnoty, pointery taky porovnávají hodnoty pointerů. Takový zmatečný kód, jako v Javě:
Už tomu rozumím. Stačí prohlásit, že Java porovnává hodnoty referencí, a vše je v naprostém pořádku.

Můžete kličkovat jak chcete, ale z toho, že v C a C++ se u pointerů porovnávají přímo ty adresy, se nevykroutíte. A Javovské reference jsou jenom bezpečně udělané pointery, nic jiného.

2472
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 17:07:02 »
Teď jsem to celé pochopil, naše nedorozumění spočívalo v tom, že já jsem pojem programátor chápal v nějakém smyslu a Ty v jiném (programátor = spokojený javista). Tudíž nemá smysl se o to dál hádat, neb coby člověk, kterého živí hlavně Python (a předtím C++ a C), nemůžu účinně argumentovat.
Ne, zase jste to nepochopil. Por mne programátor je někdo, kdo ovládá alespoň základy jazyka, ve kterém chce programovat.

Akorát bazíruju na tom, že s tím Pythonem jsi nadále mimo.
Bazírovat na tom můžete, smutné je, že nemáte pravdu.

Kód: [Vybrat]
class Integer:
    def __init__(self, value):
        self.value = value

a = Integer(1024)
b = Integer(1024)
print(a == b) #False
Co jsem udělal? Vzal jsem ten původní kód, který rozpoutal celou debatu. Kód, který se údajně v Javě chová úplně nemožně. Napsal jsem to samé v Pythonu, který se prý chová úplně jinak. A výsledek je co? Výsledek je naprosto stejný. Python se chová přesně tak, jako se chová Java, dělá přesně to, co kritizujete.

Jistě budete argumentovat tím, že v Pythonu to můžete dál vylepšovat. Můžete do třídy dopsat přetížení operátoru:
Kód: [Vybrat]
def __eq__(self, other):
    return self.value == other.value
Ano, můžete. V Javě to také můžete dál upravovat, můžete přetížit metodu equals() (resp. ve třídě java.lang.Integer už ta metoda dávno přetížená je).

Předpokládám, že budete argumentovat i tím, že žádný soudný Python programátor by nenapsal třídu Integer bez toho přetíženého operátoru. Jenže stejně tak by žádný soudný programátor v Javě neporovnával objekty pomocí ==, když chce porovnávat hodnoty.

Takže se zase dostáváme zpět k tomu, že jediný rozdíl mezi Javou a Pythonem v tomto případě je ten, že Java drží minimum funkcí samotného jazyka a proto nedovoluje přetěžovat operátory. Každý Java programátor to ví, takže ho ani nenapadne porovnávat objekty pomocí == a bude shánět metodu, která porovnání dělá. Zároveň každý Java programátor ví, že když dává smysl u jeho třídy zjišťovat ekvivalenci s jiným objektem, musí přetížit metodu equals(). Python naproti tomu chce mít bohatší jazyk, takže umožňuje přetěžovat operátory – a každý Python programátor ví, že když dává smysl porovnávat na ekvivalenci jeho třídu, musí přetížit metodu __eq__.

Jsou to dva různé přístupy, každý má svá pro a proti – a přístup, který vyhovuje vám osobně, proto ještě není obecně lepší.

akorát dodám, že JavaScriptem bych se fakt neoháněl, protože to je bastl z definice (už jenom ta jejich vnitřní reprezentace čísel - tfuj!).
To je právě ten problém, že vy se na to pořád díváte tak, že co vyhovuje vám, musí vyhovovat všem, a co vám nevyhovuje, nemůže vyhovovat nikomu. JavaScript vznikla za nějakým účelem, a pro daný účel je vnitřní reprezentace čísel úplně nezajímavá.

2473
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 15:17:01 »
Takdy ale vůbec nejde o to, co preferuje Filip Jirsák nebo někdo jiný. Důležité je, co očekává běžný Franta programátor od operátoru ==. Bežný Franta programátor očekává, že to bude porovnávat hodnoty a ne reference a už vůbec neočekává, že se to bude chovat pokaždé jinak podle kontextu.
Pokud běžný Franta programátor očekává něco, co nesplňuje snad žádný programovací jazyk, není programátor. Nebo mi ukažte jazyk, který (alespoň ve výchozím nastavení, tj. bez přetěžování operátorů) porovnává vše podle hodnoty.

běžný Franta programátor je z toho zmatený
Nikoli, programátoři z toho zmatení nejsou a chyby v tom nedělají. Programováním se živím už spoustu let, a že se někdo pokusil v Javě porovnat Stringy pomocí == jsem viděl jednou, v kódu, který ještě ani nebyl commitnutý.

V oborech, kde se pracuje s vážně s bezpečností, existuje pojem lidský činitel. Člověk je totiž ten nejslabší článek řetězu, který způsobuje nejvíce chyb. Když chceme chyby minimalizovat, musíme přizpůsobit design okolních systémů tak, aby s nimi člověk dokázal co nejlépe a nejintuitivněji pracovat. Chování operátoru == v Javě je podobné, jako kdyby někdo vyrobil letadlo, kde bude výškoměr v první polovině stupnice cejchovaný v metrech a v druhé polovině ve stopách. Samozřejmě by s tím šlo létat (a jsem si jistý, že Filip Jirsák bych to bravurně zvládal), ale u normálních pilotů by to způsobovalo zmatek a zbytečné chyby.

Tady docela hezké počtení k zamyšlení, proč by se měl design systému (programovacího jazyka) přizpůsobit člověku a ne opačně: http://projekt150.ha-vel.cz/node/117
S tím, že se má design systému přizpůsobovat člověku a ne opačně, mi mluvíte z duše, propaguju to kudy chodím. Java se k tomu principu postavila tak, že vychází z několika málo jednoduchých principů, které programátor snadno pochopí. Rozdíl mezi primitivními typy a objekty programátor pochopí snadno, a že == u primitivních typů porovnává hodnotu (protože není co jiného porovnávat) a u objektů porovnává referenci, zatímco pro porovnání hodnot slouží metoda equals(), se naučí asi tak v druhé lekci.

Že neprogramátorům vadí chování operátoru == je mi celkem jedno, moc nechápu, proč to řeší. Že to kritizují jenom u Javy, i když úplně stejně to má C, C++, JavaScript, Python a mnoho dalších jazyků (přičemž jen některé umožňují operátor přetížit), to jenom ilustruje úroveň znalostí.

Programátor vidící poslední 3 řádky na první pohled považuje proměnné a a b za primitivní číselné typy a očekává porovnávání hdnot a tedy shodu. Nemá šanci na pohled poznat, že jsou to ve skutečnosti objekty a že bude porovnávat reference a ne hodnoty.
Upozornění v IDE, že porovnává objekty ho může zachránit, ale ne každý editor kódu to umí.
Ano, lze napsat kód prasácky, a když to pak jiné prase čte a očekává něco, co si neověří, skončí to nejspíš chybným kódem. IDE v tomto případě nepomůže, protože programátoři, kteří vyrábí takovýhle kód, varování ignorují.

Mimochodem, představte si, že v tom vašem příkladu a bude float a b bude double. A teď si ještě představte, že ten kód bude C. Nebo C++. To máme ale na světě nepoužitelných jazyků, že? A co je v nich napsáno aplikací…

2474
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 11:38:34 »
Problém Tvého argumentu je, že ty způsoby nejsou dva, ale minimálně tři.
Asi jsem to měl napsat jasněji – těch způsobů je celá škála, C++ a Java jsou dva příklady, které jsou na opačných místech od středu, ale jsou těsně před extrémem. Jsou samozřejmě mnohé další jazyky, které používají něco mezi, a pak další méně používané jazyky, které používají nějakou extrémní variantu.

Lisp, Haskell a další jazyky už desítky let ukazují, že "operátor" není nic jiného, než (typicky infixová) funkce (jejíž název není alfanumerický/slovní, nýbrž složený ze symbolů) se dvěma argumenty (no, ještě jsou unární a ternární, ale to už je detail).
Ano, to je také možnost. Java se tomuhle záměrně vyhnula a udělala operátory jednoduché.

Že je vhodné nechat "operátoru" + význam sčítání, na tom se všichni asi shodnou.
Ano, na tom se všichni shodnou. Ale už asi počtvrté opakuju, že se všichni neshodnou na tom, co je sčítání.

V tomto kontextu je zajímavé, že operuješ zrovna C++ a ne alespoň C#, což je jazyk bližší Javě a "přetěžování operátorů" má taky.
Java přetěžování operátorů nemá, je to záměr, protože přetěžování operátorů komplikuje jazyk a činí kód méně předvídatelný. Vysvětloval jsem to v komentáři, na který reagujete, že programovací jazyk se pohybuje někde na škále od „pár jednoduchých nástrojů, ze kterých si sám poskládáte, co potřebujete“ po „spousta komplexních nástrojů“. Java je na té škále poměrně daleko u prvního bodu. Že vám vyhovuje to druhé je vaše věc, ale neznamená to, že je to jediné správné.

Tohle je straw man fallacy. Nikde jsem netvrdil, že nějaký jazyk navrhovali hlupáci. Ale třeba na C++ i Pythonu je vidět, že některá rozhodnutí tvůrci časem přehodnotili, Python se ve verzi 3 vydal dokonce cestou rozbití kompatibility (unicode vs string, zahození "klasických tříd", je toho hodně). Jak jsem psal v předchozím příspěvku - trvat na správnosti nějakého rozhodnutí poté, co se ukáže, že to byla chyba, je prostě kontraproduktivní. Mezitím na javovské platformě vznikly minimálně 4 další jazyky, které se snaží být lepší Javou a to přesto, že se (neochotně a pomalu) Java také vyvíjela.
Jenže to rozhodnutí se neukázalo jako špatné. To, že vám něco nevyhovuje, neznamená, že to bylo správně. Zvolené řešení (s operátorem ==) je při zachování ostatních vlastností jazyka jedno z nejlepších možných, neexistuje žádné lepší. Chybné rozhodnutí v Javě jsou primitivní typy, což je zřejmé dnes, ale v době vzniku Javy to bylo logické rozhodnutí, a kdyby to tak nebylo, dnes by nebyla žádná Java a nemohli bychom řešit, že dnes jsou primitivní typy špatně. Jedna z vlastností Javy je to, že se velmi úzkostlivě drží zpětná kompatibilita. Opět, je to záměr, je to jeden z podstatných důvodů, proč se Java používá tam kde se používá. Pokud nechcete držet zpětnou kompatibilitu a chcete rychlý vývoj jazyka, nepoužívejte Javu.

Python 3 je zrovna příklad toho, jak problematické je to rozbití zpětné kompatibility – teprve teď se reálně daří zbavovat Pythonu 2. Perl na tohle rozbití zpětné kompatibility dokonce prakticky umřel, resp. odešel do zapomnění – dříve byla dvojice Perl a Python, která spolu soupeřila, Python spíš Perl doháněl. Dneska o Perlu neslyšíte.

Navíc by mě zajímalo, v čem podle Tebe dělá Python == jako Java. Dělá to stejně jenom u "hloupých" objektů, chytrý objekt si umí říct, jestli jeho vnitřek odpovídá druhému objektu.
Tak si znovu přečtěte, co jsem napsal. Python ve výchozím stavu porovnává identitu objektů, ale je možné operátor přetížit.

Spíš mi vadí ale ta zabedněnost, s jakou se u ní na některých zjevných chybách lpí.
Problém je v tom, že to, co vy považujete za zjevné chyby, jsou ve skutečnosti přednosti. Na přednostech se opravdu lpí.

Někteří to tak mají, něco se horkotěžko naučí a pak na tom lpí.
V této diskusi ovšem máme jiný problém – někomu něco vyhovuje, a myslí si, že to tedy musí být jediné správně řešení a vše ostatní je špatně. Všimněte si na rozdíl v našich argumentech. Vy argumentujete „je to špatně, protože já mám radši něco jiného“. Já argumentuju „tenhle přístup má tyhle výhody a tyhle nevýhody, výhodné je to pro tyhle případy; opačný přístup má tyhle výhody a tyhle nevýhody, výhodné je to pro tyhle případy“. Podle mne ten, kdo zabedněně lpí jenom na svém přístupu a považuje ho za jediný správný, jste tu vy.

2475
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 09:31:05 »
Každé jedno špatné rozhodnutí, na kterém se trvá, vede k sérii marných snah o nápravu a pak je jako "řešení" nabídnuto vysvětlení, proč to je vlastně v pořádku.

Každý programátor, pokud mu někdo v rané fázi vývoje nevymyje hlavičku, očekává a chce, aby se čísla sčítala pomocí + a odčítala pomocí -. Jelikož se někdo, kdo rozhodoval o tom, co v Javě smí být a co nesmí, bál "přetěžování operátorů", má Java čísla, která se sčítají normálně přes + a pak čísla, která používají "add()", protože to "jinak nejde".

Úplně stejné to je s tím == a .equals(). Samozřejmě, že "každý" chce porovnávat dvě hodnoty a ne "identitu", když sáhne po ==. Jenže Řád zlatého šálku si na to vymyslí equals() a když děcko řekne, že císař je nahý, v poklidu děcko obviní z hlouposti nebo neznalosti a odkáže ho k četbě posvátných svitků, kde je jasně uvedeno, že císař je oděn vznešeností, což, jak jistě uznáte, není totéž co nahota.
Vidím, že vám došly argumenty, tak jste přešel na demagogii. Jaké problémy má vaše řešení s + a == jsem napsal. Mohl jste na ty argumenty věcně reagovat. Vy jste zvolil jinou variantu, tváříte se, že jste žádné argumenty neslyšel.

Pokud jste to nepochopil, argumenty vám ještě zopakuju. Problém vašeho teoretického řešení je v tom, že neexistuje jednoznačná hranice mezi tím, co je a není číslo, stejně jako často neexistuje jednoznačná definice toho, co znamená porovnání hodnot.

Přípustné a legitimní jsou samozřejmě oba dva způsoby. Jak ten, který používá třeba C++ – zavedeme do jazyka novou kategorii „číslo“, přesněji „cokoli, co se dá sčítat“ (aniž by ta kategorie nutně musela být ve specifikaci), a umožníme každému programátorovi, aby si do této kategorie zařadil své typy. Výhodou je, že se pak opravdu dá zajistit, že všechna „čísla“ se sčítají pomocí +. Nevýhoda je ta, že se lidé neshodnou na tom, co vše patří pod čísla, takže se pak programátor musí učit další věc, která navíc platí jenom v daném projektu – co jsou a co nejsou čísla. To, že si v C++ vlastně můžu vytvořit svůj vlastní jazyk, který velice stručně popisuje mou třídu problému, je velice silná vlastnost C++ – proto je také tak oblíbené. Zároveň ta vlastně nepřeberná šíře možností, která způsobuje, že už snad nikdo nemůže znát celý jazyk, je silným negativem, pro které se spousta lidí C++ vyhýbá.

Java zvolila opačný přístup. Jazyk zná jenom dva druhy datových typů – primitivní typy a objekty. Nic jiného, Java programátorovi se nemůže stát, že by v program najednou narazil na nový druh typů, třeba na „čísla“. Znamená to, že Java má velmi malé množství pravidel, toho, co programátor musí znát. Všechno dalšího je postavené na téhle základní sadě pravidel. Tahle jednoduchost jazyka je velice silná vlastnost Javy – proto je také tak oblíbená. Zároveň to způsobuje, že příslušnou třídu problému musíte popsat jen pomocí objektového paradigmatu, tříd a metod – nic jiného vám Java nenabízí. To způsobuje onu pověstnou ukecanost Javy a to, že na kde co musíte mít vybudovaný objektový framework, který teprve dá programátorovi do ruky ty nástroje, které bude používat. Což je silné negativum, pro které se spousta lidí Javě vyhýbá.

Mimochodem, je pozoruhodné, že se to chování, že + sčítá jen primitivní typy a == porovnává primitivní typy podle hodnot a objekty podle referencí, se tu vytýká zrovna Javě, která má tuhle základní sadu pravidel nejmenší z podobných často používaných jazyků. Přitom stejná pravidla platí v C, C++, JavaScriptu nebo Pythonu. V C++ nebo Pythonu ty operátory můžete (ale nemusíte) přetížit. Ale klidně si dál myslete, že C, C++, Javu, JavaScript i Python navrhovali hlupáci, kteří chování operátorů navrhli špatně, a měli se s vámi nejdřív poradit.

Stran: 1 ... 163 164 [165] 166 167 ... 375