Alex Ellis upozornil 15. března, že firma Docker se chystala zrušit bezplatný hosting open-source projektů na Docker Hubu. Po vlně odporu se představitelé firmy omluvili a posléze byl původní záměr odvolán.
Ve věku 94 let zemřel Gordon Moore, mj. spoluzakladatel společnosti Intel a autor Moorova zákona.
Mercurial (Wikipedie), software pro SCM (Source Code Management), byl vydán ve verzi 6.4. Přehled novinek v poznámkách k vydání. Ve dnech 5. až 7. dubna proběhne konference Mercurial Paris.
Byly rozdány Ceny Velkého bratra (Big Brother Awards) za rok 2022 pro největší slídily pořádané nevládní organizací Iuridicum Remedium. Dlouhodobý slídil: Microsoft. Firemní slídil: Seznam. Úřední slídil: Nejvyšší správní soud. Výrok Velkého bratra: Marian Jurečka. Pozitivní cena: NoLog.
Byla představena online vzdělávací platforma Ada Computer Science pro učitele, studenty a kohokoli, kdo se zajímá o informatiku. Stojí za ní Raspberry Pi Foundation a Univerzita v Cambridgi.
GitHub má nový RSA SSH klíč. Předchozí soukromý klíč byl krátce vystaven na GitHubu.
Společnost Framework Computer představila (YouTube) nové modulární notebooky: Laptop 13 s Intel Core nebo AMD Ryzen a Laptop 16 (YouTube).
Bylo vydáno Ubuntu 20.04.6 LTS, tj. šesté opravné vydání Ubuntu 20.04 LTS s kódovým názvem Focal Fossa. Přehled novinek v poznámkách k vydání a v přehledu změn.
Připojit neznámý USB flash disk do počítače může být nebezpečné. Dokonce může jít i o život. Někdo rozeslal ekvádorským novinářům USB flash disky, které po připojení do počítače explodují [BBC, Twitter].
Byla vydána nová verze 7.4 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu.
Řešení dotazu:
java.lang.Comparable
a java.util.Comparator
. Pro programování v Javě je vůbec vhodné přečíst si JavaDoc k často používaným balíkům (java.lang, java.util, java.io, java.text) a alespoň anotaci všech tříd v těchto balíkách, abyste měl přehled aspoň o tom základním, co vám runtime knihovna Javy poskytuje.
java.lang.Comparable
, najdete tam, že implementace této třídy je právě ono „přirozené řazení“ – a o tom se píše v zadání.
return jmeno.compareToIgnoreCase(jmeno2)
.
Propiska
. Lepší je použít generika, pak to za vás pohlídá kompilátor, pak ale stejně potřebujete udělat test na null
.
Za čtvrté, stav by měl být zřejmě výčtový typ (enum
).
Za páté, soustava tolika do sebe vnořených if
ů by ve vás vždy měla vyvolat podezření, že je na tom kód něco špatně. Zkusil bych třeba tohle:
if (other == null) { return -1; } assert this.nazevFirmy != null; int result = this.nazevFirmy.compareTo(other.nazevFirmy); if (result != 0) { return result; } assert this.barva != null; result = this.barva.compareTo(other.barva); if (result != 0) { return result; } assert this.barvaPisma != null; result = this.barvaPisma.compareTo(other.barvaPisma); if (result != 0) { return result; } assert this.stav != null; result = this.stav.compareTo(other.stav); return result;
int result = 0; if (this.nazevFirmy != null) { result = this.nazevFirmy.compareTo(other.nazevFirmy); } else if (other.nazevFirmy != null) { result = 1; } if (result != 0) { return result; } ...nebo kompaktněji
int result = (this.nazevFirmy != null) ? this.nazevFirmy.compareTo(other.nazevFirmy) : (other.nazevFirmy != null) ? 1 : 0;
assert
y jsou přesně podle původního kódu (který nepředpokládal null
ové hodnoty), jenom v tom původním kódu chyběly. Pokud tam prázdné hodnoty mohou být, pak je samozřejmě nutné s nimi počítat.
assert
em (a příslušně zdokumentován v JavaDocu).
assert
ů je kontrakt metody takový, že nemá žádné požadavky na vstupní parametry, a v té metodě je chyba – neošetřený případ, kdy některá z hodnot bude prázdná. Pokud někdo tuto metodu zavolá na objekt s prázdnou hodnotou, dojde k výjimce, a je to chyba programátora této metody.
Pokud se použijí assert
y (a zdokumentuje se to v JavaDocu, kompilátor zatím s assert
y pracovat neumí), je součástí kontraktu metody to, že hodnoty nejsou prázdné. Pokud někdo zavolá metodu na objekt s prázdnými hodnotami, je to chyba volajícího. Některé budoucí verze kompilátorů snad budou umět na takové chyby upozornit už v době překladu.
@Null
a @NotNull
). Ale je potřeba si uvědomit, kdy se asserty do Javy přidaly.
assert
jenom syntaktický cukr místo
if (Boolean.getBoolean("assertion.enabled") && !(expr)) { throw new AssertionError(…); }? K čemu by bylo dobré něco takového do jazyka zavádět?
v té metodě je chyba – neošetřený případ, kdy některá z hodnot bude prázdnáJenže ve Vašem případě je ten případ stejně špatně/dobře ošetřen. Buď null je platná hodnota, a pak se to může řešit extra porovnáním tak, jak jsem navrhoval. A nebo null platná hodnota není. A v případě vstupu neplatné hodnoty se vyhazuje výjimka. A je už jen na úzusu jestli vyhodíte NPE nebo jinou, akorát že kvůli NPE nemusíte psát další řádky kódu, čímžto má marginální výhodu. Pokud chcete něco dokumentovat, můžete napsat do dokumentace jednu větu: žádné z polí nesmí být null. Slabé povahy takový guard ještě můžou chtít vynutit v konstruktoru/setteru jak jsem řekl.
int
budete cpát String
, taky dostanete za běhu výjimku – ale je snaha to odchytit dřív, konkrétně tohle už v době kompilace. assert
má stejný význam, akorát současné kompilátory asserty nijak nekontrolují. Na produkčním prostředí můžete mít assert vypnutý a kód může normálně projít (ne tento konkrétně, ale jiný kód chráněný assertem).
A v případě vstupu neplatné hodnoty se vyhazuje výjimka.Jenže je podstatné, jestli programátor tu neplatnou hodnotu kontroluje, nebo jestli si dá jako podmínku, že na vstupu neplatná hodnota nesmí být, a pak už ji nekontroluje. Test s
if
em a vyhozením výjimky je první případ, assert
nebo třeba deklarace typů parametrů metody je druhý případ – programátor hodnoty na vstupu nekontroluje a předpokládá že jsou správně. A deklarovaný typ nebo assert jsou jen nápověda pro nástroje, které tuhle kontrolu udělají za programátora, který danou metodu využívá – přičemž u deklarace typu parametru tu kontrolu umí udělat už kompilátor, u assertů to udělat (zatím) neumí a je to ponecháno až na JVM.
Potíž je ale v tom, co říkáte, totiž že toto vlastnost jazyka není.Není to vlastnost současných kompilátorů, vlastnost jazyka to je od verze 1.4. Problém assertů v Javě je ten, že jsou tak obecné, že kompilátor nemůže umět vyhodnotit všechny možné případy. Ale nenulovost by umět vyhodnocovat mohl. A možná to už i nějaké nástroje na statickou kontrolu kódu dělají. Ani kompilátor od Sunu ve všem neodpovídá plně specifikaci Javy (tj. že by využíval všechny možnosti dané jazykem) – třeba takovou anotaci
@SuppressWarnings
jednapětkový kompilátor od Sunu ignoroval, přestože byla součástí runtime knihovny (a u Javy se rozdíl mezi jazykem a runtime knihovnou stírá).
Tudíž je momentálně uvedený assert ekvivalentem testu s NPE a je momentálně zbytečné ho používat.Funkčně ano, ale sémanticky to ekvivalentní není. Souhlasím s vámi, že dnes není prakticky rozdíl*) v chování aplikace když použiju
assert
nebo klasický if
a vyhození výjimky. Ale význam toho kódu je odlišný a je podle mne škoda se toho významového rozdílu zbavovat.
*) samozřejmě až na to, že s vypnutými assertions je instrukce assert
ekvivalentní prázdné instrukci, takže se ušetří provedení pár instrukcí.
Čistě syntakticky by ale bylo lepší aby guardy parametrů byly u jejich deklarace a ne někde v těle funkce.Ano, to jsem psal a zmiňoval jsem anotace, které ovšem v Javě 1.4, kde byly zavedeny asserty, nebyly.
Problém assertů v Javě je ten, že jsou tak obecné, že kompilátor nemůže umět vyhodnotit všechny možné případy.No, ano. A tudíž je to z hlediska detekce při kompilaci k ničemu. Kdyby raději vzali ten jeden případ a dotáhli ho do dokonalosti. Java má vůbec zajímavou historii pokusů a omylů.
Ano, to jsem psal a zmiňoval jsem anotace, které ovšem v Javě 1.4, kde byly zavedeny asserty, nebyly.Anotace mi přijdou jako takový úlet kde se kompenzují všechny problémy, které by se měly řešit jinde. Druhý úlet podobného rázu je pak "programování v snippetech", jak to dovolují "moderní IDE".
Ne opravdu to neni vlastnost jazyka od verze 1.4. Je presne definovano, co aserce jsouDoporučuju přečíst si ten dokument, který jste odkazoval.
rozhodne nejsou urcene ke kontrole nejakych invariantu behem prekladu.To jsem taky nikde nepsal, já jsem psal o vývoji.
Sam asercim fandim, ale napriklad vyse uvadene umisteni aserce tesne pred radek, na kterem pri poruseni aserce ihned dojde k NPE, postrada smysl. … Aserce si precte pouze programator a ten by mel tak jako tak videt, ze na pristim radku dojde k NPEPředpoklady je nutné do kódu napsat hned, když se píše – až ten jednoduchý kód na dva řádky natáhnete na deset řádků, už nikoho nenapadne
assert
tam doplňovat. Stejně tak to nikoho nenapadne v okamžiku, kdy přístup přes členskou proměnnou nahradí voláním metody a možnost vyhození NPE přestane být tak zjevná.
assert
v kódu zároveň znamená něco jako komentář „vím o tom, že tahle podmínka musí být splněna“. Takže když budu číst výše uvedený kód bez assertů, budu muset začít hledat, jestli ty hodnoty opravdu nemohou být prázdné, nebo jestli je v tom příslušném kódu chyba, nebo jestli je záměr vyhazovat NPE (a chybí to třeba v dokumentaci). Když je tam assert
napsaný, vím, že neřešení prázdných hodnot byl autorův záměr.
Takže když budu čísta
strojové zpracováníjsou dvě různé věci. A já pro lidi píšu lidsky a už jsme si ujasnili, že asserty jsou strojově momentálně na prd. A když už mluvíme o strojovém zpracování tak si dovolím ještě dvě poznámky. Za prvé proboha proč musím do JavaDocu opisovat jména parametrů (případně jejich typy), když to v zápětí píšu do deklarace. Vemte si příklad z perlovského Getopt::Euclid. Za druhé divil byste se co všechno lze relativně spolehlivě stojove zpracovat. Bylo by stokrát příjemnější kdybych mohl psát "jméno nesmí být null" do komentáře a dostal z toho varování překladače, pokud tam někde budu cpát null, než abych strkal na dvacet míst kódu nějaké kryptogramy a počítač mi je překládal do češtiny.
už jsme si ujasnili, že asserty jsou strojově momentálně na prdPokud váš kód nikdy nespouštíte. Pokud jej spouštíte například v testech, můžete spoustu porušení kontraktu odhalit už během testů. A i když se na chybu přijde až během normálního testování, pořád assert pomůže najít skutečné místo vzniku chyby (zatímco když necháte program běžet dál, může někdy spadnout až za dost dlouho, a původní příčinu pak budete dlouho hledat).
assert
pre mna okrem ineho aj indikator kvality kodu. Zatial co uplnu nepritomnost assertov nehodnotim nijako -- niektori ho proste pausalne nepuzivaju -- zriedkave pouztie assertov v zriedkavych koplikovanych castiach kodu hodnotim ako pozitivnu snahu programatora zaviest prisnejsiu kontrolu seba sameho. Ak je vsak kod prepchaty assertami, vidim to ako varovny signal, ze autor nebol schopny urobit natolko robustny dizajn, aby mu vobec sam doveroval.
Tiskni
Sdílej: