<?xml version="1.0"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:georss="http://www.georss.org/georss" version="2.0">
  <channel>
    <georss:point>50.7234 14.9296</georss:point>
    <title>rarouš.weblog  - komentáře k článku</title>
    <link>http://rarous.net/
    <description>Komentáře k článkům rarouš.weblog.</description>
    <copyright>© 2004 - 2008 Aleš Roubíček. All rights reserved.</copyright>
    <generator>Gryphoon Weblog v1.78</generator>
    <item>
      <author>Michal</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1088</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1088
      <pubDate>Sat, 01 Aug 2009 09:10:27 GMT</pubDate>
      <description>
&lt;p&gt;Tato strategie je vhodna tehdy, pokud potrebujes do budoucna vnitrni
implementaci skryt nebo se ocekavaji vetsi zmeny ve vnitrni implementaci
(anebo je nezadouci, aby mohl konzument s&amp;#160;datama snadno
manipulovat).&lt;/p&gt;

&lt;p&gt;Pokud se pracuje s&amp;#160;treba vysledkem dotazu, seznamem uzivatelu
podle pevnych kriterii (a zmeny v&amp;#160;kolekci nemaji dopad kamkoliv
jinam), pak je IList/List/kolecke apod. prijemne zjednoduseni zivota na
obou stranach.&lt;/p&gt;

&lt;p&gt;Ale dobry clanek, spouste lidi tebou prezentovana situace nedochazi a
to je spatne. A&amp;#160;obecne by API melo spise skryvat, nez odkryvat
;-)&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1089</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1089
      <pubDate>Sat, 01 Aug 2009 09:32:53 GMT</pubDate>
      <description>&lt;p&gt;&lt;a
href="http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1088"&gt;[1]
Michal:&lt;/a&gt; Ani u&amp;#160;výsledků dotazů není důvod List/IList
zveřejňovat. Dnes už neni situace, kde by nestačilo
&lt;code&gt;IEnumerable&lt;/code&gt; a LINQ. :) A&amp;#160;pokud jako konzument ten List
opravdu nutně potřebuješ, pak má pěkný konstruktor, který ho z
&lt;code&gt;IEnumerable&lt;/code&gt; vytvoří.&lt;/p&gt;

&lt;p&gt;Ad API: To neni o&amp;#160;skrývání, ale o&amp;#160;usměrňování.&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Tomáš Jecha</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1090</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1090
      <pubDate>Sat, 01 Aug 2009 17:29:16 GMT</pubDate>
      <description>
&lt;p&gt;Nebylo by lepší podědit od
&lt;strong&gt;ReadOnlyCollec&amp;#173;tion&lt;/strong&gt; a implementovat mu metody na
přidání a odebrání rolí? Třída &lt;strong&gt;User&lt;/strong&gt; jej pak
bude nabízet vlastností &lt;strong&gt;Roles&lt;/strong&gt;. Proč přetahovat
logiku kolekce přímo do objektu uživatele?&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1091</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1091
      <pubDate>Sat, 01 Aug 2009 18:04:02 GMT</pubDate>
      <description>&lt;p&gt;&lt;a
href="http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1090"&gt;[3]
Tomáš Jecha:&lt;/a&gt; Ano, nebylo. User totiž nemá logiku kolekce. To si
myslíš jen díky tomu, že znáš implementační detaily. Ty se
ovšem mohou v&amp;#160;průběhu času měnit (a v&amp;#160;praxi se
mění).&lt;/p&gt;

&lt;p&gt;V&amp;#160;prvním případě, s&amp;#160;takovou změnou budeš mít hodně
práce. Všude, kde pracuješ s&amp;#160;listem rolí
&lt;code&gt;user.Roles&lt;/code&gt;, budeš muset udělat změnu. Pokud tvůj kód
konzumuje i&amp;#160;někdo jiný, máš zaděláno na &lt;acronym
title="Breaking Change"&gt;BC&lt;/acronym&gt; a ty většinou nikdo rád nemá.
V&amp;#160;druhém případě takovým nepříjemnostem předcházíš.&lt;/p&gt;

&lt;p&gt;Navíc je snad pochopitelné, že když chci přidat uživateli roli
&lt;code&gt;user.AddRole&lt;/code&gt;, tak to neznamená, že chci přidal doli do
kolekce, která patří uživateli &lt;code&gt;user.Roles.Add&lt;/code&gt;. BTW
přečti si v článku odkazovaný Demeterův zákon, tam je přesně popsáno,
proč má odpověď na tvou první otázku je kladná.&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Tomáš Jecha</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1092</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1092
      <pubDate>Sat, 01 Aug 2009 18:37:36 GMT</pubDate>
      <description>
&lt;p&gt;&lt;a
href="http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1091"&gt;[4]
Aleš Roubíček:&lt;/a&gt; O&amp;#160;to jde, mě se právě onen
&amp;#8222;Demeterův zákon&amp;#8220; moc nelíbí. Seznam rolí je jednou
seznam a schovávat ho za metody do rodičovského objektu mi přijde
jako krok zjednodušení objektového návrhu za cenu ztráty obecného
přístupu ke kolekci. Podle mě se vhodnost použití obou přístupů
značně liší případ od případu.&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1093</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1093
      <pubDate>Sat, 01 Aug 2009 20:49:07 GMT</pubDate>
      <description>&lt;p&gt;&lt;a
href="http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1092"&gt;[5]
Tomáš Jecha:&lt;/a&gt; Pozor na to, seznam rolí, rozhodně nemusí být
kolekce rolí!&lt;/p&gt;

&lt;pre class="csharp"&gt;&lt;code&gt;public class User {
  private string _roles;

  public User() {
    _roles = String.Empty;
  }

  public void AddRole(Role role) {
    if (String.IsNullOrEmpty(_roles) == false) {
      _roles += " ";
    }
    _roles += role.Name;
  }

  public void RemoveRole(Role role) {
    _roles.
      Replace(role.Name, String.Empty).
      Replace("  ", " ");
  }

  public bool IsInRole(Role role) {
    return _role.Contains(role.Name);
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tato implementace nepoužívá žádnou kolekci a je stejně validní
jako implememntace s&amp;#160;listem rolí. Je to jen implementační
detail. Objektový návrh by měl být co nejjednoduší. O&amp;#160;to
přece jde, dělat věci jednoduše, intuitivně, ne něco lámat přes
koleno. Jak už jsem psal v&amp;#160;minulé reakci, jde o&amp;#160;to
&lt;strong&gt;přiřadit roli uživateli&lt;/strong&gt;, ne o&amp;#160;to přidat
záznam do nějaké kolekce.&lt;/p&gt;

&lt;p&gt;Můj příklad byl možná špatný v&amp;#160;tom, že jsem publikoval
vlastnost &lt;code&gt;IEnumerable&amp;lt;Role&amp;gt; Roles&lt;/code&gt;. V podstatě by
měly bohatě statčit ony tři metody &lt;code&gt;AddRole&lt;/code&gt;,
&lt;code&gt;RemoveRole&lt;/code&gt; a &lt;code&gt;IsInRole&lt;/code&gt;. Nic víc&amp;#8230;&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Augi</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1094</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1094
      <pubDate>Sat, 01 Aug 2009 21:19:26 GMT</pubDate>
      <description>
&lt;p&gt;Pěkný. Vracet IEnumerable&amp;lt;T&amp;gt; jsem se naučil už dávno.
Předtim jsem měl ještě nějaký techtle-mechtle
s&amp;#160;ReadOnlyCollec&amp;#173;tion, ale ty jaksi nedopadly. Vracet
IEnumerable&amp;lt;T&amp;gt; má taky tu výhodu, že v&amp;#160;metodě můžeme
vesele yieldovat ;-) A&amp;#160;ještě bych vypíchl nedoceněné použití
ToArray() &amp;#8211; dokáže to vyřešit pár základních problémů
&amp;#8211; multi-threading a úpravu kolekce během enumerace.&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1095</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1095
      <pubDate>Sat, 01 Aug 2009 22:01:28 GMT</pubDate>
      <description>
&lt;p&gt;&lt;a
href="http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1094"&gt;[7]
Augi:&lt;/a&gt; Přesně o&amp;#160;tom bude zítřejší spot, pokud nebude
velká kocovina :)&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Rene Stein</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1096</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1096
      <pubDate>Sat, 01 Aug 2009 22:20:21 GMT</pubDate>
      <description>
&lt;p&gt;Jen rychla poznamka z&amp;#160;MDA. Tento postup je hezky, ale
v&amp;#160;prazi rychle narazis na limity. Podle me jde v&amp;#160;clanku o
&amp;#8222;skolni&amp;#8220; priklad &amp;#8211; na prvni pohled pekne reseni
ukazujici vyhody, ale trochu nucene a nepresvedcive.&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;Demeteruv zakon &amp;#8211; slovo zakon je nestastne, jedna se spis
	o&amp;#160;uzitecne doporuceni, jak kontrolovat, ze implementace metod
	nevede ke vzrustajicimu zatizeni tridy dalsimi nesouvisejicimi tridami,
	a tim i&amp;#160;k likvidaci jednoho z&amp;#160;hlavnich zaklinadel OOP, tedy
	znovupouzitelnosti tridy, &amp;#8222;cerne skrinky&amp;#8220;, ktera nema prilis
	predpokladu o&amp;#160;ostatnch tridach v&amp;#160;okoli.&lt;/li&gt;

	&lt;li&gt;Co kdyz trida uzivatel bude obsahovat i&amp;#160;kolekci vlastnich prav.
	Bude vystavena kolekce? Objekt, na ktery je delegova sprava prav? Nebo
	ty vystavis dalsi (treba jen delegujic na spravce pravi) metody
	AddRight, RemoveRight, HasRight? Rozhrani sice bude pekne, ale po case
	se pri tomto postupu zacnes potykat se zasadou"rozhrani tridy by melo
	byt jednoduche a intuitivni, nemely byste mit ve tride prilis mnoho
	metod". Neni tedy potreba jeste odkazat na princip separatnich rozhrani
	tridy (ISG)? A&amp;#160;jsme schopni &amp;#8222;rozseka&amp;#8220; rozhrani tridy
	User tak, aby jednotliva specializovana rozhrani slouzila ruznym
	klientum?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tim chci jen rici, ze navrh je (neprekvapive) kompromisem mezi
ruznymi zakony a principy a ze napsat &amp;#8222;kontroverzni&amp;#8220;
i&amp;#160;clanek, jak jsi zminoval na Twitteru, se da vzdy nejlepe pojetim
nejakeho principu jakozto axiomu vsech axiomu a kladiva s&amp;#160;totalnim
narokem na ubiti vsech problemu. ;)&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;List(T) pro typove kolekce nepouzivam. Mam vlastni typove kolekce
	zalozene na Collection(T).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Omlouvam se za preklepy, na MDA se ale komentar do tohoto boxu pise
spatne. ;)&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>stej</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1101</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1101
      <pubDate>Mon, 03 Aug 2009 10:05:15 GMT</pubDate>
      <description>
&lt;p&gt;„Ale, jak teď zjistim, kolik rolí má uživatel přiřazených,
když IEnumerable nemá vlastnost Count ani Length?“ using
System.Linq;&lt;/p&gt;

&lt;p&gt;Osobně se ztotožňuju s&amp;#160;&lt;a
href="http://rapidapplicationdevelopment.blogspot.com/2009/07/ienumerablecount-is-code-smell.html"&gt;IEnumerable&amp;#173;.Count()
is a Code Smell&lt;/a&gt;&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1103</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1103
      <pubDate>Mon, 03 Aug 2009 10:27:42 GMT</pubDate>
      <description>
&lt;p&gt;&lt;a
href="http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1101"&gt;[10]
stej:&lt;/a&gt; Samozřejmě, v&amp;#160;tamtom případě, ano. Jenže to, co
popisuju já, negeneruje dotaz do databáze. :) Pokud programátor,
netuší, co jeho kód dělá, měl by přemýšlet o&amp;#160;jiném
zaměstnání.&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Steve</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1123</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1123
      <pubDate>Sat, 29 Aug 2009 20:33:36 GMT</pubDate>
      <description>
&lt;p&gt;&lt;a
href="http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1103"&gt;[11]
Aleš Roubíček:&lt;/a&gt; Kdychom to měli vzít důsledně, tak na msdn se
o&amp;#160;IEnumerable píše &amp;#8222;Exposes the enumerator, which supports
a simple iteration over a (non-)generic collection.&amp;#8220; =&amp;gt;
IEnumerable (schválně) &amp;#8222;neexposuje&amp;#8220; nic o&amp;#160;počtu
prvků.&lt;/p&gt;

&lt;p&gt;Dogmatické řešení dovedené do krajností by podle mě mělo
vypadat tak, že třída User bude mít ještě vlastnost
RolesCount.&lt;/p&gt;

&lt;p&gt;Btw. a co třeba RolesCollection implementující IList&amp;lt;&amp;gt;
(ICollection&amp;lt;&amp;gt;) a vnitřně využivající List&amp;lt;&amp;gt; pomocí
skládání? :-P&lt;/p&gt;

&lt;p&gt;Jinak taky vždy vracím IEnumerable&amp;lt;&amp;gt;, ale teprve díky
tomuhle článku a komentářům pod ním, jsem o&amp;#160;tom začal
hlouběji přemýšlet.&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Aleš Roubíček</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1124</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1124
      <pubDate>Sun, 30 Aug 2009 08:31:48 GMT</pubDate>
      <description>
&lt;p&gt;&lt;a
href="http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1123"&gt;[12]
Steve:&lt;/a&gt; Díky za reakci. :)&lt;/p&gt;

&lt;p&gt;Já jsem s&amp;#160;odstupem času došel k&amp;#160;tomu, že příklad
s&amp;#160;uživatelskými rolemi, nebyl zrovn nejšťastnější. :)
Lepší by byla ukázka ve stylu &lt;code&gt;person.Wallet.Remove()&lt;/code&gt;,
kde Wallet je &lt;code&gt;IList of Money&lt;/code&gt; vs.
&lt;code&gt;person.PayBill()&lt;/code&gt;. :) Myslím, že šahat na peněženku si
jen tak někdo nenechá. A&amp;#160;pak je Demeterův zákon
stravitelnější.&lt;/p&gt;

&lt;p&gt;Ano &lt;code&gt;RolesCount&lt;/code&gt; by šlo implementovat, ale opravdu
potřebuje uživatel znát, kolik rolí má?&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>Steve</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1125</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1125
      <pubDate>Sun, 30 Aug 2009 23:16:57 GMT</pubDate>
      <description>
&lt;p&gt;&lt;a
href="http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1124"&gt;[13]
Aleš Roubíček:&lt;/a&gt; Souhlasím: peněženka dává větší smysl, tam
je to pěkně vidět.&lt;/p&gt;

&lt;p&gt;Ad potřebnost RolesCount: záleží na tom. Když bych např. chtěl
v&amp;#160;UI administrace umožnit editaci seznamu rolí přiřazených
danému uživateli, tak by IEnumerable&amp;lt;Role&amp;gt; i&amp;#160;RolesCount
(resp. Linq) přišli vhod pro jejich výpis, stránkování atd.&lt;/p&gt;

&lt;p&gt;Taky díky za reakci :)&lt;/p&gt;

&lt;!-- generated by Texy! --&gt;</description>
    </item>
    <item>
      <author>zsery</author>
      <title>Komentář k článku Vracet List je špatné</title>
      <guid>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1299</guid>
      <link>http://rarous.net/weblog/359-vracet-list-je-spatne.aspx#km1299
      <pubDate>Wed, 21 Sep 2011 11:35:13 GMT</pubDate>
      <description>&lt;p&gt;Připadá mi zvláštní : Když vracíte List&amp;lt;T&amp;gt;, znamená to,
že říkáte všechno o vnitřní implementaci. Naopak si myslím, že
tím říkáme jen a jen že to „vylejeme“ jako
List&amp;lt;T&amp;gt;.&lt;/p&gt;
&lt;!-- by Texy2! --&gt;</description>
    </item>
  </channel>
</rss>
