jsou nulové odkazy opravdu špatné?
<p>slyšel jsem, že je řečeno, že zahrnutí nulových referencí do programovacích jazyků je „miliardová chyba dolaru“. ale proč? jistě, mohou způsobit výjimky nullreferenceexception, ale co? při nesprávném použití může být zdrojem chyb jakýkoli prvek jazyka.</p><p>a jaká je alternativa? předpokládám, že místo toho říkám:</p><pre class="lang-cs prettyprint-override"><code>customer c = customer.getbylastname("goodman"); // returns null if not found if (c != null) { console.writeline(c.firstname + " " + c.lastname + " is awesome!"); } else { console.writeline("there was no customer named goodman. how lame!"); } </code></pre><p>dalo by se to říct:</p><pre class="lang-cs prettyprint-override"><code>if (customer.existswithlastname("goodman")) { customer c = customer.getbylastname("goodman") // throws error if not found console.writeline(c.firstname + " " + c.lastname + " is awesome!"); } else { console.writeline("there was no customer named goodman. how lame!"); } </code></pre><p>ale jak je to lepší? v každém případě, pokud zapomenete ověřit, že zákazník existuje, získáte výjimku.</p><p>předpokládám, že customernotfoundexception je trochu snazší ladit než nullreferenceexception, protože je popisnější. je to všechno?</p>
<h2>null je zlé</h2><p>na infoq je prezentace na toto téma: <strong> <a href="http://www.infoq.com/presentations/null-references-the-billion-dollar-mistake-tony-hoare">null reference: the billion dollar mistake</a> </strong> by <em> tony hoare</em></p><h2>typ volby</h2><p>alternativou k funkčnímu programování je použití <a href="http://en.wikipedia.org/wiki/option\_type">typ volby</a> , který může obsahovat <code>some value</code> nebo <code>none</code>.</p><p>dobrý článek <strong> <a href="http://www.codecommit.com/blog/scala/the-option-pattern">vzor „option“</a> </strong>, který diskutuje typ možnosti a poskytuje jeho implementaci pro javu.</p><p>našel jsem také hlášení o chybě java o tomto problému: <a href="http://bugs.sun.com/bugdatabase/view\_bug.do?bug\_id=5030232">přidat pěkné typy možností do java, aby se zabránilo nullpointerexceptions</a> . <a href="https://docs.oracle.com/javase/8/docs/api/java/util/optional.html">požadovaná funkce</a> byl představen v java 8.</p>
Nejlepší vysvětlení jsem viděl, je v kapitole 7 volných [Základy programování e-knihy](http://codebetter.com/karlseguin/2008/06/25/foundations-of-programming-ebook/) .


Zjednodušeně řečeno, v **.NET** dochází k nevracení paměti při odkazované objekty kořeny, a proto nemůže být uvolněna. K tomu dochází náhodně, když se držet na referencí mimo zamýšlený rozsah.


Budete vědět, že máte úniky, když začnete dostat OutOfMemoryExceptions nebo vaše využití paměti stoupá rámec toho, co byste očekávali ( **PerfMon** má pěkné čítače paměti).


Pochopení **.NET** model paměti je, je nejlepší způsob, jak se vyhnout to. Konkrétně pochopení toho, jak garbage collector funguje a jak reference práce - opět odkazuji na kapitolu 7 e-knihy. Také mějte na paměti společných úskalí, pravděpodobně nejvíce obyčejné jsoucí události. Pokud objekt je registrována k události na objekt **B** , pak objekt **A** bude držet kolem, dokud objekt **B** zmizí, protože **B** uchovává odkaz . Řešením je zrušení registrace na akce, když budete hotovi.


Samozřejmě, dobrý profil paměť vám umožní vidět vaše objektů grafy a prozkoumat hnízdění / odkazování svých objektů, které mají zjistit, kde reference přicházejí a co kořenový objekt je zodpovědný ( [red-gate mravenci profil](http://www.red-gate.com/products/ants_memory_profiler/index.htm) , JetBrains dotMemory, [memprofiler](http://memprofiler.com/) jsou opravdu dobré volby, nebo můžete použít pouze text **WinDbg** a **SOS** , ale já bych důrazně doporučujeme obchodní / vizuální produkt, pokud jste opravdový guru).


Věřím, že neřízený kód je předmětem jeho typické úniky paměti, že kromě sdílené odkazy jsou řízeny garbage collector. Možná se mýlím o tomto posledním bodě. Jak stránka vypadá, je jedno. Ta stránka má nějaký zdrojový kód, tak ho prostuduj. Nebo požádej někoho, kdo aspoň ví, o čem je řeč. Promin, ale pokud si nedokazes najit na Internetu nebo v dokumentaci, jak se ve slovniku obrati klice a hodnoty, tak nemas s programovani sanci.Nic ve zlem, ale cely domaci ukol za tebe nikdo resit nebude. Musis ukazat alespon trochu vlastni snahy. s3icc0 Ti to napsal dobře, ale nenapsal sem celý vzorec. Já jsem aspoň zase o funkci nepřímý odkaz chytřejší :) Konto, ruble, platba, PC poradna, špatně. Už jsi zkusil ten linux??Přece nebudeš něco reklamovat/opravovat pokud nevíš že je to vadné....![](/Client.Images/smileys/7.gif) Nekupuj shity protože zadný iny nenajdeš máš smulu vyber si něco lepšího ne za jednu korunu kámo to se vyplati ![](/Client.Images/smileys/10.gif)![](/Client.Images/smileys/10.gif) 1. Hledáš problémy, kde nejsou.2. Hledáš problémy, kde nejsou.Normálně to používej a neřeš blbosti. Pokud se potřebuješ ptát zda se ti to bude hodit, tak je jednoduchá odpověď: NE, nebude.Programování není něco co se naučíš za pár měsíců a pak už budeš umět programovat. Tohle je záležitost na celý život. Programování se stále vyvíjí a jsou tu nové metody/postupy jak programovat. Je potřebné se neustále učit něco nového. Protože je to běh na dlouhou trať tak to chce mít nějakou motivaci proč to děláš. Nejlépe aby jsi z toho měl nějaký vlastní užitek. Co já jsem si tak pro sebe programoval, tak byly různé automatizace a strojové konverze/porovnávání atd. Například co si vzpomínám, tak jsem měl k filmům titulky. A potřeboval jsem všechny titulky pojmenovat stejně jako ten film, aby se automaticky načítali do přehrávače. A měl jsem na disku vždy ve složce video a titulky. A než abych hledal něco co mi to přejmenuje, tak jsem si napsal prográmek co prošel zadanou složku s filmama, a v každé složce našel dva soubory a ten menší soubor pojmenoval podle toho většího souboru. A měl jsem hotovo. Nebo třeba když jsem potřeboval hromadně v souboru na každém druhém řádku dopsat 0 na 7mou pozici. Nebo třeba když jsem chtěl projít nějaký web a proklikat ho celý a stáhnout tam odtud všechny obrázky atd. Když si teda najdeš něco kde by jsi to využil tak budeš rád že to umíš. Už nebudeš muset hodiny hledat aplikaci, která bude umět to co chceš, ale za půl hodinky si tu aplikaci uděláš sám.Pokud by jsi to chtěl na nějaký přivýdělek, tak to možná ano, ale nejdřív to chce produkovat prográmky co fungují a alespoň nepadají. Tj budeš tam mít ošetřené všechny chybové stavy. Tj od toho, že pokud ti má uživatel zadat číslo od 1 do 10, tak musíš být připravený, že zadá opravdu číslo od 1 do 10, ale on taky může zadat 0 nebo 15, nebo třeba -4. A co hůř on ti třeba nemusí zadat nic, a nebo ti zadá nějaké písmeno atd. Na nic z tohoto by aplikace neměla spadnout. Měla by alespoň vypsat chybu, že je uživatel blb a nezadal správnou hodnotu. Nebo třeba když budeš… načítat soubory z disku, tak uživatel nemusí mít právo ten soubor číst, nebo do něj zapisovat atd. A ani na tomhle by to nemělo padnout. A to mi věř tohle se naučit ti bude trvat asi mnohem déle než těch několik měsíců. Chtít peníze za něco co funguje jen v případě že je to správně použito a jinak to padne bez nějaké smysluplné hlášky, kdy uživatel ani neví co udělal blbě, mi přijde celkem nefér a podruhé si od tebe už nikdo nic nenechá udělat. [Ukázat celý příspěvek](javascript:void(0)) <p>k tomu je užitečný zabudovaný <code>type</code>. to vám nejen řekne o aliasech, ale také o funkcích, vestavěných slovech, klíčových slovech a externích příkazech.</p><pre class="lang-none prettyprint-override"><code>$ type ls ls is aliased to `ls --color=auto' $ type rm rm is /bin/rm $ type cd cd is a shell builtin $ type psgrep psgrep is a function psgrep () { ps -ef | { read -r; printf '%s\n' "$reply"; grep --color=auto "$@" } } </code></pre><p><code>type -a cmd</code> zobrazí všechny příkazy pod tímto jménem v pořadí podle priority, což je užitečné pro výše uvedený alias <code>ls</code>, kde alias sám volá <code>ls</code>.</p><pre class="lang-none prettyprint-override"><code>$ type -a ls ls is aliased to `ls --color=auto' ls is /bin/ls </code></pre><p>to vám řekne, že když spustíte <code>ls</code>, <code>/bin/ls</code> bude použito a <code>--color=auto</code> bude zahrnut do seznamu argumentů, kromě všech ostatních, které sami přidáte.</p>