<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>René Stein - UML</title>
    <link>http://blog.renestein.net/</link>
    <description>Názory vzešlé z mesaliance humanitní skepse a technologického optimismu</description>
    <image>
      <url>http://blog.renestein.net/themes/discreetBlogBlue/SpotImages/sfinga_rss.jpg</url>
      <title>René Stein - UML</title>
      <link>http://blog.renestein.net/</link>
    </image>
    <language>cs-CZ</language>
    <copyright>René Stein</copyright>
    <lastBuildDate>Tue, 20 Mar 2012 08:28:04 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.7174.0</generator>
    <managingEditor>rene@renestein.net</managingEditor>
    <webMaster>rene@renestein.net</webMaster>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=b193e5d5-a047-4196-a8e4-11b97b380b19</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,b193e5d5-a047-4196-a8e4-11b97b380b19.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,b193e5d5-a047-4196-a8e4-11b97b380b19.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b193e5d5-a047-4196-a8e4-11b97b380b19</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Opět bych vás chtěl pozvat na kurz Objektovými principy a návrhovými vzory řízený
design a vývoj kvalitních aplikací 1.
</p>
        <hr />
        <p>
          <b>Veřejný kurz Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních
aplikací 1</b>
        </p>
        <p>
Datum konání kurzu:  <strong><strong><abbr>
4. 6.
</abbr>
– 
<abbr>
6. 6. 2012
</abbr></strong></strong></p>
        <p>
          <strong>
            <strong>
              <abbr>
              </abbr>
            </strong>
          </strong>Místo konání<strong>:</strong></p>
        <p>
          <a href="http://blog.renestein.net/ct.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a&amp;url=http%3a%2f%2fwww.tutor.cz%2f">Školící
středisko Tutor</a>
        </p>
        <p>
U Půjčovny 2<br />
110 00 Praha 1 
</p>
        <p>
          <em>Po celý den máme k dispozici wifi připojení a samozřejmě také teplé i studené
nápoje. V ceně kurzu jsou obědy v restauraci.</em>
        </p>
        <p>
          <a href="http://blog.renestein.net/ct.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a&amp;url=http%3a%2f%2fblog.renestein.net%2fct.ashx%3fid%3dd6fd9894-f5cd-4d7d-9e78-53974f98d52d%26url%3dhttp%253a%252f%252fwww.renestein.net%252fNabidka.aspx%2523skoleni">Podrobné
informace o kurzu a možnost přihlásit se na kurz</a>
        </p>
        <p>
          <a href="http://blog.renestein.net/ct.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a&amp;url=http%3a%2f%2fblog.renestein.net%2fct.ashx%3fid%3dd6fd9894-f5cd-4d7d-9e78-53974f98d52d%26url%3dhttp%253a%252f%252fwww.renestein.net%252fSkoleni-UML-OOP-Navrhove-vzory-1.aspx">Program
kurzu</a>
          <br />
          <a href="http://blog.renestein.net/ct.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a&amp;url=http%3a%2f%2fblog.renestein.net%2fct.ashx%3fid%3dd6fd9894-f5cd-4d7d-9e78-53974f98d52d%26url%3dhttp%253a%252f%252fwww.renestein.net%252fOhlasy-Ucastniku-Na-Kurzy.aspx">Výběr
z ohlasů na kurz</a>
        </p>
        <p>
Zde jsou ještě některé ohlasy z twitteru na  kurzy, které proběhly na podzim
roku 2011:<br /><a href="https://twitter.com/#!/AugiCZ/status/129271721512538112">https://twitter.com/#!/AugiCZ/status/129271721512538112</a></p>
        <p>
          <a href="https://twitter.com/#!/topascz/status/129228333991989248">https://twitter.com/#!/topascz/status/129228333991989248</a>
          <br />
          <br />
          <a href="https://twitter.com/#!/petrkucera/statuses/129474672575250432">https://twitter.com/#!/petrkucera/statuses/129474672575250432</a>
        </p>
        <p>
          <br />
          <a href="http://blog.renestein.net/ct.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a&amp;url=http%3a%2f%2frenestein.net%2fCasto-Kladene-Dotazy-Kurzy-FAQ.aspx">FAQ
- často kladené dotazy ke kurzům</a>
        </p>
        <p>
          <hr />
        </p>
        <p>
Tento rok se na jaře uskuteční pouze výše popsaný kurz. Dva další kurzy, <a href="http://www.renestein.net/Nabidka.aspx#skoleniOOP0">Školení
Základy objektově orientovaného návrhu a vývoje (UML 0)</a> a <a href="http://www.renestein.net/Nabidka.aspx#SkoleniOOP2">Pokročilé
návrhové vzory a objektové principy 2</a>, proběhnou na podzim a můžete se na ně také 
předběžně hlásit. Důvodem, proč tyto kurzy neproběhnou na jaře, je moje vytížení dalšími
projekty.
</p>
        <p>
Pro jistotu připomenu, že všechny kurzy lze také objednávat v “inhouse” variantě,
kdy kurz proběhne ve vaší firmě v termínech, na kterých se spolu domluvíme, a za podmínek,
které s vámi ráda dohodne <a href="mailto:petra@renestein.net" target="_blank">Petra
Steinová</a>. V inhouse variantě je také samozřejmě možné zcela upravit program kurzu 
a věnovat se jen “specialitkám” a “špekům”, které v aplikaci řešíte.
</p>
        <p>
Budu se těšit na záludné dotazy na kurzu.<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Pozvnka-na-kurz-objektovch-princip-a-nvr_7F57/wlEmoticon-smile_2.png" /></p>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=b193e5d5-a047-4196-a8e4-11b97b380b19" />
      </body>
      <title>Pozv&amp;aacute;nka na kurz objektov&amp;yacute;ch principů a n&amp;aacute;vrhov&amp;yacute;ch vzorů &amp;ndash; jaro 2012 a informace k dal&amp;scaron;&amp;iacute;m kurzům</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,b193e5d5-a047-4196-a8e4-11b97b380b19.aspx</guid>
      <link>http://blog.renestein.net/Pozvaacutenka+Na+Kurz+Objektovyacutech+Princip%c5%af+A+Naacutevrhovyacutech+Vzor%c5%af+Ndash+Jaro+2012+A+Informace+K+Dalscaroniacutem+Kurz%c5%afm.aspx</link>
      <pubDate>Tue, 20 Mar 2012 08:28:04 GMT</pubDate>
      <description>&lt;p&gt;
Opět bych vás chtěl pozvat na kurz Objektovými principy a návrhovými vzory řízený
design a vývoj kvalitních aplikací 1.
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;b&gt;Veřejný kurz Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních
aplikací 1&lt;/b&gt; 
&lt;p&gt;
Datum konání kurzu:&amp;nbsp; &lt;strong&gt;&lt;strong&gt;
&lt;abbr&gt;
4. 6.
&lt;/abbr&gt;
– 
&lt;abbr&gt;
6. 6. 2012
&lt;/abbr&gt;
&lt;/strong&gt;&lt;/strong&gt; 
&lt;p&gt;
&lt;strong&gt;&lt;strong&gt;
&lt;abbr&gt;
&lt;/abbr&gt;
&lt;/strong&gt;&lt;/strong&gt;Místo konání&lt;strong&gt;:&lt;/strong&gt; 
&lt;p&gt;
&lt;a href="http://blog.renestein.net/ct.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a&amp;amp;url=http%3a%2f%2fwww.tutor.cz%2f"&gt;Školící
středisko Tutor&lt;/a&gt; 
&lt;p&gt;
U Půjčovny 2&lt;br&gt;
110 00 Praha 1 
&lt;p&gt;
&lt;em&gt;Po celý den máme k dispozici wifi připojení a samozřejmě také teplé i studené
nápoje. V ceně kurzu jsou obědy v restauraci.&lt;/em&gt; 
&lt;p&gt;
&lt;a href="http://blog.renestein.net/ct.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a&amp;amp;url=http%3a%2f%2fblog.renestein.net%2fct.ashx%3fid%3dd6fd9894-f5cd-4d7d-9e78-53974f98d52d%26url%3dhttp%253a%252f%252fwww.renestein.net%252fNabidka.aspx%2523skoleni"&gt;Podrobné
informace o kurzu a možnost přihlásit se na kurz&lt;/a&gt; 
&lt;p&gt;
&lt;a href="http://blog.renestein.net/ct.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a&amp;amp;url=http%3a%2f%2fblog.renestein.net%2fct.ashx%3fid%3dd6fd9894-f5cd-4d7d-9e78-53974f98d52d%26url%3dhttp%253a%252f%252fwww.renestein.net%252fSkoleni-UML-OOP-Navrhove-vzory-1.aspx"&gt;Program
kurzu&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://blog.renestein.net/ct.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a&amp;amp;url=http%3a%2f%2fblog.renestein.net%2fct.ashx%3fid%3dd6fd9894-f5cd-4d7d-9e78-53974f98d52d%26url%3dhttp%253a%252f%252fwww.renestein.net%252fOhlasy-Ucastniku-Na-Kurzy.aspx"&gt;Výběr
z ohlasů na kurz&lt;/a&gt; 
&lt;p&gt;
Zde jsou ještě některé ohlasy z twitteru na&amp;nbsp; kurzy, které proběhly na podzim
roku 2011:&lt;br&gt;
&lt;a href="https://twitter.com/#!/AugiCZ/status/129271721512538112"&gt;https://twitter.com/#!/AugiCZ/status/129271721512538112&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://twitter.com/#!/topascz/status/129228333991989248"&gt;https://twitter.com/#!/topascz/status/129228333991989248&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href="https://twitter.com/#!/petrkucera/statuses/129474672575250432"&gt;https://twitter.com/#!/petrkucera/statuses/129474672575250432&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;a href="http://blog.renestein.net/ct.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a&amp;amp;url=http%3a%2f%2frenestein.net%2fCasto-Kladene-Dotazy-Kurzy-FAQ.aspx"&gt;FAQ
- často kladené dotazy ke kurzům&lt;/a&gt; 
&lt;p&gt;
&lt;hr&gt;
&lt;p&gt;
Tento rok se na jaře uskuteční pouze výše popsaný kurz. Dva další kurzy, &lt;a href="http://www.renestein.net/Nabidka.aspx#skoleniOOP0"&gt;Školení
Základy objektově orientovaného návrhu a vývoje (UML 0)&lt;/a&gt; a &lt;a href="http://www.renestein.net/Nabidka.aspx#SkoleniOOP2"&gt;Pokročilé
návrhové vzory a objektové principy 2&lt;/a&gt;, proběhnou na podzim a můžete se na ně také&amp;nbsp;
předběžně hlásit. Důvodem, proč tyto kurzy neproběhnou na jaře, je moje vytížení dalšími
projekty.
&lt;/p&gt;
&lt;p&gt;
Pro jistotu připomenu, že všechny kurzy lze také objednávat v “inhouse” variantě,
kdy kurz proběhne ve vaší firmě v termínech, na kterých se spolu domluvíme, a za podmínek,
které s vámi ráda dohodne &lt;a href="mailto:petra@renestein.net" target="_blank"&gt;Petra
Steinová&lt;/a&gt;. V inhouse variantě je také samozřejmě možné zcela upravit program kurzu&amp;nbsp;
a věnovat se jen “specialitkám” a “špekům”, které v aplikaci řešíte.
&lt;/p&gt;
&lt;p&gt;
Budu se těšit na záludné dotazy na kurzu.&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Pozvnka-na-kurz-objektovch-princip-a-nvr_7F57/wlEmoticon-smile_2.png"&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=b193e5d5-a047-4196-a8e4-11b97b380b19" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,b193e5d5-a047-4196-a8e4-11b97b380b19.aspx</comments>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=c5624a7e-98ca-44a7-94c9-8f5824a19f85</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,c5624a7e-98ca-44a7-94c9-8f5824a19f85.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,c5624a7e-98ca-44a7-94c9-8f5824a19f85.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c5624a7e-98ca-44a7-94c9-8f5824a19f85</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://blog.renestein.net/Pozvaacutenka+Na+Kurzy+Objektovyacutech+Princip%C5%AF+A+Naacutevrhovyacutech+Vzor%C5%AF+Ndash+Podzim+2011.aspx">Pozvánka
na mé kurzy</a> na blogu trochu zapadla, a protože tento týden dvě firmy zvolily raději
inhouse variantu kurzu, a tím se uvolnila místa na veřejných kurzech, i když předtím
jsme museli na začátku srpna některé zájemce o veřejné kurzy OOP 0 a OOP 1 odmítat,
dávám i pro další zájemce znovu <a href="http://blog.renestein.net/Pozvaacutenka+Na+Kurzy+Objektovyacutech+Princip%C5%AF+A+Naacutevrhovyacutech+Vzor%C5%AF+Ndash+Podzim+2011.aspx">odkaz
na pozvánku</a>.
</p>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=c5624a7e-98ca-44a7-94c9-8f5824a19f85" />
      </body>
      <title>Připomenut&amp;iacute;: Kurzy &amp;ndash; podzim 2011</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,c5624a7e-98ca-44a7-94c9-8f5824a19f85.aspx</guid>
      <link>http://blog.renestein.net/P%c5%99ipomenutiacute+Kurzy+Ndash+Podzim+2011.aspx</link>
      <pubDate>Tue, 30 Aug 2011 10:48:54 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://blog.renestein.net/Pozvaacutenka+Na+Kurzy+Objektovyacutech+Princip%C5%AF+A+Naacutevrhovyacutech+Vzor%C5%AF+Ndash+Podzim+2011.aspx"&gt;Pozvánka
na mé kurzy&lt;/a&gt; na blogu trochu zapadla, a protože tento týden dvě firmy zvolily raději
inhouse variantu kurzu, a tím se uvolnila místa na veřejných kurzech, i když předtím
jsme museli na začátku srpna některé zájemce o veřejné kurzy OOP 0 a OOP 1 odmítat,
dávám i pro další zájemce znovu &lt;a href="http://blog.renestein.net/Pozvaacutenka+Na+Kurzy+Objektovyacutech+Princip%C5%AF+A+Naacutevrhovyacutech+Vzor%C5%AF+Ndash+Podzim+2011.aspx"&gt;odkaz
na pozvánku&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=c5624a7e-98ca-44a7-94c9-8f5824a19f85" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,c5624a7e-98ca-44a7-94c9-8f5824a19f85.aspx</comments>
      <category>Analytické drobky</category>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=59132463-8265-453d-b94a-d44bc3a07878</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,59132463-8265-453d-b94a-d44bc3a07878.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,59132463-8265-453d-b94a-d44bc3a07878.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=59132463-8265-453d-b94a-d44bc3a07878</wfw:commentRss>
      <slash:comments>19</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 
</p>
        <p>
Dnes na twitteru <a href="http://twitter.com/#!/DavidGrudl/status/77398502971424768">David
Grudl odkázal</a> na debatu, která se <a href="http://php.vrana.cz/prace-s-vlastnostmi-pomoci-metod.php#d-11965">týká
vlastností v PHP</a>. O vlastnostech v PHP mluvit nechci, ale v tomto  příspěvku
se chci dotknout některých “dogmat”, které se ozývají stále častěji a které byly použity
jako univerzální kladivo na oponenty  i v odkazované diskuzi.
</p>
        <p>
Jedno zvláštní dogma se týká principu jedné odpovědnosti třídy (Single responsibility
principle). Tento princip říká, že třída by měla mít jednu přesně vymezenou odpovědnost,
která je v souladu s jejím názvem. I když na první přečtění se tento princip zdá neproblematický,
dá se zneužít jako univerzální kladivo. <strong>Dogmatici mi říkali, že jedna odpovědnost
si vynucuje, aby třída vždy měla právě jednu metodu, která tuto odpovědnost realizuje. </strong>Není
nad přehledný svět objektových dogmatiků, kde objekt je jen stupidní kontajner na
jednu (de facto globální?) funkci.<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Opakovn-zklad_119C2/wlEmoticon-smile_2.png" /></p>
        <p>
Dogmatiky tohoto zvláštního ražení  zanedbejme jako ztracené případy a SRP obohaťme
o další vysvětlení, které říká, že třída by měla mít jen jeden důvod ke změně. Tento
princip je užitečný v tom, se snaží z aplikací odstranit všemocné božské (God) objekty,
které mnohdy už svým názvem signalizují, že řeší spoustu věcí. UniversalOrderAndInvoiceProcessor
oznamuje, že se bude měnit nejen, když se změní zpracování objednávek, ale také když
se změní zpracování faktur. Jednoduché, což? Proč o tomhle jednoduchém principu vůbec
dále mluvit?
</p>
        <p>
V diskuzi se o SRP <a href="http://php.vrana.cz/prace-s-vlastnostmi-pomoci-metod.php#d-11965">mluví
(viz i příspěvky níže</a>), ale diskutující tam ve  své argumentaci používají
něco, čemu na kurzech u SRP říkám falešné alternativy.
</p>
        <p>
Mějme stejně jako v diskusi svou třídu Image, která nese informace o obrázku. Obrázek
chceme uložit.
</p>
        <p>
Varianta 1, kdy obrázek nese informace a současně nabízí metodu Save, ve které uloží
data do souboru.
</p>
        <script src="https://gist.github.com/1009256.js">
        </script>
        <p>
Co je v diskuzi vyčítáno této třídě? Porušuje princip jedné odpovědnosti, protože
podle některých (Jiří Knesl, Ondřej Mirteš)  řeší dvě věci najednou – <strong>nese
data o obrázku a současně data ukládá. </strong>Souhlasím, že jde o porušení SRP,
ale hlavním důvodem je to, že metoda Save je napsána tak,  že třídu Image ukládáme <strong>vždy </strong>do
souboru. Co když budeme chtít třídu Image uložit do nějakého “response” streamu na
webovém serveru, nebo uložit přímo do databáze? Tuto třídu skutečně budeme měnit ze
dvou důvodů – jednou, když přidáme nebo odebereme informace o obrázku a také, když
budeme chtít ukládat obrázek do databáze, musíme rozšířit stávající metodu Save, což
povede k tomu, že metoda bude mít v sobě nějaký podivný switch a  bude trpět
smíšenou odpovědností, protože bude dělat několik věcí najednou,  nebo můžeme
přidat novou samostatnou metodu SaveToDb. 
</p>
        <p>
Jedinou (!?) alternativou v diskuzi k tomuto postupu je vyvedení odpovědnosti za ukládání
do různých úložišť do samostatných objektů, které mohou být  skryty za jednotným
rozhraním.
</p>
        <script src="https://gist.github.com/1009269.js">
        </script>
        <p>
Toto řešení důsledně separuje odpovědnosti, navíc je velmi snadné přidat další implementaci
rozhraní IImagePersistor, např. DbPersistor, který data uloží do databáze. Už v diskuzi
Jakub Vrána ale upozorňuje na to, že se mu nelíbí, jak se řešení komplikuje pro uživatele-vývojáře,
který s třídami bude pracovat, protože tento vývojář musí vědět, že existuje nějaký
IImagePersistor/FilePersistor odpovědný za uložení dat. Třída Image nestačí k tomu,
abyste dokázali vygenerovat data obrázku a uložit je, což může být ve vaší knihovně
častý scénář. Také bych rád poprvé v tomto článku připomněl princip OOP, ke kterému
se za chvíli vrátím, že <strong>objekt představuje jednotu svého stavu a chování,
které je pro tento stav definováno. </strong></p>
        <p>
          <strong>Psal jsem o falešných alternativách, můžeme najít i jiná řešení. Co ponechat
metodu Save ve třídě Image, ale z třídy Image udělat tzv kompozitor - objekt, který
skládá své chování tak, že využívá další pomocné objekty, na kterých závisí, a nabízí
intuitivní rozhraní pro klienty. </strong>
        </p>
        <script src="https://gist.github.com/1009274.js">
        </script>
        <p>
Odpovědnosti jsou stále separovány a dokonce třída Image, náš kompozitor, dodržuje
pravidlo, které říká, že kompozitor by měl být jednodušší než suma funkcí jeho pomocných
objektů.  Klient třídy Image nemusí pracovat přímo s třídou FilePersistor, a
přitom nemáme kód pro ukládání do souboru přímo ve třídě Image. Problém je, že metoda
Save třídy Image vždy vytváří FilePersistor. Klient třídy Image si nemůže vyžádat
to námi dříve zmiňované ukládání obrázku do databáze, a navíc třída Image závisí na
jedné konkrétní třídě FilePersistor, u níž přímo volá konstruktor. <strong>V třídě
Image mixujeme vytváření grafu spolupracujících objektů se samotným použitím pomocných
objektů. Opět jde o dvě odpovědnosti, které bychom měli oddělit – SRP, nezapomeňme.</strong></p>
        <p>
Nejprve ale zkusme vyřešit problém s tím, že klient nemůže ukládat data do databáze,
protože třída Image ukládá data vždy do souboru.
</p>
        <script src="https://gist.github.com/1009285.js">
        </script>
        <p>
Jednoduše přidáme další variantu metody, která přijímá odkaz na IImagePersistor, v
našem případě třeba na DbPersistor. Původní metoda Save bez argumentů řeší ukládání
do souboru. Ukládání do souboru je nejčastější scénář, který je zvolen jako výchozí.
Stále ale tady máme problém s tím, že v metodě Save konstruujeme "natvrdo" FilePersistor.
A navíc naše API klientům trochu lže. V podtextu klientovi sděluje, že výchozí metoda
Save nemá žádné další závislosti, i když z implementace, !a jen z implementace!, 
je zřejmé, že jsme závislí na přítomnosti třídy FilePersistor. <em>Poznámka: V C#
4 můžeme použít volitelné argumenty u jedné metody, ale na principu této varianty
řešení se moc nemění.</em></p>
        <p>
Zkusme naše prozatím ulhané API vylepšit a dodržet SRP.  Oddělme nyní konstrukci
pomocných objektů, na kterých závisíme, od jejich použití v metodě Save. 
</p>
        <script src="https://gist.github.com/1009297.js">
        </script>
        <p>
Objekt Image si nyní v konstruktoru vynucuje předání IIMagePersitoru. Když klient
IImagePersistor nepředá, objekt nezvznikne – sám konstruktor garantuje, že buď objekt
Image má vyplněny všechny závislosti, nebo vůbec nevznikne. Vytvořili jsme konstruktor,
který může použít a automaticky naplnit DI kontajner, nebo různé abstraktní továrny
registrované v DI kontajneru  apod. <strong>DI kontajner je přesně tím objektem,
který by měl být v aplikaci odpovědný za konstrukci grafu objektů,</strong> v metodě
Save objektu Image injektovaný IImagePersistor jen používáme. SRP v praxi.
</p>
        <p>
Možný že ale v tomto případě je injektování závislostí přes konstruktor moc striktní.
Co když nám skutečně vyhovuje, že můžeme bez DI kontajneru vytvořit objekt Image,
který bude data ukládat do souboru. Pak můžeme využít injektování přes vlastnosti,
kdy příslušnou vlastnost po vzniku objektu vyplníme rozumnou výchozí hodnotou – v
našem případě instancí FilePersistoru. Poté ale platí, že třídu Image stále částečně
zatěžujete konstrukcí objektů…<br />
U většiny DI kontajnerů je preferováno injektování závislostí přes konstruktory, všechny,
které znám,  si ale poradí ale i s injektováním závislostí přes vlastností a
u <a href="http://www.google.cz/search?hl=cs&amp;source=hp&amp;q=MEF+MSDN&amp;aq=f&amp;aqi=&amp;aql=&amp;oq=">MEF</a>u
bych řekl, že injektování závislostí pomocí vlastností hrají prim.
</p>
        <script src="https://gist.github.com/1009315.js">
        </script>
        <p>
Všechny tyto varianty mají své výhody a nevýhody a asi nemusím zdůrazňovat, že ani
jedna není univerzálním kladivem. Varianty s injektováním závislostí (konstruktor,
metoda, vlastnost) jsou samozřejmě mnohem lépe testovatelné.
</p>
        <p>
Dokážu přidat i další příklady, ale chtěl jsem,  abyste viděli, že SRP není ani
nesmysl, ale ani princip, který by, podobně jako to zaznělo v diskuzi, sděloval –
existují jen dvě alternativy, jak rozdělovat odpovědnosti, a ZROVNA TA TVOJE JE ŠPATNĚ.
</p>
        <p>
A poslední  poznámka:
</p>
        <p>
Jiřé Knesl také v diskuzi uvedl: “ objekt buďto data reprezentuje (pak má settery/gettery),
nebo vykonává činnost (pak dostane data parametry)”. Tohle je podle mě  postoj
blízký hlavně některým Javistům, o čemž svědčí i podle mého soudu schematický a nevěrohodný <a href="http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html">článek,
který se zabývá vlastnostmi v Javě</a> a na který se J. Knesl odkazuje. Znovu připomínám,
že <strong>objekt představuje jednotu svého stavu a chování, které je pro tento stav
definováno.  </strong>Objekt, který má jen gettery a settery, je ”krabičkou na
data”, pouhou strukturou známou i z neobjektových jazyků, a když má objekt jen metody,
tak jde o (v mnoha případech skutečně globální) funkce/procedury, které prefixujeme
názvem proměnné/třídy. V diskuzi to myslím nezaznělo, ale když někdo razí tuto drastickou
separaci chování od samotných dat, často dodává, že takto je to přece definováno Evansem,
tedy autoritou,  v kanonické knize o <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">Domain
Driven Designu</a>. Když se ptám, kde o tom Evans mluví, dozvím se, že Evans má objekty,
které mají svůj stav (vlastnosti)  a s objekty pracují speciální business-doménové
služby (chování). I když mám vůči DDD spoustu výhrad, zde Evanse špatně interpretují
– Evans by model, kde objekty mají jen stav a nemají žádné chování, nazval <a href="http://martinfowler.com/bliki/AnemicDomainModel.html">anemickým
modelem</a> – izolovaná data podepřená berličkami nesouvisejících globálních funkcí.
Business služby jsou, zjednodušeně řečeno, určeny pro zapsání složitější business
logiky, na které spolupracuje více objektů a žádný participující objekt není sám o
sobě přirozeným kandidátem, do kterého by bylo vhodné logiku situovat.
</p>
        <p>
Zde bych mohl pokračovat dále k rozdělení objektů v DDD, ke skutečnému významu vlastností
u objektu, co říká princip “tell, don't ask”, ale už teď mi původně krátký komentář
k SRP a DDD až moc nabobtnal. Když budete mít zájem o další naznačená témata, napište
prosím komentář k článku.
</p>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=59132463-8265-453d-b94a-d44bc3a07878" />
      </body>
      <title>O &amp;scaron;patně ch&amp;aacute;pan&amp;eacute;m principu jedn&amp;eacute; odpovědnosti tř&amp;iacute;dy (SRP) a o zneuž&amp;iacute;v&amp;aacute;n&amp;iacute; my&amp;scaron;lenek Domain driven designu (DDD)</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,59132463-8265-453d-b94a-d44bc3a07878.aspx</guid>
      <link>http://blog.renestein.net/O+Scaronpatn%c4%9b+Chaacutepaneacutem+Principu+Jedneacute+Odpov%c4%9bdnosti+T%c5%99iacutedy+SRP+A+O+Zneu%c5%beiacutevaacuteniacute+Myscaronlenek+Domain+Driven+Designu+DDD.aspx</link>
      <pubDate>Sun, 05 Jun 2011 20:13:04 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Dnes na twitteru &lt;a href="http://twitter.com/#!/DavidGrudl/status/77398502971424768"&gt;David
Grudl odkázal&lt;/a&gt; na debatu, která se &lt;a href="http://php.vrana.cz/prace-s-vlastnostmi-pomoci-metod.php#d-11965"&gt;týká
vlastností v PHP&lt;/a&gt;. O vlastnostech v PHP mluvit nechci, ale v tomto&amp;nbsp; příspěvku
se chci dotknout některých “dogmat”, které se ozývají stále častěji a které byly použity
jako univerzální kladivo na oponenty&amp;nbsp; i v odkazované diskuzi.
&lt;/p&gt;
&lt;p&gt;
Jedno zvláštní dogma se týká principu jedné odpovědnosti třídy (Single responsibility
principle). Tento princip říká, že třída by měla mít jednu přesně vymezenou odpovědnost,
která je v souladu s jejím názvem. I když na první přečtění se tento princip zdá neproblematický,
dá se zneužít jako univerzální kladivo. &lt;strong&gt;Dogmatici mi říkali, že jedna odpovědnost
si vynucuje, aby třída vždy měla právě jednu metodu, která tuto odpovědnost realizuje. &lt;/strong&gt;Není
nad přehledný svět objektových dogmatiků, kde objekt je jen stupidní kontajner na
jednu (de facto globální?) funkci.&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Opakovn-zklad_119C2/wlEmoticon-smile_2.png"&gt;
&lt;/p&gt;
&lt;p&gt;
Dogmatiky tohoto zvláštního ražení&amp;nbsp; zanedbejme jako ztracené případy a SRP obohaťme
o další vysvětlení, které říká, že třída by měla mít jen jeden důvod ke změně. Tento
princip je užitečný v tom, se snaží z aplikací odstranit všemocné božské (God) objekty,
které mnohdy už svým názvem signalizují, že řeší spoustu věcí. UniversalOrderAndInvoiceProcessor
oznamuje, že se bude měnit nejen, když se změní zpracování objednávek, ale také když
se změní zpracování faktur. Jednoduché, což? Proč o tomhle jednoduchém principu vůbec
dále mluvit?
&lt;/p&gt;
&lt;p&gt;
V diskuzi se o SRP &lt;a href="http://php.vrana.cz/prace-s-vlastnostmi-pomoci-metod.php#d-11965"&gt;mluví
(viz i příspěvky níže&lt;/a&gt;), ale diskutující tam ve&amp;nbsp; své argumentaci používají
něco, čemu na kurzech u SRP říkám falešné alternativy.
&lt;/p&gt;
&lt;p&gt;
Mějme stejně jako v diskusi svou třídu Image, která nese informace o obrázku. Obrázek
chceme uložit.
&lt;/p&gt;
&lt;p&gt;
Varianta 1, kdy obrázek nese informace a současně nabízí metodu Save, ve které uloží
data do souboru.
&lt;/p&gt;
&lt;script src="https://gist.github.com/1009256.js"&gt; &lt;/script&gt;
&lt;p&gt;
Co je v diskuzi vyčítáno této třídě? Porušuje princip jedné odpovědnosti, protože
podle některých (Jiří Knesl, Ondřej Mirteš)&amp;nbsp; řeší dvě věci najednou – &lt;strong&gt;nese
data o obrázku a současně data ukládá. &lt;/strong&gt;Souhlasím, že jde o porušení SRP,
ale hlavním důvodem je to, že metoda Save je napsána tak,&amp;nbsp; že třídu Image ukládáme &lt;strong&gt;vždy &lt;/strong&gt;do
souboru. Co když budeme chtít třídu Image uložit do nějakého “response” streamu na
webovém serveru, nebo uložit přímo do databáze? Tuto třídu skutečně budeme měnit ze
dvou důvodů – jednou, když přidáme nebo odebereme informace o obrázku a také, když
budeme chtít ukládat obrázek do databáze, musíme rozšířit stávající metodu Save, což
povede k tomu, že metoda bude mít v sobě nějaký podivný switch a&amp;nbsp; bude trpět
smíšenou odpovědností, protože bude dělat několik věcí najednou,&amp;nbsp; nebo můžeme
přidat novou samostatnou metodu SaveToDb. 
&lt;/p&gt;
&lt;p&gt;
Jedinou (!?) alternativou v diskuzi k tomuto postupu je vyvedení odpovědnosti za ukládání
do různých úložišť do samostatných objektů, které mohou být&amp;nbsp; skryty za jednotným
rozhraním.
&lt;/p&gt;
&lt;script src="https://gist.github.com/1009269.js"&gt; &lt;/script&gt;
&lt;p&gt;
Toto řešení důsledně separuje odpovědnosti, navíc je velmi snadné přidat další implementaci
rozhraní IImagePersistor, např. DbPersistor, který data uloží do databáze. Už v diskuzi
Jakub Vrána ale upozorňuje na to, že se mu nelíbí, jak se řešení komplikuje pro uživatele-vývojáře,
který s třídami bude pracovat, protože tento vývojář musí vědět, že existuje nějaký
IImagePersistor/FilePersistor odpovědný za uložení dat. Třída Image nestačí k tomu,
abyste dokázali vygenerovat data obrázku a uložit je, což může být ve vaší knihovně
častý scénář. Také bych rád poprvé v tomto článku připomněl princip OOP, ke kterému
se za chvíli vrátím, že &lt;strong&gt;objekt představuje jednotu svého stavu a chování,
které je pro tento stav definováno. &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Psal jsem o falešných alternativách, můžeme najít i jiná řešení. Co ponechat
metodu Save ve třídě Image, ale z třídy Image udělat tzv kompozitor - objekt, který
skládá své chování tak, že využívá další pomocné objekty, na kterých závisí, a nabízí
intuitivní rozhraní pro klienty. &lt;/strong&gt;
&lt;/p&gt;
&lt;script src="https://gist.github.com/1009274.js"&gt; &lt;/script&gt;
&lt;p&gt;
Odpovědnosti jsou stále separovány a dokonce třída Image, náš kompozitor, dodržuje
pravidlo, které říká, že kompozitor by měl být jednodušší než suma funkcí jeho pomocných
objektů.&amp;nbsp; Klient třídy Image nemusí pracovat přímo s třídou FilePersistor, a
přitom nemáme kód pro ukládání do souboru přímo ve třídě Image. Problém je, že metoda
Save třídy Image vždy vytváří FilePersistor. Klient třídy Image si nemůže vyžádat
to námi dříve zmiňované ukládání obrázku do databáze, a navíc třída Image závisí na
jedné konkrétní třídě FilePersistor, u níž přímo volá konstruktor. &lt;strong&gt;V třídě
Image mixujeme vytváření grafu spolupracujících objektů se samotným použitím pomocných
objektů. Opět jde o dvě odpovědnosti, které bychom měli oddělit – SRP, nezapomeňme.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Nejprve ale zkusme vyřešit problém s tím, že klient nemůže ukládat data do databáze,
protože třída Image ukládá data vždy do souboru.
&lt;/p&gt;
&lt;script src="https://gist.github.com/1009285.js"&gt; &lt;/script&gt;
&lt;p&gt;
Jednoduše přidáme další variantu metody, která přijímá odkaz na IImagePersistor, v
našem případě třeba na DbPersistor. Původní metoda Save bez argumentů řeší ukládání
do souboru. Ukládání do souboru je nejčastější scénář, který je zvolen jako výchozí.
Stále ale tady máme problém s tím, že v metodě Save konstruujeme "natvrdo" FilePersistor.
A navíc naše API klientům trochu lže. V podtextu klientovi sděluje, že výchozí metoda
Save nemá žádné další závislosti, i když z implementace, !a jen z implementace!,&amp;nbsp;
je zřejmé, že jsme závislí na přítomnosti třídy FilePersistor. &lt;em&gt;Poznámka: V C#
4 můžeme použít volitelné argumenty u jedné metody, ale na principu této varianty
řešení se moc nemění.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Zkusme naše prozatím ulhané API vylepšit a dodržet SRP.&amp;nbsp; Oddělme nyní konstrukci
pomocných objektů, na kterých závisíme, od jejich použití v metodě Save. 
&lt;/p&gt;
&lt;script src="https://gist.github.com/1009297.js"&gt; &lt;/script&gt;
&lt;p&gt;
Objekt Image si nyní v konstruktoru vynucuje předání IIMagePersitoru. Když klient
IImagePersistor nepředá, objekt nezvznikne – sám konstruktor garantuje, že buď objekt
Image má vyplněny všechny závislosti, nebo vůbec nevznikne. Vytvořili jsme konstruktor,
který může použít a automaticky naplnit DI kontajner, nebo různé abstraktní továrny
registrované v DI kontajneru&amp;nbsp; apod. &lt;strong&gt;DI kontajner je přesně tím objektem,
který by měl být v aplikaci odpovědný za konstrukci grafu objektů,&lt;/strong&gt; v metodě
Save objektu Image injektovaný IImagePersistor jen používáme. SRP v praxi.
&lt;/p&gt;
&lt;p&gt;
Možný že ale v tomto případě je injektování závislostí přes konstruktor moc striktní.
Co když nám skutečně vyhovuje, že můžeme bez DI kontajneru vytvořit objekt Image,
který bude data ukládat do souboru. Pak můžeme využít injektování přes vlastnosti,
kdy příslušnou vlastnost po vzniku objektu vyplníme rozumnou výchozí hodnotou – v
našem případě instancí FilePersistoru. Poté ale platí, že třídu Image stále částečně
zatěžujete konstrukcí objektů…&lt;br&gt;
U většiny DI kontajnerů je preferováno injektování závislostí přes konstruktory, všechny,
které znám,&amp;nbsp; si ale poradí ale i s injektováním závislostí přes vlastností a
u &lt;a href="http://www.google.cz/search?hl=cs&amp;amp;source=hp&amp;amp;q=MEF+MSDN&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq="&gt;MEF&lt;/a&gt;u
bych řekl, že injektování závislostí pomocí vlastností hrají prim.
&lt;/p&gt;
&lt;script src="https://gist.github.com/1009315.js"&gt; &lt;/script&gt;
&lt;p&gt;
Všechny tyto varianty mají své výhody a nevýhody a asi nemusím zdůrazňovat, že ani
jedna není univerzálním kladivem. Varianty s injektováním závislostí (konstruktor,
metoda, vlastnost) jsou samozřejmě mnohem lépe testovatelné.
&lt;/p&gt;
&lt;p&gt;
Dokážu přidat i další příklady, ale chtěl jsem,&amp;nbsp; abyste viděli, že SRP není ani
nesmysl, ale ani princip, který by, podobně jako to zaznělo v diskuzi, sděloval –
existují jen dvě alternativy, jak rozdělovat odpovědnosti, a ZROVNA TA TVOJE JE ŠPATNĚ.
&lt;/p&gt;
&lt;p&gt;
A poslední&amp;nbsp; poznámka:
&lt;/p&gt;
&lt;p&gt;
Jiřé Knesl také v diskuzi uvedl: “ objekt buďto data reprezentuje (pak má settery/gettery),
nebo vykonává činnost (pak dostane data parametry)”. Tohle je podle mě&amp;nbsp; postoj
blízký hlavně některým Javistům, o čemž svědčí i podle mého soudu schematický a nevěrohodný &lt;a href="http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html"&gt;článek,
který se zabývá vlastnostmi v Javě&lt;/a&gt; a na který se J. Knesl odkazuje. Znovu připomínám,
že &lt;strong&gt;objekt představuje jednotu svého stavu a chování, které je pro tento stav
definováno.&amp;nbsp; &lt;/strong&gt;Objekt, který má jen gettery a settery, je ”krabičkou na
data”, pouhou strukturou známou i z neobjektových jazyků, a když má objekt jen metody,
tak jde o (v mnoha případech skutečně globální) funkce/procedury, které prefixujeme
názvem proměnné/třídy. V diskuzi to myslím nezaznělo, ale když někdo razí tuto drastickou
separaci chování od samotných dat, často dodává, že takto je to přece definováno Evansem,
tedy autoritou,&amp;nbsp; v kanonické knize o &lt;a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215"&gt;Domain
Driven Designu&lt;/a&gt;. Když se ptám, kde o tom Evans mluví, dozvím se, že Evans má objekty,
které mají svůj stav (vlastnosti)&amp;nbsp; a s objekty pracují speciální business-doménové
služby (chování). I když mám vůči DDD spoustu výhrad, zde Evanse špatně interpretují
– Evans by model, kde objekty mají jen stav a nemají žádné chování, nazval &lt;a href="http://martinfowler.com/bliki/AnemicDomainModel.html"&gt;anemickým
modelem&lt;/a&gt; – izolovaná data podepřená berličkami nesouvisejících globálních funkcí.
Business služby jsou, zjednodušeně řečeno, určeny pro zapsání složitější business
logiky, na které spolupracuje více objektů a žádný participující objekt není sám o
sobě přirozeným kandidátem, do kterého by bylo vhodné logiku situovat.
&lt;/p&gt;
&lt;p&gt;
Zde bych mohl pokračovat dále k rozdělení objektů v DDD, ke skutečnému významu vlastností
u objektu, co říká princip “tell, don't ask”, ale už teď mi původně krátký komentář
k SRP a DDD až moc nabobtnal. Když budete mít zájem o další naznačená témata, napište
prosím komentář k článku.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=59132463-8265-453d-b94a-d44bc3a07878" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,59132463-8265-453d-b94a-d44bc3a07878.aspx</comments>
      <category>Analytické drobky</category>
      <category>C#</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=d106e718-5c10-4f2a-8de5-70979fbdd7bc</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,d106e718-5c10-4f2a-8de5-70979fbdd7bc.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,d106e718-5c10-4f2a-8de5-70979fbdd7bc.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d106e718-5c10-4f2a-8de5-70979fbdd7bc</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Dostal jsme dotaz, jak si poradit s odstraňováním chyb u starší a rozsáhlé aplikace.
Když jsem odepisoval, uvědomil jsem si, že sepisuju jakési “triviální  desatero
vývoje”", které se snažím už dlouhou dobu svému okolí vtloukat dohlavy. I když jde
o triviální zásady, budu příště odkazovat raději na tento příspěvek, než abych vše
opakoval pokaždé znovu. Jméno firmy je v textu nahrazenou souslovím “anonymní firma”.
</p>
        <p>
          <em>“Zdravím,<br />
to je na hodně dlouhý příspěvek.<br />
Alespoň tedy:</em>
        </p>
        <p>
          <em>1) Je nutné zrušit umělou hranici mezi vývojáři a testery. Žádná výměna informací
přes šéfy oddělení nebo pověřené osoby.</em>
        </p>
        <p>
          <em>2) Na každou objevenou chybu musí být napsán automatický test, který zajistí,
že chyba neprobublá do dalších releasů. Bez toho žádné organizační opatření nefunguje.
Bez napsaného testu se chyba nepovažuje za odstraněnou, ale jen za náhodou se nyní
neprojevující.</em>
        </p>
        <p>
          <em>3) Vytvořit malé sebeorganizující týmy odpovědné za určitou část projektu (nastálo,
nebo do dalšího releasu). V čele team leader, který garantuje kvalitu. Team leader
je k dispozici i testerům a řeší nesrovnalosti v analýze a systémovém designu. S dalšími
team leadery řeší problémy integrace různých částí projektu. <strong>Team leader ale
stále většinu času kóduje, není to embryo vychovávané pro střední management</strong>.</em>
        </p>
        <p>
          <em>4) Je potřeba postupně napsat velké množství automatických testů (unit, integrační,
akceptační) tak, aby se testeři věnovali hlavně novým záležitostem v releasu a aby
vývojáři ani testeři nebyli obětí "ručně prováděných" regresních testů, které mají
formu nikdy nekončícího debugování. <strong>Tím se i zkrátí doba, kterou "anonymní
firma" nutně musí trávit opakovaným debugováním a "ručním" nalézáním příčin chyb.</strong> Automatizované
testy představují práci, která se na projektech vyplatí, a navíc jde i o mnohem levnější
řešení problému, než nabírání dalších a dalších testerů.</em>
        </p>
        <p>
          <em>5) Nedávat žádné fixní odhady na odstranění chyb ani nikoho exkluzivně nealokovat
jen na odstraňování chyb. Vývojář není a přes různé manažerské poučky ani nebude anonymní
zdroj, který sebereme z jiného projektu, posadíme k aplikaci, kterou nezná, ale u
které dostane befelem, že za jednu normohodinu musí odstranit 20 bugů. Tato kouzla
fungují jenom v Excelu. V reálném světě vývojář těch 20 bugů neodstraní, ani když
ho posadíte do open space, který  je oblepen motivačním majstrštykem vytisknutým
z PowerPointu nejlepším absolventem MBA.<br /><br />
Pokud se objeví chyba, chopí se jí člověk, který za danou oblast odpovídá (konflikty
přinejhorším vyřeší team leadeři). Vývojář neustále čte a refaktorizuje kód, pokud
možno ihned také odstraňuje chyby . A jsme opět u testů - dokud ty automatizované
testy mít nebudete, vývojáři do kódu raději nezasahují, protože nevědí, kde všude
se změna projeví a raději neriskují další možnou příčinu pádu aplikace po nasazení
u zákazníka. A psát použitelné, ne jen formální-švejkovské testy, kdy se hodnotí "jen
code coverage", se musí všichni vývojáři naučit a nějakou dobu to zabere.</em>
        </p>
        <p>
          <em>Mám zkušenost s 12 let starou aplikací psanou původně pro VB, poté čátečně přepsanou
na .Net Framework,  která byla po 9 letech <strong>postupně </strong>obalena
testy, a ani dnes sice nejde o žádnou vývojářskou lahůdku, ale pracuje se na ní beze
strachu, co při každé změně v aplikaci zničíme. Nic jiného než to, co píšu výše, se
mi neosvědčilo.</em>
        </p>
        <p>
          <em>A pak další záležitosti jako (nutné) bonbonky:<br /></em>
        </p>
        <ul>
          <li>
            <em>Neztrácet čas “mergováním” změn v něčem tak zastaralém a nepohodlném jako je Subversion.
V Mercurialu (GITu) je propagace změn z vývojové větve do hlavní (a zpět) otázka chvíle.
V Subversion ani TFS jsem po pár zkušenostech raději moc "branchů" nedělal.<br /></em>
          </li>
          <li>
            <em>Automatické buildy spojené s již napsanými testy.<br /></em>
          </li>
          <li>
            <em>Automatické nasazení nové verze aplikace, aby testeři nemuseli pátrat, kde seženou
novou verzi a také, aby nasazení do produkčního prostředí neznamenalo 3denní práci
party lidí, kteří se metodou pokus-omyl snaží dostat aplikaci do použitelného stavu
u zákazníka.<br /></em>
          </li>
          <li>
            <em>Alespoň u nováčků code review, abyste rychle odstranili jejich špatné návyky.<br /></em>
          </li>
          <li>
            <em>Statická analýza kódu.</em>
          </li>
        </ul>
        <p>
          <em>A dovolím si jednu soukromou poznámku k "anonymní firmě" - pokud možno zredukovat/vyhodit
všechny těžkotonážní, neskutečně drahé a pro vývojáře zabijácké nápady se zavedením
nejhorší možné formy vodopádu  - analýza-&gt;samostatný systémový design-&gt;vývoj-&gt;testy,
v jehož bludném pádu se bude produkovat množství dokumentů, navíc rychlokvašenými
analytiky/designery, v mizerné kvalitě a bez vazby na skutečné potřeby projektu. Analýza
a systémový design jsou fáze projektu, které pomáhají jen do doby, než se jich chytí
nějaký exot, který nikdy žádnou aplikaci nevyvíjel a který si myslí, že analytická
práce spočívá ve štosování nahodilých myšlenek zákazníka do příslušné šablony pro
use case. Což je dle mých zkušeností většina “čistých”, míněno vývojem nedotčených,
analytiků na pracovním trhu.</em>
        </p>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=d106e718-5c10-4f2a-8de5-70979fbdd7bc" />
      </body>
      <title>P&amp;aacute;r trivi&amp;aacute;ln&amp;iacute;ch pozn&amp;aacute;mek k v&amp;yacute;voji aplikac&amp;iacute;</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,d106e718-5c10-4f2a-8de5-70979fbdd7bc.aspx</guid>
      <link>http://blog.renestein.net/Paacuter+Triviaacutelniacutech+Poznaacutemek+K+Vyacutevoji+Aplikaciacute.aspx</link>
      <pubDate>Mon, 30 May 2011 08:31:24 GMT</pubDate>
      <description>&lt;p&gt;
Dostal jsme dotaz, jak si poradit s odstraňováním chyb u starší a rozsáhlé aplikace.
Když jsem odepisoval, uvědomil jsem si, že sepisuju jakési “triviální&amp;nbsp; desatero
vývoje”", které se snažím už dlouhou dobu svému okolí vtloukat dohlavy. I když jde
o triviální zásady, budu příště odkazovat raději na tento příspěvek, než abych vše
opakoval pokaždé znovu. Jméno firmy je v textu nahrazenou souslovím “anonymní firma”.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;“Zdravím,&lt;br&gt;
to je na hodně dlouhý příspěvek.&lt;br&gt;
Alespoň tedy:&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;1) Je nutné zrušit umělou hranici mezi vývojáři a testery. Žádná výměna informací
přes šéfy oddělení nebo pověřené osoby.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;2) Na každou objevenou chybu musí být napsán automatický test, který zajistí,
že chyba neprobublá do dalších releasů. Bez toho žádné organizační opatření nefunguje.
Bez napsaného testu se chyba nepovažuje za odstraněnou, ale jen za náhodou se nyní
neprojevující.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;3) Vytvořit malé sebeorganizující týmy odpovědné za určitou část projektu (nastálo,
nebo do dalšího releasu). V čele team leader, který garantuje kvalitu. Team leader
je k dispozici i testerům a řeší nesrovnalosti v analýze a systémovém designu. S dalšími
team leadery řeší problémy integrace různých částí projektu. &lt;strong&gt;Team leader ale
stále většinu času kóduje, není to embryo vychovávané pro střední management&lt;/strong&gt;.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;4) Je potřeba postupně napsat velké množství automatických testů (unit, integrační,
akceptační) tak, aby se testeři věnovali hlavně novým záležitostem v releasu a aby
vývojáři ani testeři nebyli obětí "ručně prováděných" regresních testů, které mají
formu nikdy nekončícího debugování. &lt;strong&gt;Tím se i zkrátí doba, kterou "anonymní
firma" nutně musí trávit opakovaným debugováním a "ručním" nalézáním příčin chyb.&lt;/strong&gt; Automatizované
testy představují práci, která se na projektech vyplatí, a navíc jde i o mnohem levnější
řešení problému, než nabírání dalších a dalších testerů.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;5) Nedávat žádné fixní odhady na odstranění chyb ani nikoho exkluzivně nealokovat
jen na odstraňování chyb. Vývojář není a přes různé manažerské poučky ani nebude anonymní
zdroj, který sebereme z jiného projektu, posadíme k aplikaci, kterou nezná, ale u
které dostane befelem, že za jednu normohodinu musí odstranit 20 bugů. Tato kouzla
fungují jenom v Excelu. V reálném světě vývojář těch 20 bugů neodstraní, ani když
ho posadíte do open space, který&amp;nbsp; je oblepen motivačním majstrštykem vytisknutým
z PowerPointu nejlepším absolventem MBA.&lt;br&gt;
&lt;br&gt;
Pokud se objeví chyba, chopí se jí člověk, který za danou oblast odpovídá (konflikty
přinejhorším vyřeší team leadeři). Vývojář neustále čte a refaktorizuje kód, pokud
možno ihned také odstraňuje chyby . A jsme opět u testů - dokud ty automatizované
testy mít nebudete, vývojáři do kódu raději nezasahují, protože nevědí, kde všude
se změna projeví a raději neriskují další možnou příčinu pádu aplikace po nasazení
u zákazníka. A psát použitelné, ne jen formální-švejkovské testy, kdy se hodnotí "jen
code coverage", se musí všichni vývojáři naučit a nějakou dobu to zabere.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Mám zkušenost s 12 let starou aplikací psanou původně pro VB, poté čátečně přepsanou
na .Net Framework,&amp;nbsp; která byla po 9 letech &lt;strong&gt;postupně &lt;/strong&gt;obalena
testy, a ani dnes sice nejde o žádnou vývojářskou lahůdku, ale pracuje se na ní beze
strachu, co při každé změně v aplikaci zničíme. Nic jiného než to, co píšu výše, se
mi neosvědčilo.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;A pak další záležitosti jako (nutné) bonbonky:&lt;br&gt;
&lt;/p&gt;
&gt; 
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Neztrácet čas “mergováním” změn v něčem tak zastaralém a nepohodlném jako je Subversion.
V Mercurialu (GITu) je propagace změn z vývojové větve do hlavní (a zpět) otázka chvíle.
V Subversion ani TFS jsem po pár zkušenostech raději moc "branchů" nedělal.&lt;br&gt;
&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Automatické buildy spojené s již napsanými testy.&lt;br&gt;
&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Automatické nasazení nové verze aplikace, aby testeři nemuseli pátrat, kde seženou
novou verzi a také, aby nasazení do produkčního prostředí neznamenalo 3denní práci
party lidí, kteří se metodou pokus-omyl snaží dostat aplikaci do použitelného stavu
u zákazníka.&lt;br&gt;
&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Alespoň u nováčků code review, abyste rychle odstranili jejich špatné návyky.&lt;br&gt;
&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Statická analýza kódu.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;em&gt;A dovolím si jednu soukromou poznámku k "anonymní firmě" - pokud možno zredukovat/vyhodit
všechny těžkotonážní, neskutečně drahé a pro vývojáře zabijácké nápady se zavedením
nejhorší možné formy vodopádu&amp;nbsp; - analýza-&amp;gt;samostatný systémový design-&amp;gt;vývoj-&amp;gt;testy,
v jehož bludném pádu se bude produkovat množství dokumentů, navíc rychlokvašenými
analytiky/designery, v mizerné kvalitě a bez vazby na skutečné potřeby projektu. Analýza
a systémový design jsou fáze projektu, které pomáhají jen do doby, než se jich chytí
nějaký exot, který nikdy žádnou aplikaci nevyvíjel a který si myslí, že analytická
práce spočívá ve štosování nahodilých myšlenek zákazníka do příslušné šablony pro
use case. Což je dle mých zkušeností většina “čistých”, míněno vývojem nedotčených,
analytiků na pracovním trhu.&lt;/em&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=d106e718-5c10-4f2a-8de5-70979fbdd7bc" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,d106e718-5c10-4f2a-8de5-70979fbdd7bc.aspx</comments>
      <category>Analytické drobky</category>
      <category>Návrhové vzory</category>
      <category>Ostatní</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=f901aabc-0275-44ef-9865-19317ab5422a</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,f901aabc-0275-44ef-9865-19317ab5422a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=f901aabc-0275-44ef-9865-19317ab5422a</wfw:commentRss>
      <title>Pozv&amp;aacute;nka na kurzy objektov&amp;yacute;ch principů a n&amp;aacute;vrhov&amp;yacute;ch vzorů &amp;ndash; podzim 2011</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,f901aabc-0275-44ef-9865-19317ab5422a.aspx</guid>
      <link>http://blog.renestein.net/Pozvaacutenka+Na+Kurzy+Objektovyacutech+Princip%c5%af+A+Naacutevrhovyacutech+Vzor%c5%af+Ndash+Podzim+2011.aspx</link>
      <pubDate>Mon, 16 May 2011 10:15:38 GMT</pubDate>
      <description>&lt;p&gt;
&lt;p&gt;
Opět vás všechny zvu na pravidelný podzimní běh kurzů &lt;strong&gt;Objektovými principy
a návrhovými vzory řízený design a vývoj kvalitních aplikací 1 &lt;/strong&gt;a &lt;strong&gt;Pokročilé
návrhové vzory a objektové principy 2. &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Novinkou v tomto roce je &lt;em&gt;kurz pro začátečníky&lt;/em&gt; nazvaný Základy objektově
orientovaného návrhu a vývoje. Někteří z vás ho mohli během posledních dvou let absolvovat
ve formě inhouse kurzu pod interním názvem UML 0. Kurz UML 0 vznikl velmi spontánně
jako reakce na požadavky některých firem, které nechtěly rovnou absolvovat stávající
kurzy. &lt;/strong&gt;Nyní je vycizelované UML 0 dostupné i jako veřejný kurz, protože v
emailech se opakovaly žádosti o jeho veřejnou formu od lidí, kteří kurz absolvovali
a nyní na něj chtěli poslat své kolegy.&lt;br&gt;
&lt;br&gt;
O tomto novém kurzu naleznete podrobné informace níže v této pozvánce. &lt;strong&gt;Znovu
opakuji, že se jedná o &lt;em&gt;kurz pro začátečníky&lt;/em&gt;, který dříve v nabídce nebyl,
protože kurzy &lt;strong&gt;Objektovými principy a návrhovými vzory řízený design a vývoj
kvalitních aplikací 1 &lt;/strong&gt;a &lt;strong&gt;Pokročilé návrhové vzory a objektové principy
2 byly a stále jsou určeny pro lidi, kteří základy znají&lt;/strong&gt;. Nenechte se ale
zmást “kódovým” názvem nového kurzu (UML 0), účastníci bývají překvapeni, že s UML
na kurzu zacházíme zcela pragmaticky a bez posvátné úcty, ale i bez módních předsudků
a rychlých odsudků. UML bereme jako nástroj, a ne jako samoúčelný cíl našeho snažení
na kurzu.&lt;/strong&gt; 
&lt;p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;b&gt;Veřejný kurz Základy objektově orientovaného návrhu a vývoje (UML 0)&lt;/b&gt; 
&lt;p&gt;
Datum konání kurzu: &lt;strong&gt;19. 9. – 21. 9. 2011&lt;/strong&gt; 
&lt;p&gt;
Místo konání&lt;strong&gt;: &lt;/strong&gt; 
&lt;p&gt;
&lt;a href="http://www.tutor.cz/"&gt;Školící středisko Tutor&lt;/a&gt; 
&lt;p&gt;
U Půjčovny 2&lt;br&gt;
110 00 Praha 1 
&lt;p&gt;
&lt;em&gt;Po celý den máme k dispozici wifi připojení a samozřejmě také teplé a studené
nápoje. V ceně kurzu jsou obědy v hotelu.&lt;/em&gt; 
&lt;p&gt;
&lt;a href="http://renestein.net/Nabidka.aspx#skoleniOOP0"&gt;Podrobné informace o kurzu
a možnost přihlásit se na kurz&lt;/a&gt; 
&lt;p&gt;
&lt;a href="http://renestein.net/Skoleni-Zaklady-Objektove-Orientovaneho-Navrhu-UML-0.aspx"&gt;Program
kurzu&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://renestein.net/Casto-Kladene-Dotazy-Kurzy-FAQ.aspx"&gt;FAQ - často kladené
dotazy ke kurzům&lt;/a&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;b&gt;Veřejný kurz Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních
aplikací 1&lt;/b&gt; 
&lt;p&gt;
Datum konání kurzu: &lt;strong&gt;10. 10. – 12. 10. 2011&lt;/strong&gt; 
&lt;p&gt;
Místo konání&lt;strong&gt;: &lt;/strong&gt; 
&lt;p&gt;
&lt;a href="http://www.tutor.cz/"&gt;Školící středisko Tutor&lt;/a&gt; 
&lt;p&gt;
U Půjčovny 2&lt;br&gt;
110 00 Praha 1 
&lt;p&gt;
&lt;em&gt;Po celý den máme k dispozici wifi připojení a samozřejmě také teplé a studené
nápoje. V ceně kurzu jsou obědy v hotelu.&lt;/em&gt; 
&lt;p&gt;
&lt;a href="http://blog.renestein.net/ct.ashx?id=d6fd9894-f5cd-4d7d-9e78-53974f98d52d&amp;url=http%3a%2f%2fwww.renestein.net%2fNabidka.aspx%23skoleni"&gt;Podrobné
informace o kurzu a možnost přihlásit se na kurz&lt;/a&gt; 
&lt;p&gt;
&lt;a href="http://blog.renestein.net/ct.ashx?id=d6fd9894-f5cd-4d7d-9e78-53974f98d52d&amp;url=http%3a%2f%2fwww.renestein.net%2fSkoleni-UML-OOP-Navrhove-vzory-1.aspx"&gt;Program
kurzu&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href="http://blog.renestein.net/ct.ashx?id=d6fd9894-f5cd-4d7d-9e78-53974f98d52d&amp;url=http%3a%2f%2fwww.renestein.net%2fOhlasy-Ucastniku-Na-Kurzy.aspx"&gt;Výběr
z ohlasů na kurz&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://renestein.net/Casto-Kladene-Dotazy-Kurzy-FAQ.aspx"&gt;FAQ - často kladené
dotazy ke kurzům&lt;/a&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;b&gt;Veřejný kurz Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních
aplikací 2&lt;/b&gt; 
&lt;p&gt;
Datum konání kurzu: &lt;strong&gt;24. 10. – 26. 10. 2011&lt;/strong&gt; 
&lt;p&gt;
Místo konání&lt;strong&gt;: &lt;/strong&gt; 
&lt;p&gt;
&lt;a href="http://www.tutor.cz/"&gt;Školící středisko Tutor&lt;/a&gt; 
&lt;p&gt;
U Půjčovny 2&lt;br&gt;
110 00 Praha 1 
&lt;p&gt;
&lt;em&gt;Po celý den máme k dispozici wifi připojení a samozřejmě také teplé a studené
nápoje. V ceně kurzu jsou obědy v hotelu.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.renestein.net/Nabidka.aspx#SkoleniOOP2"&gt;Podrobné informace o kurzu
a možnost přihlásit se na kurz&lt;/a&gt; 
&lt;p&gt;
&lt;a href="http://www.renestein.net/Skoleni-Navrhove-vzory-2.aspx"&gt;Program kurzu&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href="http://www.renestein.net/Ohlasy-Ucastniku-Na-Kurzy.aspx"&gt;Výběr z ohlasů na
kurzy&lt;/a&gt; 
&lt;br&gt;
&lt;br&gt;
&lt;a href="http://renestein.net/Casto-Kladene-Dotazy-Kurzy-FAQ.aspx"&gt;FAQ - často kladené
dotazy ke kurzům&lt;/a&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;b&gt;Program nového kurzu Základy objektově orientovaného návrhu a vývoje (UML 0)&lt;/b&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Předpokládané znalosti účastníků&lt;/strong&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Základní přehled o etapách vývoje projektu. 
&lt;br&gt;
&lt;li&gt;
Vhodné je mít nějaké vlastní zkušenosti z analýzy a vývoje projektů, abychom mohli
porovnat různé postupy a doporučení a jejich použitelnost v praxi. 
&lt;br&gt;
&lt;li&gt;
Chuť se učit.;) Schopnost pohlédnout na některá domněle známá témata bez předsudků. 
&lt;br&gt;
&lt;li&gt;
Částečná znalost UML je vhodná, ale u tohoto kurzu není vyžadována. Vhodná je hlavně
pro konfrontaci vlastních zkušeností s tím, co zazní o použitelnosti různých částí
UML na kurzu. 
&lt;br&gt;
&lt;li&gt;
Nenávist ke kariéře zručného "bušiče", nikým nerespektovaného projektového vedoucího
(tzv. sekretářky 2.0) a neschopného analytika / vývojáře. 
&lt;br&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;strong&gt;Obecné informace ke kurzu&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Pro vývojáře se u konstrukcí a prvků jazyka UML, které jsou považovány za analytické,
dělají časté odbočky do kódu, aby vývojáři pochopili, že UML ani principy OOP nejsou
nějaké nesmyslné abstrakce, ale užitečné konstrukce, které sami v programovacích jazycích
používají denně. U role analytika stále zdůrazňuji, jaké znalosti z oblasti vývoje
aplikací musí analytik mít, aby byl pro projekt užitečný a nevytvářel jen dokumentaci
pro dokumentaci, kterou vývojáři nevyužijí a (až příliš často oprávněně) ji považují
za nesmyslnou, drahou a hlavně vyvíjenému projektu nic nepřinášející. Kurz je určen
pro vývojáře, systémové designery, analytiky a projektové manažery, kteří se chtějí
seznámit se základními principy objektového programování a s modelováním v jazyce
UML. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Program školení &lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Proč má dnes UML v některých kruzích špatnou pověst? Musíte být těžkotonážní rytíři
cválající na drahých CASE nástrojích a neživotných formálních projektových metodikách,
nebo si vystačíte s nástroji a postupy, které zachytí vaše myšlenky, ale nenutí vás
přizpůsobovat se "Jen Tomu Jedinému Pravému Stylu Návrhu A Vývoje"?&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Dostali jste poptávku, máte za pár dní dodat nabídku a v seznamu svých dovedností
nenalézáte jasnovidectví ani nemáte po ruce čarovnou skleněnou kouli, abyste zákazníkovi
do nabídky vyvěštili konečnou cenu i datum dokončení projektu? Co dělat v počáteční
fázi projektu, kdy ještě ani nevíte, jestli budete projekt vyvíjet? 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Požadavky na systém. Jak je to s případy užití? Má vlastní zrychlená funkční specifikace
bez zbytečných formalit. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Rozsáhlé ukázky fukčních specifikací z projektů. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Diagram tříd v UML. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Rozdíl mezi analytickým diagramem tříd a diagramem tříd vytvářeným ve fázi systémového
designu - existuje takový rozdíl, nebo jde jen o další hloupý mýtus? 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Třída - základní principy OOP, operace, atributy, viditelnost členů třídy. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Vztahy mezi elementy diagramu (asociace, agregace, generalizace, závislost, realizace)
– vše vykládáno na konkrétních příkladech z praxe + ukázky nejčastějších chyb, se
kterými jsem se setkal. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Dobře zapamatovatelné principy návrhu známé pod zkratkou SOLID v příkladech. Unit
testy, integrační testy, akceptační testy - skutečně si stále myslíte, že se bez nich
na projektech obejdete? 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Nejen SOLIDní principy stojí v pozadí návrhu aplikací... 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Nenásilný přechod k jednoduchým návrhovým vzorům. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Příklady složitých diagramů tříd. Jak je udržovat v souladu s napsaným kódem? A musíme
je udržovat? Co se na projektech vyplatí dělat a co projekt spolehlivě zabije? 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Objektový diagram + příklady. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Diagramy a diagramy interakce. Příklady. Typy projektů, pro které se tyto diagramy
hodí. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Vysvětlení stavových diagramů + výhody aplikací řízených přesně definovanými stavovými
automaty. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Diagram aktivit - modelování složitých business procesů v organizaci. Hrajete si s
diagramem aktivit rádi, ale ocení to Váš zákazník? 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Vrstvy a moduly v aplikaci – architektura aplikace. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Relační a objektový svět? Stále jediné možné partnerství z rozumu? 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Nasazení aplikace – výklad Component &amp; Deployment diagramů. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
OOP a jeho vztah UML. Vztah UML a OOP k projektové praxi a realitě. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Výhody a nevýhody UML – vyzdvižení nejvíce používaných postupů, odhození nepotřebné
veteše z jazyka UML. 
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Odpovědi na dotazy frekventantů kurzu. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
Těším se s Vámi na setkání na kurzu!
&lt;/p&gt;
&lt;p&gt;
René Stein 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=f901aabc-0275-44ef-9865-19317ab5422a" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,f901aabc-0275-44ef-9865-19317ab5422a.aspx</comments>
      <category>Analytické drobky</category>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=eb87dd26-6375-4362-abfc-2fd0b13fca84</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,eb87dd26-6375-4362-abfc-2fd0b13fca84.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,eb87dd26-6375-4362-abfc-2fd0b13fca84.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=eb87dd26-6375-4362-abfc-2fd0b13fca84</wfw:commentRss>
      <title>Pozv&amp;aacute;nka na m&amp;eacute; kurzy OOP, UML a n&amp;aacute;vrhov&amp;yacute;ch vzorů a odpovědi na někter&amp;eacute; dotazy zaslan&amp;eacute; emailem - podzim 2010</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,eb87dd26-6375-4362-abfc-2fd0b13fca84.aspx</guid>
      <link>http://blog.renestein.net/Pozvaacutenka+Na+Meacute+Kurzy+OOP+UML+A+Naacutevrhovyacutech+Vzor%c5%af+A+Odpov%c4%9bdi+Na+N%c4%9bktereacute+Dotazy+Zaslaneacute+Emailem+Podzim+2010.aspx</link>
      <pubDate>Sat, 18 Sep 2010 09:17:31 GMT</pubDate>
      <description>Opět bych Vás všechny rád  pozval na pravidelný podzimní běh kurzů Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních aplikací 1 a Pokročilé návrhové vzory a objektové principy 2. Níže také naleznete odpovědi na pravidelně se opakující dotazy v emailech. 
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=eb87dd26-6375-4362-abfc-2fd0b13fca84"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,eb87dd26-6375-4362-abfc-2fd0b13fca84.aspx</comments>
      <category>Analytické drobky</category>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=cd84ce22-c766-49cc-ace9-f003bdb104e2</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,cd84ce22-c766-49cc-ace9-f003bdb104e2.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,cd84ce22-c766-49cc-ace9-f003bdb104e2.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=cd84ce22-c766-49cc-ace9-f003bdb104e2</wfw:commentRss>
      <title>Pozv&amp;aacute;nka na kurz Objektov&amp;yacute;mi principy a n&amp;aacute;vrhov&amp;yacute;mi vzory ř&amp;iacute;zen&amp;yacute; design a v&amp;yacute;voj kvalitn&amp;iacute;ch aplikac&amp;iacute; 1 &amp;ndash; jaro 2010</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,cd84ce22-c766-49cc-ace9-f003bdb104e2.aspx</guid>
      <link>http://blog.renestein.net/Pozvaacutenka+Na+Kurz+Objektovyacutemi+Principy+A+Naacutevrhovyacutemi+Vzory+%c5%98iacutezenyacute+Design+A+Vyacutevoj+Kvalitniacutech+Aplikaciacute+1+Ndash+Jaro+2010.aspx</link>
      <pubDate>Wed, 07 Apr 2010 11:48:36 GMT</pubDate>
      <description>Rád bych Vás pozval na další běh kurzu Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních aplikací 1. Pokud se někdo z Vás (oprávněně) diví, proč tak pozdě a proč Vás nezvu i na kurz OOP 2, níže v tomto spotu nalezne odpovědi. &lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=cd84ce22-c766-49cc-ace9-f003bdb104e2"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,cd84ce22-c766-49cc-ace9-f003bdb104e2.aspx</comments>
      <category>Analytické drobky</category>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=d28b9cd9-bf78-4e1f-8407-3a213baad863</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,d28b9cd9-bf78-4e1f-8407-3a213baad863.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,d28b9cd9-bf78-4e1f-8407-3a213baad863.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d28b9cd9-bf78-4e1f-8407-3a213baad863</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <title>V&amp;yacute;hody a nev&amp;yacute;hody softwarov&amp;yacute;ch tov&amp;aacute;ren</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,d28b9cd9-bf78-4e1f-8407-3a213baad863.aspx</guid>
      <link>http://blog.renestein.net/Vyacutehody+A+Nevyacutehody+Softwarovyacutech+Tovaacuteren.aspx</link>
      <pubDate>Sun, 21 Mar 2010 10:57:10 GMT</pubDate>
      <description>Emailem jsem dostal zajímavou otázku, jaký je můj názor na softwarové továrny a kde vidím výhody a nevýhody softwarových továren. Odpověď nakonec publikuji i zde – už jen proto, že jsem si při jejím psaní uvědomil, že na továrnu kladu stejné nároky jako na kteroukoli další knihovnu v systému a že výběr softwarové továrny se u mě moc neliší od výběru třeba ORM Frameworku. Nejde o taxativní výčet výhod a nevýhod, ale spíš o volně nahozená témata, která mě za 20 minut psaní příspěvku napadla. &lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=d28b9cd9-bf78-4e1f-8407-3a213baad863"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,d28b9cd9-bf78-4e1f-8407-3a213baad863.aspx</comments>
      <category>.NET Framework</category>
      <category>Analytické drobky</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=a81cbfde-1636-450b-b63c-974e8fe1dae0</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,a81cbfde-1636-450b-b63c-974e8fe1dae0.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a81cbfde-1636-450b-b63c-974e8fe1dae0</wfw:commentRss>
      <title>Pozv&amp;aacute;nka na kurzy - nov&amp;yacute; kurz Pokročil&amp;eacute; n&amp;aacute;vrhov&amp;eacute; vzory a objektov&amp;eacute; principy 2</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,a81cbfde-1636-450b-b63c-974e8fe1dae0.aspx</guid>
      <link>http://blog.renestein.net/Pozvaacutenka+Na+Kurzy+Novyacute+Kurz+Pokro%c4%8dileacute+Naacutevrhoveacute+Vzory+A+Objektoveacute+Principy+2.aspx</link>
      <pubDate>Tue, 11 Nov 2008 15:38:10 GMT</pubDate>
      <description>Rád bych Vás pozval na další běh kurzu Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních aplikací 1 a hlavně Vás chci seznámit se zcela novým kurzem Pokročilé návrhové vzory a objektové principy 2.

Kurz Pokročilé návrhové vzory a objektové principy 2 je volným pokračováním kurzu Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních aplikací 1. Pojetím kurzu Pokročilé návrhové vzory a objektové principy 2 jsem se snažil vyhovět účastníkům předchozícho kurzu, kteří mi, volně parafrázováno, říkali: "Nejlepší jsou ty části, kde probíráme jeden příklad za druhým a kde říkáte  - takto to dělám já." Můj zákazník, můj pán (zvláště, jestliže se v záměrech zcela shodneme :-D) - nový kurz je prošpikován příklady, tipy, kódem, vzorovými aplikacemi. Budu se těšit na oponeturu mých postupů. ;-) ...
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=a81cbfde-1636-450b-b63c-974e8fe1dae0"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,a81cbfde-1636-450b-b63c-974e8fe1dae0.aspx</comments>
      <category>Analytické drobky</category>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=93ed37be-0d20-4625-92b3-3a85f3c568a1</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,93ed37be-0d20-4625-92b3-3a85f3c568a1.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,93ed37be-0d20-4625-92b3-3a85f3c568a1.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=93ed37be-0d20-4625-92b3-3a85f3c568a1</wfw:commentRss>
      <title>Prezentace o &amp;quot;netradičn&amp;iacute;ch&amp;quot; n&amp;aacute;vrhov&amp;yacute;ch vzorech pro CZ JUG ke stažen&amp;iacute;</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,93ed37be-0d20-4625-92b3-3a85f3c568a1.aspx</guid>
      <link>http://blog.renestein.net/Prezentace+O+Quotnetradi%c4%8dniacutechquot+Naacutevrhovyacutech+Vzorech+Pro+CZ+JUG+Ke+Sta%c5%beeniacute.aspx</link>
      <pubDate>Tue, 14 Oct 2008 18:18:42 GMT</pubDate>
      <description>Pro CZJUG jsem přednášel o "netradičních" vzorech - myšleno méně známých  vzorech a možná málo známých aspektech provařených vzorů...&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=93ed37be-0d20-4625-92b3-3a85f3c568a1"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,93ed37be-0d20-4625-92b3-3a85f3c568a1.aspx</comments>
      <category>Analytické drobky</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=5444316a-b000-49d6-991c-311e9abfce7d</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,5444316a-b000-49d6-991c-311e9abfce7d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5444316a-b000-49d6-991c-311e9abfce7d</wfw:commentRss>
      <title>Pozvánka na říjnový termín kurzu Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních aplikací</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,5444316a-b000-49d6-991c-311e9abfce7d.aspx</guid>
      <link>http://blog.renestein.net/Pozv%c3%a1nka+Na+%c5%98%c3%adjnov%c3%bd+Term%c3%adn+Kurzu+Objektov%c3%bdmi+Principy+A+N%c3%a1vrhov%c3%bdmi+Vzory+%c5%98%c3%adzen%c3%bd+Design+A+V%c3%bdvoj+Kvalitn%c3%adch+Aplikac%c3%ad.aspx</link>
      <pubDate>Sun, 18 May 2008 11:11:09 GMT</pubDate>
      <description>Dovolte mi, abych Vás všechny pozval na podzimní termín kurzu Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních aplikací.  Po vyhodnocení některých připomínek jsem se rozhodli změnit místo, kde se školení uskuteční.&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=5444316a-b000-49d6-991c-311e9abfce7d"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,5444316a-b000-49d6-991c-311e9abfce7d.aspx</comments>
      <category>Analytické drobky</category>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=cdf23b82-fc4c-4459-8d0f-345da75d546a</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,cdf23b82-fc4c-4459-8d0f-345da75d546a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,cdf23b82-fc4c-4459-8d0f-345da75d546a.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=cdf23b82-fc4c-4459-8d0f-345da75d546a</wfw:commentRss>
      <title>Pozvánka na podzimní běh kurzu Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních aplikací</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,cdf23b82-fc4c-4459-8d0f-345da75d546a.aspx</guid>
      <link>http://blog.renestein.net/Pozv%c3%a1nka+Na+Podzimn%c3%ad+B%c4%9bh+Kurzu+Objektov%c3%bdmi+Principy+A+N%c3%a1vrhov%c3%bdmi+Vzory+%c5%98%c3%adzen%c3%bd+Design+A+V%c3%bdvoj+Kvalitn%c3%adch+Aplikac%c3%ad.aspx</link>
      <pubDate>Wed, 27 Jun 2007 08:38:11 GMT</pubDate>
      <description>Chci vás pozvat na podzimní termíny kurzu Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních aplikací...&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=cdf23b82-fc4c-4459-8d0f-345da75d546a"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,cdf23b82-fc4c-4459-8d0f-345da75d546a.aspx</comments>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=18f9c200-2d50-4191-b15b-56202de9689e</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,18f9c200-2d50-4191-b15b-56202de9689e.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,18f9c200-2d50-4191-b15b-56202de9689e.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=18f9c200-2d50-4191-b15b-56202de9689e</wfw:commentRss>
      <slash:comments>19</slash:comments>
      <title>Fórum o OOP, UML, návrhových vzorech, MDA, DSL ... - chtěli byste?</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,18f9c200-2d50-4191-b15b-56202de9689e.aspx</guid>
      <link>http://blog.renestein.net/F%c3%b3rum+O+OOP+UML+N%c3%a1vrhov%c3%bdch+Vzorech+MDA+DSL+Cht%c4%9bli+Byste.aspx</link>
      <pubDate>Mon, 11 Sep 2006 13:55:02 GMT</pubDate>
      <description>Nadpis vyjadřuje v kostce vše. Hraji si právě teď s překladem a nastavením YetAnotherForum a napadlo mě, že bych na doméně forum.renestein.net spustil fórum, kde bychom společně diskutovali o návrhu aplikací, systémovém designu, OOP, UML, Model Driven Architecture, DSL, zuřivě bychom se hádali nad best practices, vášnivě "flamovali" nad podporou OOP v různých programovacích jazycích :) nebo si vyměňovali bychom si linky na zajímavé články ...&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=18f9c200-2d50-4191-b15b-56202de9689e"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,18f9c200-2d50-4191-b15b-56202de9689e.aspx</comments>
      <category>Návrhové vzory</category>
      <category>Ostatní</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=5aaa24e7-4394-464c-a777-e47513371630</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,5aaa24e7-4394-464c-a777-e47513371630.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,5aaa24e7-4394-464c-a777-e47513371630.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5aaa24e7-4394-464c-a777-e47513371630</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font color="#ff0000">
            <strong>Update 1.9. 2006  - Kurz je obsazen</strong>
          </font>
        </p>
        <p>
Kvůli velkému zájmu o zářijový termín kurzu Objektovými principy a návrhovými vzory
řízený design a vývoj kvalitních aplikací se bude stejný kurz konat také v termínu
25-27.10. 2006. Přihlásit se je opět možné zasláním emailu na adresu <a href="mailto:petra@renestein.net">petra@renestein.net</a></p>
        <p>
          <a href="http://www.renestein.net/Nabidka.aspx#skoleni">Přejít na podrobné informace
o kurzu včetně přihlášky na kurz</a>
        </p>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=5aaa24e7-4394-464c-a777-e47513371630" />
      </body>
      <title>UPDATE 1.9. 2006 - Pozvání na kurz Objektovými principy a návrhovými vzory řízený design a vývoj kvalitních aplikací v termínu  25-27.10.</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,5aaa24e7-4394-464c-a777-e47513371630.aspx</guid>
      <link>http://blog.renestein.net/UPDATE+19+2006+Pozv%c3%a1n%c3%ad+Na+Kurz+Objektov%c3%bdmi+Principy+A+N%c3%a1vrhov%c3%bdmi+Vzory+%c5%98%c3%adzen%c3%bd+Design+A+V%c3%bdvoj+Kvalitn%c3%adch+Aplikac%c3%ad+V+Term%c3%adnu+252710.aspx</link>
      <pubDate>Sun, 20 Aug 2006 15:59:53 GMT</pubDate>
      <description>&lt;p&gt;
&lt;font color=#ff0000&gt;&lt;strong&gt;Update 1.9. 2006&amp;nbsp; - Kurz je obsazen&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Kvůli velkému zájmu o zářijový termín kurzu Objektovými principy a návrhovými vzory
řízený design a vývoj kvalitních aplikací se bude stejný kurz konat také v termínu
25-27.10. 2006. Přihlásit se je opět možné zasláním emailu na adresu &lt;a href="mailto:petra@renestein.net"&gt;petra@renestein.net&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.renestein.net/Nabidka.aspx#skoleni"&gt;Přejít na podrobné informace
o kurzu&amp;nbsp;včetně přihlášky na kurz&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=5aaa24e7-4394-464c-a777-e47513371630" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,5aaa24e7-4394-464c-a777-e47513371630.aspx</comments>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=15d45bc5-f556-4e18-a4e2-d557634aa322</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,15d45bc5-f556-4e18-a4e2-d557634aa322.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,15d45bc5-f556-4e18-a4e2-d557634aa322.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=15d45bc5-f556-4e18-a4e2-d557634aa322</wfw:commentRss>
      <slash:comments>13</slash:comments>
      <title>Řešení hádanky z 18-.4. -  vztahy Include, Extend v případech užití</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,15d45bc5-f556-4e18-a4e2-d557634aa322.aspx</guid>
      <link>http://blog.renestein.net/%c5%98e%c5%a1en%c3%ad+H%c3%a1danky+Z+184+Vztahy+Include+Extend+V+P%c5%99%c3%adpadech+U%c5%beit%c3%ad.aspx</link>
      <pubDate>Thu, 27 Apr 2006 17:25:16 GMT</pubDate>
      <description>Protože kolegové v diskuzi pod původním spotem podrobně rozebrali všechny aspekty vztahu Include a Extend v případech užití,  je tento můj spot z větší části sumarizující. V čem tedy byl "chyták"? Cílem hádanky bylo upozornit na to, že vztahy Include a Extend nemusejí být tak jednoduše rozpoznatelné, jak se dočtete v různých rychlopříručkách,  a také jsem chtěl, abyste si všimli, že vztah Extend bylo bylo příjemné zpřesnit tím, co sám pro sebe nazývám "anonymní datové sloty".

Tak toto byl začátek dvoustránkového spotu, který se mi podařilo omylem smazat. :-( Protože už se mi nechce teď psát celý spot znovu, tak jen v krátkosti zrekapituluji, čeho se hádanka týkala.

Specifikace UML popisuje vztahy Include a Extend takto:

"Include is a directed relationship between two use cases, implying that the behavior of the included use case is inserted into the behavior of the including use case. The including use case may only depend on the result (value) of the included use case. This value is obtained as a result of the execution of the included use case."

"This relationship specifies that the behavior of a use case may be extended by the behavior of another (usually supplementary) use case. The extension takes place at one or more specific extension points defined in the extended use case. Note, however, that the extended use case is defined independently of the extending use case and is meaningful independently of the extending use case. On the other hand, the extending use case typically defines behavior that may not necessarily be meaningful by itself. Instead, the extending use case defines a set of modular behavior increments that augment an execution of the extended use case under specific conditions. Note that the same extending use case can extend more than one use case. Furthermore, an extending use case may itself be extended."



V hádance nemohl být vztah mezi případem užití 'Založení objednávky' a 'Platba kartou' Include ani Extend. Include nelze použít, protože máme i jiné typy plateb, a případ užití Platbu kartou tedy nelze vložit povinně (dalším typem platby bude třeba dobírka - žádné záludnosti ohledně plateb jsem přichystány neměl, jen jsem chtěl, abyste se jako správní analytici pídili po podrobném zadání :-) ). Nejedná se ale ani o vztah Extend, protože rozšířený případ užití nijak nezávisí na rozšiřujícím případu užití a nemůže číst žádné "návratové hodnoty"  - pro nás to znamená, že nezjistíme, jestli platba prošla. 

Řešením je vytvoření nového abstraktního případu užití nazvaného třeba 'Kontrola platby', který přes vazbu Include provážeme s případem užití 'Založení objednávky' . Konkrétními potomky budou "Kontrola platby kartou", "Kontrola ostatních typů plateb". Vazba Include nám dovoluje číst návratovou hodnotu vloženého případu užití v a v alternativním toku událostí případu užití  'Založení objednávky' podle vybraného typu platby vložíme jiný případ užití a dle výsledku vkládaného případu užití dokončímě hlavní tok událostí. Pokud neprojde platba kartou, můžeme zákazníkovi nabídnout výběr jiného typu platby.

Hlavně ale platí - celá hádanka i její řešení je jen hříčka bez užitku pro zákazníka, která demostruje, jak lze i méně časté vztahy řešit běžnými výrazovými prostředky jazyka UML. Stále platí, že vazby Include, Extend ani gen-spec zákazníkovi raději moc neukazujte. Jinak budete zbytečně trávit čas vysvětlováním vztahů, které jsou pro samotný projekt málo podstatné a pro zákazníka většinou jen iritující.&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=15d45bc5-f556-4e18-a4e2-d557634aa322"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,15d45bc5-f556-4e18-a4e2-d557634aa322.aspx</comments>
      <category>Programátorské hádanky</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=b71ac29a-ad1b-41e1-a5dc-12c58640f452</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,b71ac29a-ad1b-41e1-a5dc-12c58640f452.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,b71ac29a-ad1b-41e1-a5dc-12c58640f452.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b71ac29a-ad1b-41e1-a5dc-12c58640f452</wfw:commentRss>
      <slash:comments>27</slash:comments>
      <title>Zajímavý dotaz (hádanka) na případy užití v UML - vztah Include, Extend, anebo ...? </title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,b71ac29a-ad1b-41e1-a5dc-12c58640f452.aspx</guid>
      <link>http://blog.renestein.net/Zaj%c3%admav%c3%bd+Dotaz+H%c3%a1danka+Na+P%c5%99%c3%adpady+U%c5%beit%c3%ad+V+UML+Vztah+Include+Extend+Anebo.aspx</link>
      <pubDate>Tue, 18 Apr 2006 08:27:39 GMT</pubDate>
      <description>Po základní analýze jste zjistili, jak zákazníci vašeho klienta vytvářejí objednávky: 

"Zákazník v našem obchodě vybírá zboží a poté si může vybrat, jak je uhradí. Jedním z možných typů platby je platba kartou. K založení objednávky dojde pouze tehdy, pokud zadané údaje o platební kartě jsou platné, zákazník má dostatečnou hotovost na účtu a platba tedy projde."&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=b71ac29a-ad1b-41e1-a5dc-12c58640f452"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,b71ac29a-ad1b-41e1-a5dc-12c58640f452.aspx</comments>
      <category>Programátorské hádanky</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=0a3a647e-c1d3-437a-ae78-6ae36b96f23a</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,0a3a647e-c1d3-437a-ae78-6ae36b96f23a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,0a3a647e-c1d3-437a-ae78-6ae36b96f23a.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0a3a647e-c1d3-437a-ae78-6ae36b96f23a</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <title>UML - O agregaci, kompozici a asociaci a jako bonus společenská aktualitka :)</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,0a3a647e-c1d3-437a-ae78-6ae36b96f23a.aspx</guid>
      <link>http://blog.renestein.net/UML+O+Agregaci+Kompozici+A+Asociaci+A+Jako+Bonus+Spole%c4%8densk%c3%a1+Aktualitka.aspx</link>
      <pubDate>Sun, 26 Mar 2006 14:50:53 GMT</pubDate>
      <description>Na svých přednáškách při vysvětlování asociace a kompozice mám slide, na kterém jsou zmíněny základní rozdíly mezi oběma typy vztahů v UML. Ihned k tomu ale dodávám, že zmíněné rozdíly jsou většinou akademické a že v praxi si vystačíme většinou s jedním typem vztahu (s agregací), u kterého při kódování intuitivně víme, zda složený (kompozitní) objekt rozhoduje, a pokud ano, tak v jaké míře, o ...&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=0a3a647e-c1d3-437a-ae78-6ae36b96f23a"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,0a3a647e-c1d3-437a-ae78-6ae36b96f23a.aspx</comments>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=bacdc2f2-68ca-428b-8489-98a31e946b27</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,bacdc2f2-68ca-428b-8489-98a31e946b27.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,bacdc2f2-68ca-428b-8489-98a31e946b27.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=bacdc2f2-68ca-428b-8489-98a31e946b27</wfw:commentRss>
      <title>Termíny kurzů o OOP a UML, partnerství s EIITE, InHouse školení</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,bacdc2f2-68ca-428b-8489-98a31e946b27.aspx</guid>
      <link>http://blog.renestein.net/Term%c3%adny+Kurz%c5%af+O+OOP+A+UML+Partnerstv%c3%ad+S+EIITE+InHouse+%c5%a0kolen%c3%ad.aspx</link>
      <pubDate>Sun, 05 Mar 2006 11:36:23 GMT</pubDate>
      <description>Jak jsem již naznačil v předchozím spotu, uzavřel jsem "strategické partnerství" s novým školícím střediskem - se společností EIITE. Mé kurzy budou pořádány pod hlavičkou Skilldrive ...
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=bacdc2f2-68ca-428b-8489-98a31e946b27"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,bacdc2f2-68ca-428b-8489-98a31e946b27.aspx</comments>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=02b62fd2-b3f4-4939-85c3-22c02c2615d8</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,02b62fd2-b3f4-4939-85c3-22c02c2615d8.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,02b62fd2-b3f4-4939-85c3-22c02c2615d8.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=02b62fd2-b3f4-4939-85c3-22c02c2615d8</wfw:commentRss>
      <title>Několik informací ke kurzům UML a OOP</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,02b62fd2-b3f4-4939-85c3-22c02c2615d8.aspx</guid>
      <link>http://blog.renestein.net/N%c4%9bkolik+Informac%c3%ad+Ke+Kurz%c5%afm+UML+A+OOP.aspx</link>
      <pubDate>Sun, 26 Feb 2006 19:27:49 GMT</pubDate>
      <description>Takže předběžně ke kurzům UML a OOP, abych nemusel odpovídat na všechny došlé maily. V souvislosti se změnou zaměstnání se mění i některé věci ke kurzům ...
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=02b62fd2-b3f4-4939-85c3-22c02c2615d8"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,02b62fd2-b3f4-4939-85c3-22c02c2615d8.aspx</comments>
      <category>Kurzy UML a OOP</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=184e7449-d71f-4e98-a513-6944579e6166</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,184e7449-d71f-4e98-a513-6944579e6166.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,184e7449-d71f-4e98-a513-6944579e6166.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=184e7449-d71f-4e98-a513-6944579e6166</wfw:commentRss>
      <title>Interval - Návrh aplikací v jazyce UML - Diagram tříd I</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,184e7449-d71f-4e98-a513-6944579e6166.aspx</guid>
      <link>http://blog.renestein.net/Interval+N%c3%a1vrh+Aplikac%c3%ad+V+Jazyce+UML+Diagram+T%c5%99%c3%add+I.aspx</link>
      <pubDate>Tue, 16 Aug 2005 06:39:59 GMT</pubDate>
      <description>Po delší prodlevě vychází další článek o návrhu aplikací s využitím jazyka UML. Místo zbytečných omluv za dlouhou a neplánovanou odmlku snad čtenáře potěší informace, že se napříště budu věnovat i konstrukcím jazyka UML nově přidaným ve verzi 2.0. ...&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=184e7449-d71f-4e98-a513-6944579e6166"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,184e7449-d71f-4e98-a513-6944579e6166.aspx</comments>
      <category>UML</category>
    </item>
  </channel>
</rss>