Portál AbcLinuxu, 30. dubna 2025 16:49
closures - dobry bordel, ktery z cisteho a prehledneho jazyka udela tezkopadnou mrchu :(přehledného?
uchar
(unsigned char) a schar
(signed char). Snažil jsem se prosadit, abychom podporovali Unicode a zavedli typ "big char" a "small char", čímž by vznikly kombinace buchar
a suchar
. Odmítat v Javě syntaktický cukřík na datové struktury jako mapa a tak je masochismus na druhou nejmíň, tyjo. Closuers se do Javy asi syntakticky dvakrát nehodí anžto je to špatnej jazyk, ale jinak teda nevim jak si chce bez nich jazyk říkat vysokoúrovňový.Java není vysokoúrovňový jazyk. To je velice rozšířená iluze a zdroj mnoha zbytečných flamewarů. Java jako platforma je možná high-level (protože VM), ale samotný jazyk Java je relativně k této platformě docela low-level (z kódu je jasně vidět, jaký bytecode vznikne překladem).
if (foo.equal("cond1")) { bar = "X"; baz = "Y"; } else if (foo.equal("cond2")) { bar = "Z"; baz = "X"; } ...* kraťoučké ve smyslu Javy, ovšem pokud by měla zabudovaný typ seznam, nebo ntice, bylo by to daleko kratší
na všechno stačí pole, if (no dobrá, občas i cyklus, pokud nechceme používat goto)
Ano stačí. Dá se programovat i ve strojovém kódu. Otázkou je, kdo se v tom pak vyzná. Osobně se snažím především o maximální přehlednost. Co mi o sobě řekne typ string? Že je tam řetezec. To je tak asi všechno . Když chci ukládat jména, vytvořím si třídu Name (případně i potomky pro spec případy) a hned je mi jasné, s čím mám tu čest. I kdyby součástí té třídy měl být pouze jeden argument typu string.
Takze kdyz budes delat DB aplikaci, vytvoris si tridu pro kazdy nazev sloupce, ktery v DB je?na všechno stačí pole, if (no dobrá, občas i cyklus, pokud nechceme používat goto)Ano stačí. Dá se programovat i ve strojovém kódu. Otázkou je, kdo se v tom pak vyzná. Osobně se snažím především o maximální přehlednost. Co mi o sobě řekne typ string? Že je tam řetezec. To je tak asi všechno
. Když chci ukládat jména, vytvořím si třídu Name (případně i potomky pro spec případy) a hned je mi jasné, s čím mám tu čest. I kdyby součástí té třídy měl být pouze jeden argument typu string.
kdyz neni v dohlednu pripad, kdy bych potreboval dalsi?.
Jenže až ji budeš potřebovat, nemusíš měnit zbytek kódu. Ten už totiž pracuje s objekty dané třídy (na místo základních typů).
Trosku agility by neskodilokdyz neni v dohlednu pripad, kdy bych potreboval dalsi?.Jenže až ji budeš potřebovat, nemusíš měnit zbytek kódu. Ten už totiž pracuje s objekty dané třídy (na místo základních typů).
Budes vymyslet ficurky, vychytavky, rozsireni a vsechno mozny
Nebudu. Na to já nejsem. Já mluvil o kvalitě kódu, nikoliv o možnostech aplikace. A protože jsem líný programátor, tak to píšu pořádně hned od začátku, ať pak nemám práci s implementováním pitomostí, co si vymyslí zadavatel (ten kód už bude na ty pitomosti připravený). Mnohokrát se mi to již vyplatilo.
Když chci ukládat jména, vytvořím si třídu NameA o Adě jsi už slyšel? Možná by tvému přístupu programování odpovídala přeci jenom o nšco víc, než Java
a nezabudnite, strašiaci menom TIMTOWDI, overload operátorov a multiple inheritance sa pri približovaní javy k potrebám praxe prídu aj k vám
public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES }; public stringToSuit(String nieco) { switch (nieco) { case "CLUBS": return CLUBS; case "DIAMONDS": return DIAMONDS; case "HEARTS": return HEARTS; case "SPADES": return SPADES; } }
switch(hodnota) {
case "prvni":
runFirst();
case "neco":
runNeco();
}
Pouziti enum neni nijak pracne, ale vadi mi 2 veci:
Naopak vitanou moznosti je fakt, ze mam presny vycet moznosnosti, ktere mohou nastat. Samozrejme je to cistci, nikoli vsak jednodussi a prehlednejsi.Pak mi ale není jasné, proč kvůli tomu zavádět novou konstrukci do jazyka. Vždyť nečistě ale jednodušše a přehledně to jde zapsat už teď pomocí
else-if
ů. A zavádět nové vlatnosti jazyka ad-hoc proto aby se usnadnilo psaní jedné konkrétní nečisté konstrukce, to není moc dobrý nápad… Vždyť jsou zde jiné programovací jazyky, kdde si takovouhle špinavou konstrukci může programátor zavést na svoje triko, a nemusí tím obtěžovat všechny ostatní uživatele toho jazyka. Java je v tomhle jiná, tam si nenadefinujete nové jiné operátory ani nové typy, a je to její vlastnost. Pokud má někdo potřebu tuhle vlastnost obcházet, asi zvolil špatný programovací jazyk.
Pak mi ale není jasné, proč kvůli tomu zavádět novou konstrukci do jazyka. Vždyť nečistěmožno je v tom sprisahanie výrobcov čistiacich prostriedkov
Pokud má někdo potřebu tuhle vlastnost obcházet, asi zvolil špatný programovací jazyk.obchádza sa nedokonalosť ... a že píšete zvolil špatne práve v tomto threade ...
Pokud by ta metoda stringToSuit byla součástí toho enum, a pokud by ty stringy ("CLUBS"...) byli definovány u jednotlivých položek, tak souhlas. Tohle není zapouzdřené.
Takhle nějak:
public enum Suit { CLUBS("CLUBS"), DIAMONDS("DIAMONDS"), HEARTS("HEARTS"), SPADES("SPADES") private String text; public Suit(String t) { text = t; } public String toString() { return text; } public Suit getSuit(String nieco) { switch (nieco) { case CLUBS.toString(): return CLUBS; case DIAMONDS.toString(): return DIAMONDS; case HEARTS.toString(): return HEARTS; case SPADES.toString(): return SPADES; } } };
public enum Suit { CLUBS("First"), DIAMONDS("Second"), HEARTS("Third"), SPADES("Fourth"); private String text; private Suit(String t) { text = t; } public String toString() { return text; } private static final Map<String, Suit> textMap; static { textMap = new HashMap<String, Suit>(Suit.values().length); for (Suit suit : Suit.values()) { textMap.put(suit.text, suit); } } public static Suit getSuit(String nieco) { return textMap.get(nieco); } }Má to jedinou nevýhodu – není tam tolik oblíbený switch, takže pokud do enumu přidám další položku, nemusím už rozšiřovat žádný převodní switch. Pokud si enumy pojmenujete rovnou tím významovým textem, nepotřebujete ani tu mapu a příslušnou metodu máte už rovnou v runtime knihovně:
public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES; public static Suit getSuit(String nieco) { //samozřejmě lze volat rovnou, není potřeba převolávací metoda return Suit.valueOf(nieco); } }Pokud kód, který chcete „switchovat“ souvisí spíše s enumem než se třídou, ve které by byl switch, můžete dokonce implementaci napsat přímo v enumu a switch tak úplně vynecháte.
Suit.valueOf(nieco)
Přiznám se, že o tomhle jsem nevěděl. Dřív, ještě než v javě enum vůbec nebyl, jsem si vytvářel třídy napodobující enum podobně jak jsem naznačil nahoře. Teď už chápu tvé rozhořčení. Holt na to nemám tolik času kolik bych si představoval.
switch
pro Stringy, nezná pořádně enum
Trida.properties.jmeno.getPropertyName()
, Trida.properties.jmeno.getGetter()
apod. To se sice dá obejít také pomocí enumů, ale chybí tam ta podpora kompilátoru.
list[12]
převede na list.get(12)
(nebo foo.bar = "spam"
na foo.getBar("spam")
). Jen to bude přehlednější.
A typedef, alias lokální jmenné prostory? No, každý, kdo někdy pracoval s kódem, kde se vyskytovalo třeba org.apache.xalan.xsltc.runtime.Node
a org.w3c.dom.Node
dohromady, by s tebou rozhodně nesouhlasil. Mít možnost si lokálně pojmenovat jednu třídu jako ApacheNode a druhou jako DomNode je k nezaplacení. Pochopitelně to nic nemění na tom, že třídy stále mají svoje kanonická jména, takže luštění podivných jmen nehrozí.
* a to nemluvím o tom, že termín OOP znamená - OOP je to, co za OOP označuje můj programovací jazyk.
typedef mi prijde jako hrozna opicarna. Prikaz import ma sva jasna specifika. Jak pri definici, tak pri vyvoji, bych stale musel davat pozor (stale cucet, jak je to v importu) na vlastni definovana jmena.používate špatné IDE
Navic to, ze v jedne tride pouzivam vice trid se stejnym nazvem, muze take znamenat 2 veci: 1. bud neumim OOP a vytvarim 1000 strankove tridy, 2. nebo do dane tridy cpu funkcnost, ktera do ni z konceptu nepatri.alebo človek používa neslnečné knižnice (presne ako v uvedenom príklad).
* je snad jasny koncept, jak se maji chovat objekty a jak se ma "cist" objektove orientovany kodv tomto jedinom máte pravdu, preto java nie je objektový jazyk
Navic, obcas se stava, ze dany setter ci getter neobsahuje jen nastaveni a vraceni, ale take nejake dalsi "potreby".V tom pripade doufam, ze to nepojmenovavas
getProperty()
...to bych te jako imaginarni uzivatel tveho API vlastnosrucne uskrtil vi
, ne-li ex
. Pak bych měl ale jednu dobrou radu – přestaňte požadovat syntaktický cukříček, a raději začněte používat nějaké normální IDE. Pohodlí při psaní kódu se zvýší několikanásobně víc, než kdybyste Javu pocukrovali celou.
Jak vypadá v IDE přečtení nějaké property? Napíšu jméno proměnné, tečku, get, zmáčknu Ctrl+mezerník a property si vyberu. Jak je její název dlouhý mne netrápí, protože si ho stejně nepamatuju a nepíšu ho, ale vyberu si ho ze seznamu. A jak by to vypadalo nově? Pořád chci číst property, napíšu jméno proměnné, tečku – a tím jsem skončil, nemám jak dát IDE najevo, že chci property ke čtení. Takže IDE mi vylistuje všechny fieldy, všechny metody, všechny properties (i ty jen pro zápis), a hledej. To je jednoznačně zhoršení proti současnému stavu. Samozřejmě, že je možné zavést v IDE nějakou novou klávesouvou zkartku, která mi vylistuje jenom properties ke čtení – jenomže to je potřeba se zase učit něco nového, v každém IDE to bude jinak… Takže k čemu má ten syntaktický cukr sloužit? Aby bylo psaní kódu pracnější?
Proč IDE.Protože IDE slouží k psaní. Zatímco zdrojový text ke čtení.
vim
, pak jsem to měnil na vi
, protože by byla urážka vimu tvrdit, že takovéhle základní věci neumí.
class Test { private String pozdrav; // zde je kurzor ... nyni Alt+Insert ... vyber pro setter, getter, obe, ci konstruktor s danym parametrem.. }Pro lidi, co si s Javou jen nehraji, ale pracuji s ni tak, ze je zivi musi takove veci prece znat. Pouziti IDE je naprosto samozrejma vec. Samotna code-completion neni jen na urovni java kodu, ale treba i na urovni jsp, jsf, xml, atd. Proste hromada pluginu + nejake ty zkusenosti. Osobne nevim, jak by fungovalo nasledujici:
class Test { public String pozdrav; } test.pozdrav; class Test { private property pozdrav; } test.pozdrav;Ma i IDE ukazovat co to prave je, co je ke cteni, co k zapisu? Co kdyz nekdo tvori tridy "Messenger" (napr. Point.x, Point.y)? To, ze nejaky jazyk ma neco, co Java nema, NEZNAMENA, ze je NUTNE to miti v Jave take.
To, ze nejaky jazyk ma neco, co Java nema, NEZNAMENA, ze je NUTNE to miti v Jave take.Zvlášť když je JVM otevřená dalším jazykům (třeba Groovy) – ať jsou klidně další jazyky které se budou kompilovat také do Java bytekódu, ať používají JVM, ať se klidně bytekód rozšíří o možnosti, které budou těmhle jazykům vyhovovat. V nějakém „skriptovacím“ nebo spíš prototypovacím jazyce, ať klidně jsou uzávěry, zkrácená definice hash-tabulek, property – ale přece to nemusí být všechno v jazyce Java, který prostě je postaven jinak. Vždyť by ten jazyk za chvíli vypadal, jako když pejsek a kočička vyřili dort. Jedno PHP už existuje a není potřeba ho vynalézat znovu… Já chápu, že je lákavé využít možností, které nabízí JVM a spousta javovských knihoven i pro lidi, kterým je bližší programování ve stylu různých mišmaš skriptovacích jazyků, ale to se lépe zařídí dalšími jazyky kompilovatelnými do JVM bajtkódu.
@Get
a @Set
. A to je (fanfára!) setter-based injection. Mít ve třídě X setterů jenom kvůli dependency injection je fakt ptákovina (a X klidně může být > 1, když jde o nějakou fasádu nebo jak se tomu říká). Stejně tak udržovat povětšinou prázdné gettery a settery aktuální, když přidávám a odebírám vlastnosti, je opruz (něco řeší refaktoringy, ale ne všechno).
Jediná nevýhoda, co mě napadá, je, že uživatel by volal getter, který ve zdrojovém kódu vlastně není. Ale to právě krásně řeší IDE IDE slouží k vývoji. Třeba čtení zdrojáků Javy s IDE je daleko pohodlnější a rychlejší, než jejich čtení obecným editorem a správcem souborů.Ale jistě. Beru zpět IDE slouží k psaní, chtěl jsem říct k psaní slouží IDE. Je mi jasné, že krom toho taky k řadě dalších věcí.
HashMap
, TreeMap
nebo třeba ConcurrentHashMap
nebo co vlastně Samozřejmě, celý je to polovičatý, lepší by bylo dát prostředky jak dělat takové věci přímo do jazyka, ne jenom vyřešit pár nejbolavějších případů, i když i to je lepší než nic.K čemu by bylo dobré udělat z Javy druhé C++?
Já myslím že byl míněn LISPSamozřejmě, celý je to polovičatý, lepší by bylo dát prostředky jak dělat takové věci přímo do jazyka, ne jenom vyřešit pár nejbolavějších případů, i když i to je lepší než nic.K čemu by bylo dobré udělat z Javy druhé C++?
Neumožňuje pracovat bez používání typů nebo datových struktur, jako to umožňují skriptovací jazyky.
List foo = new ArrayList(); foo.add((Object)bar);Tak tomu já práce s použitím typů (spíše tříd, Java práci s typy nemá) neříkám. Object v Javě je ekvivalentem void* v C/C++ a jako takové by mělo být používáno výjimečně a ne pro práci s kolekcemi. Právě generika posilují typovou kontrolu, což je v případě Javy jednoznačně žádoucí i s ohledem na filozofii a určení jazyka. BTW: [] a properties jsou navrhovány pro zjednodušení jazyka. Nechápu, jak by mohly v konečném důsledku znamenat jeho zesložitění. Při rozumné implementaci za pomoci anotací není třeba dělat velké změny a sémantika nových i stávajících operací zůstane naprosto stejná. Ano, Perl a jeho 10 způsobů, jak udělat jednu věc je odstrašující, ale ani v Javě si na akademickou eleganci a ortogonalitu jazyka stejně nehrajeme
Právě generika posilují typovou kontrolu, což je v případě Javy jednoznačně žádoucí i s ohledem na filozofii a určení jazyka.Hmm, posilují? Asi tak, jako ji dříve posilovala kovariantně parametrizovaná pole?
Tak tomu já práce s použitím typů (spíše tříd, Java práci s typy nemá) neříkám. Object v Javě je ekvivalentem void* v C/C++ a jako takové by mělo být používáno výjimečně a ne pro práci s kolekcemi. Právě generika posilují typovou kontrolu, což je v případě Javy jednoznačně žádoucí i s ohledem na filozofii a určení jazyka.Ano, generika posilují typovou kontrolu a Java je lepší s nimi než bez nich. Ale nepodařilo se je do Javy implementovat tak, aby vypadala jako její „přirozená“ součást – vizte například nekompatibilitu generik a polí nebo neexistenci reflexe. Myslím, že v tomto směru bylo obětováno zpětné kompatibilitě bajtkódu příliš mnoho.
BTW: [] a properties jsou navrhovány pro zjednodušení jazyka. Nechápu, jak by mohly v konečném důsledku znamenat jeho zesložitění.To, co bylo zmíněno v anketě v souvislosti s properties není žádné zjednodušení. Property declaration je jednoduše znovu zavádění atributů tříd do jazyka, který atributy tříd už má. Jenomže o atributech tříd si každý v souvislosti s Javou přečte, že se nemají používat, protože zapouzdření. Tak se vymyslí znovu to samé, ale bude se tomu říkat jinak. To je opravdu vynález… A property access jednak zhoršuje možnost nápovědy IDE, jednak je zaměnitelné s přístupem k atributům tříd. Takže nově by musel programátor každého přiřazení kontrolovat, zda jde o property nebo field, a v případě, že jde o property, očekávat různé výjimky – ať už PropertyVetoException, nebo nějaké obecné; a také další záludnosti spojené s voláním metod – zámky, synchronizaci… Opravdu nevidím důvod, proč před programátorem skrývat, že volá metodu, když z toho nemá žádný prospěch – jméno té metody a závorky stejně doplní IDE, takže nemá smysl se bavit o tom, jestli to ušetří dva znaky.
+=
a -=
jsou definovány jenom pro některé primitivní typy a += pro String, pro objekty nejsou definovány.
Ano, teoreticky by opravdu bylo možné Javu rozšířit o vícenásobnou dědičnost, přetěžování operátorů, makra, šablony – ale není už jazyků, které tohle umí, dost? Mně to pořád připadá, jako by si někdo stěžoval, že příkaz cat
by vlastně měl mít aspoň řádkový editot textu, no samo o sobě by to vlastně nedávalo moc smysl, ale kdyby se k tomu přidělal i celoobrazovkový editor, podpora externích příkazů, maker, klávesových zkratek – a pak už by z cat
u byl konečně pořádný editor.
Takže stejně, jako se cat
blbě používá jako textový editor, bagr se těžko používá jako vozidlo pro dopravu osob, tak se i Java blbě používá jako jazyk pro programy, kde je potřeba vícenásobná dědičnost, šablony a přetěžování operátorů. Akorát mám pořád neodbytný pocit, že to není problém Javy, ale těch, kteří se jí pokoušejí takhle používat. Co je vede k tomu, že chtějí používat zrovna Javu? To má tak líbivý název, nebo čím to je?
Ano, teoreticky by opravdu bylo možné Javu rozšířit o vícenásobnou dědičnost, přetěžování operátorů, makra, šablony – ale není už jazyků, které tohle umí, dost?
... java nie sú len desktop/server obludy, java to je aj java ME. Tam už ľudia javu nútený používať sú.
ok, pre ilustráciu, zaveďme do javy hypotetický operátor .=
object.a (1).b (2).c .= method (); // vo význame object.a (1).b (2).c = object.a (1).b (2).c.method ()
class Foo { protected int bar; @Property public int getBar() { return this.bar; } @Property public void setBar(value) { this.bar = bar; } } // ... Foo foo = new Foo(); foo.bar = "a";To, co bylo popsáno na javapolis je divné. Ale já bych šel ještě dál a public u členských prvků tříd úplně zakázal
@Since(1.5)
by mi vytrhlo trn z paty BTW: ale úplně nejvíc mi chybí dopředná kompatibilita knihoven. Pokud potřebuji kód přeložit s novější verzi JDK, musím obvykle doplnit nové metody, které přibyly do rozhraní jenom proto, aby to šlo zkompilovat. Parametry source a target tohle vůbec neovlivňují. Takové @Since(1.5) by mi vytrhlo trn z patyProtože
source
a target
ovlivňují jenom verzi jazyka, ale ne verzi runtime knihovny, proti které se kompiluje (což je trochu zvláštní, a nakonec jsou proto tyhle parametry k ničemu).
Podle mne to ale není problém ani knihoven, ani jazyka, ale toho, že se upravují rozhraní (v runtime knihovně), místo aby se oddědilo rozhraní nové. Osobně jsem to zaregistroval jenom u XML DOMu, ale když jsem to tenkrát zjistil, měl jsem pro autory té úpravy rozhraní jenom samá nepublikovatelná jména.
Pri procitani vysledku z javapolis, jsem zacal premyslet o tom, zda dane featury do javy skutecne chci, ci nikoli.Ako clovek, co v Jave programuje takmer denne, mozem povedat, ze NASTASTIE to, co v Jave bude a co nie h...o zalezi od toho, co sa pise v Tvojom blogu a v desiatkach podobnych na celom svete. Podobne blogy neobsahuju nic viac a nic menej ako "own truth" ich autora.
Javová aplikace je fakt hroznej balastMyslis tim i AbcLinuxu? To by se Leosovi taky nemuselo libit ...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.