<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Praktický API Design</title>
	<atom:link href="http://blog.krecan.net/2009/04/11/prakticky-api-design/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.krecan.net/2009/04/11/prakticky-api-design/</link>
	<description>Short remarks from Java world</description>
	<lastBuildDate>Sat, 04 Feb 2012 09:44:38 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>By: Jaroslav Tulach</title>
		<link>http://blog.krecan.net/2009/04/11/prakticky-api-design/comment-page-1/#comment-932</link>
		<dc:creator>Jaroslav Tulach</dc:creator>
		<pubDate>Fri, 17 Apr 2009 20:03:53 +0000</pubDate>
		<guid isPermaLink="false">http://blog.krecan.net/?p=350#comment-932</guid>
		<description>Jé, první recenze, kterou vidím v češtině. Díky. Jsem rád, že tu můžu psát česky, a tak tu nechám pár komentářů.

Každého, kdo četl tu knížku, zaujme něco jiného. Dělám si svoji malou hitparádu a jsem rád, že jste si vybral tu jednoznačnost přístupových modifikátorů. To je má oblíbená kategorie. Vypovídá dost o rozdílu různých pohledů na svět. Co vypadá smysluplně pro normální OOP, má ve světě API zvláštní konsekvence.

Co se týká těch velmi diskutovaných referencí. Tak nejdůležitější, co jsem chtěl říci je, že jsou součástí API. Je rozdíl mezi tím jestli jsou normální či &quot;weak&quot;. A samozřejmě souhlasím, že konzistence je důležitá a když už se v JavaBeans specifikaci rozhodli pro normální referenci (oni tedy museli, v té době jiná nebyla), tak by se to mělo obvykle dodržovat.

Nakonec mohu jen dodat, že se zdá, že skutečně existují různé programovací světy. Ne každý nutně píše API pro obecné použití. Téměř každý pracující v týmu však alespoň dává API svým kolegům. Jednou jsem to rozebíral s bratrancem, který se také tvářil, že píše &quot;napiš, vyhoď a přepiš&quot; aplikace pro koncové uživatele. Nakonec však stejně sám rád musel přiznat, že má část kódu, kterou využívá znovu a znovu a u níž dodržuje kompatibilitu.

Hodně štěstí při psaní API a dík za recenzi.</description>
		<content:encoded><![CDATA[<p>Jé, první recenze, kterou vidím v češtině. Díky. Jsem rád, že tu můžu psát česky, a tak tu nechám pár komentářů.</p>
<p>Každého, kdo četl tu knížku, zaujme něco jiného. Dělám si svoji malou hitparádu a jsem rád, že jste si vybral tu jednoznačnost přístupových modifikátorů. To je má oblíbená kategorie. Vypovídá dost o rozdílu různých pohledů na svět. Co vypadá smysluplně pro normální OOP, má ve světě API zvláštní konsekvence.</p>
<p>Co se týká těch velmi diskutovaných referencí. Tak nejdůležitější, co jsem chtěl říci je, že jsou součástí API. Je rozdíl mezi tím jestli jsou normální či "weak". A samozřejmě souhlasím, že konzistence je důležitá a když už se v JavaBeans specifikaci rozhodli pro normální referenci (oni tedy museli, v té době jiná nebyla), tak by se to mělo obvykle dodržovat.</p>
<p>Nakonec mohu jen dodat, že se zdá, že skutečně existují různé programovací světy. Ne každý nutně píše API pro obecné použití. Téměř každý pracující v týmu však alespoň dává API svým kolegům. Jednou jsem to rozebíral s bratrancem, který se také tvářil, že píše "napiš, vyhoď a přepiš" aplikace pro koncové uživatele. Nakonec však stejně sám rád musel přiznat, že má část kódu, kterou využívá znovu a znovu a u níž dodržuje kompatibilitu.</p>
<p>Hodně štěstí při psaní API a dík za recenzi.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: v6ak</title>
		<link>http://blog.krecan.net/2009/04/11/prakticky-api-design/comment-page-1/#comment-930</link>
		<dc:creator>v6ak</dc:creator>
		<pubDate>Wed, 15 Apr 2009 19:23:31 +0000</pubDate>
		<guid isPermaLink="false">http://blog.krecan.net/?p=350#comment-930</guid>
		<description>Ještě dodán jednu věc, na kterou jsem minule zapomněl: samozřejmě, je je možné úklid zavěsit na určitou událost, třeba volání listenerů. To ale znamená, že pokud by listenery často přibývaly a ubývaly, zůstalo by tu mnoho takového plevelu. Asi by to nebylo kritické, ale je to další problém slabých listenerů.
Samotný koncept slabých listenerů mě napadl nezávisle, ale jednoduše dělá víc problémů než řeší.</description>
		<content:encoded><![CDATA[<p>Ještě dodán jednu věc, na kterou jsem minule zapomněl: samozřejmě, je je možné úklid zavěsit na určitou událost, třeba volání listenerů. To ale znamená, že pokud by listenery často přibývaly a ubývaly, zůstalo by tu mnoho takového plevelu. Asi by to nebylo kritické, ale je to další problém slabých listenerů.<br />
Samotný koncept slabých listenerů mě napadl nezávisle, ale jednoduše dělá víc problémů než řeší.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ariel</title>
		<link>http://blog.krecan.net/2009/04/11/prakticky-api-design/comment-page-1/#comment-925</link>
		<dc:creator>Ariel</dc:creator>
		<pubDate>Tue, 14 Apr 2009 08:00:54 +0000</pubDate>
		<guid isPermaLink="false">http://blog.krecan.net/?p=350#comment-925</guid>
		<description>Filip Jirsák to píše velmi správně.

Je tu ale jeden VELKÝ problém: Návrhový vzor Listener (Observer) je zvykem v Javě implementovat BEZ weak-refů. A ve chvíli, kdy je určitý zvyk, je nutné ho dodržet při návrhu API, i kdyby to byl zvyk hloupý. Bohužel to tak je a tím pádem mi nezbývá nic jiného než říct: Listenery by měly být (za normálních okolností) drženy klasickými referencemi (pokud ne, musíte to VÝRAZNĚ zdokumentovat).
Když totiž zaregistrujete listener na JButton pomocí anonymní vnitřní třídy (což se běžně dělá) a ten listener by byl držen Weak-refem, při nejbližším GC by se to uvolnilo a program by se vám choval dost divně.

Co naděláme, je takový zvyk, takže správné API má být podle zvyklostí. Žádné Weak-reference bych tedy nedoporučovala...</description>
		<content:encoded><![CDATA[<p>Filip Jirsák to píše velmi správně.</p>
<p>Je tu ale jeden VELKÝ problém: Návrhový vzor Listener (Observer) je zvykem v Javě implementovat BEZ weak-refů. A ve chvíli, kdy je určitý zvyk, je nutné ho dodržet při návrhu API, i kdyby to byl zvyk hloupý. Bohužel to tak je a tím pádem mi nezbývá nic jiného než říct: Listenery by měly být (za normálních okolností) drženy klasickými referencemi (pokud ne, musíte to VÝRAZNĚ zdokumentovat).<br />
Když totiž zaregistrujete listener na JButton pomocí anonymní vnitřní třídy (což se běžně dělá) a ten listener by byl držen Weak-refem, při nejbližším GC by se to uvolnilo a program by se vám choval dost divně.</p>
<p>Co naděláme, je takový zvyk, takže správné API má být podle zvyklostí. Žádné Weak-reference bych tedy nedoporučovala...</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: v6ak</title>
		<link>http://blog.krecan.net/2009/04/11/prakticky-api-design/comment-page-1/#comment-924</link>
		<dc:creator>v6ak</dc:creator>
		<pubDate>Tue, 14 Apr 2009 07:49:19 +0000</pubDate>
		<guid isPermaLink="false">http://blog.krecan.net/?p=350#comment-924</guid>
		<description>Něco na tom bude, ale:
1. Co když z nějakého důvodu chci mít listener se stejnou životností jako daný objekt?
2. Pak by bylo dobré udělat debug výstup při takovémto odstranění.</description>
		<content:encoded><![CDATA[<p>Něco na tom bude, ale:<br />
1. Co když z nějakého důvodu chci mít listener se stejnou životností jako daný objekt?<br />
2. Pak by bylo dobré udělat debug výstup při takovémto odstranění.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ladislav Thon</title>
		<link>http://blog.krecan.net/2009/04/11/prakticky-api-design/comment-page-1/#comment-923</link>
		<dc:creator>Ladislav Thon</dc:creator>
		<pubDate>Tue, 14 Apr 2009 07:37:42 +0000</pubDate>
		<guid isPermaLink="false">http://blog.krecan.net/?p=350#comment-923</guid>
		<description>&gt; Navíc jsem přesvědčen, že „obyčejní“ programátoři jako já moc API nepíší.

A já bych klidně řekl pravý opak. Zjednodušeně řečeno, kdokoliv programuje něco, co budou používat jiní programátoři, navrhuje API. Pokud se takové API nedostane mimo firmu, určitě tolik nezáleží na jeho stabilitě, ale další vlastnosti dobrého API jsou pořád stejně důležité: snadné a intuitivně správné použití, dobrá dokumentace pokrývající i výjimečné stavy, konzistence s ostatními API a tak.</description>
		<content:encoded><![CDATA[<p>&gt; Navíc jsem přesvědčen, že „obyčejní“ programátoři jako já moc API nepíší.</p>
<p>A já bych klidně řekl pravý opak. Zjednodušeně řečeno, kdokoliv programuje něco, co budou používat jiní programátoři, navrhuje API. Pokud se takové API nedostane mimo firmu, určitě tolik nezáleží na jeho stabilitě, ale další vlastnosti dobrého API jsou pořád stejně důležité: snadné a intuitivně správné použití, dobrá dokumentace pokrývající i výjimečné stavy, konzistence s ostatními API a tak.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Filip Jirsák</title>
		<link>http://blog.krecan.net/2009/04/11/prakticky-api-design/comment-page-1/#comment-922</link>
		<dc:creator>Filip Jirsák</dc:creator>
		<pubDate>Tue, 14 Apr 2009 06:44:14 +0000</pubDate>
		<guid isPermaLink="false">http://blog.krecan.net/?p=350#comment-922</guid>
		<description>Weak reference na listener je ochrana mé komponenty před cizím špatným kódem. Jistě, onen kód by se správně měl odregistrovat -- ale já jako programátor kód, kde se listenere registruje, to nemůžu ovlivnit (pokud nejsem náhodou zrovna i autorem kódu posluchače). 

A že by se mi mohla reference na listener sama od sebe ztratit? Pokud budu potřebovat někdy v budoucnosti listener odregistrovat, stejně na něj musím mít referenci. Takže se mi nemůže stát, že mi jej GC z ničeho nic zruší.

Takže weak reference na listener dobře napsanému listeneru neuškodí a tomu špatně napsanému občas může pomoci.

A jak weak reference uchovávat v kolekci a mazat ty neplatné? Snadno -- při procházení kolekce za účelem vyvolání listenerů použiju ListIterator, a když zjistím prázdnou referenci, rovnou ji z kolekce vymažu.</description>
		<content:encoded><![CDATA[<p>Weak reference na listener je ochrana mé komponenty před cizím špatným kódem. Jistě, onen kód by se správně měl odregistrovat -- ale já jako programátor kód, kde se listenere registruje, to nemůžu ovlivnit (pokud nejsem náhodou zrovna i autorem kódu posluchače). </p>
<p>A že by se mi mohla reference na listener sama od sebe ztratit? Pokud budu potřebovat někdy v budoucnosti listener odregistrovat, stejně na něj musím mít referenci. Takže se mi nemůže stát, že mi jej GC z ničeho nic zruší.</p>
<p>Takže weak reference na listener dobře napsanému listeneru neuškodí a tomu špatně napsanému občas může pomoci.</p>
<p>A jak weak reference uchovávat v kolekci a mazat ty neplatné? Snadno -- při procházení kolekce za účelem vyvolání listenerů použiju ListIterator, a když zjistím prázdnou referenci, rovnou ji z kolekce vymažu.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Honza</title>
		<link>http://blog.krecan.net/2009/04/11/prakticky-api-design/comment-page-1/#comment-918</link>
		<dc:creator>Honza</dc:creator>
		<pubDate>Sat, 11 Apr 2009 18:42:11 +0000</pubDate>
		<guid isPermaLink="false">http://blog.krecan.net/?p=350#comment-918</guid>
		<description>No teda delat na listenery weak-refy mi prijde jako s prominutim pekna prasarna. Kdyz modul umre, mel by se odregistrovat. Vyrabet weak-refy je IMHO akorat work-around proti mizerne kvalite kodu, ktery si listenery registruje, ale neumi od-registrovat.</description>
		<content:encoded><![CDATA[<p>No teda delat na listenery weak-refy mi prijde jako s prominutim pekna prasarna. Kdyz modul umre, mel by se odregistrovat. Vyrabet weak-refy je IMHO akorat work-around proti mizerne kvalite kodu, ktery si listenery registruje, ale neumi od-registrovat.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: v6ak</title>
		<link>http://blog.krecan.net/2009/04/11/prakticky-api-design/comment-page-1/#comment-916</link>
		<dc:creator>v6ak</dc:creator>
		<pubDate>Sat, 11 Apr 2009 14:10:43 +0000</pubDate>
		<guid isPermaLink="false">http://blog.krecan.net/?p=350#comment-916</guid>
		<description>Konkrétně ty listenery jsou zajímavé téma. Taky jsem nad tím přemýšlel, ale weaky mi přijdou z obecného hlediska jako blbost. Došel jsem spíš k názoru, že je lepší zařídit automatickou správu (add*Listener a remove*Listener) podle například focusu. (Jasně, konkrétně focus by nemusel být vždy to pravé, toto jsem promýšlel spíš pro J2ME, tady by šlo spíš o zavření okna.) To by byl celkem univerzální způsob (z obecného pohledu). A nemuselo by se čekat na garbage collector. Popravdě řečeno, přijde mi ne zrovna čisté řešení to nechávat na garbage collectoru, protože ten má uvolňovat paměť, ne snižovat nároky na procesor. Neuklizený listener totiž není jen zátěž pro paměť (v případě jejího nedostatku se spustí garbage collector), ale i zátěží pro procesor, což teoreticky může způsobit dokonce odložení spuštění garbage collectoru. Neznám sice pořádně způsoby rozhodování, kdy spustit garbage collector, ale to se může postupně měnit a je logické, že vyšší zátěž na procesor může způsobit spíše odložení spuštění garbage collectoru, protože zatěžuje procesor. Pochopitelně, bylo by to v tomto případě kontraproduktivní.
BTW Jak byste dělali weak kolekci pro listenery? Jak vyřešit problém stále přibývajících starých WeakReferencí odkazujících nikam? Napadá mě použít trik s finalize, ale nezdá se mi to zrovna jako čisté řešení. A hotovou implementaci neznám.</description>
		<content:encoded><![CDATA[<p>Konkrétně ty listenery jsou zajímavé téma. Taky jsem nad tím přemýšlel, ale weaky mi přijdou z obecného hlediska jako blbost. Došel jsem spíš k názoru, že je lepší zařídit automatickou správu (add*Listener a remove*Listener) podle například focusu. (Jasně, konkrétně focus by nemusel být vždy to pravé, toto jsem promýšlel spíš pro J2ME, tady by šlo spíš o zavření okna.) To by byl celkem univerzální způsob (z obecného pohledu). A nemuselo by se čekat na garbage collector. Popravdě řečeno, přijde mi ne zrovna čisté řešení to nechávat na garbage collectoru, protože ten má uvolňovat paměť, ne snižovat nároky na procesor. Neuklizený listener totiž není jen zátěž pro paměť (v případě jejího nedostatku se spustí garbage collector), ale i zátěží pro procesor, což teoreticky může způsobit dokonce odložení spuštění garbage collectoru. Neznám sice pořádně způsoby rozhodování, kdy spustit garbage collector, ale to se může postupně měnit a je logické, že vyšší zátěž na procesor může způsobit spíše odložení spuštění garbage collectoru, protože zatěžuje procesor. Pochopitelně, bylo by to v tomto případě kontraproduktivní.<br />
BTW Jak byste dělali weak kolekci pro listenery? Jak vyřešit problém stále přibývajících starých WeakReferencí odkazujících nikam? Napadá mě použít trik s finalize, ale nezdá se mi to zrovna jako čisté řešení. A hotovou implementaci neznám.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

