<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Dokumentacja dla leniwych - pot&#281;ga Pythona</title>
    <link>http://blog.zabiello.com/articles/2006/03/06/dokumentacja-dla-leniwych-pot%C4%99ga-pythona</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Dokumentacja dla leniwych - pot&#281;ga Pythona</title>
      <description>&lt;p&gt;Jedn&#261; z najbardziej nielubianych rzeczy przez programist&#243;w jest tworzenie dokumentacji do kodu. Wszyscy wiemy, &#380;e dobrze j&#261; tworzy&#263;, ale ma&#322;o komu chce si&#281; na to po&#347;wi&#281;ca&#263; cenny czas zw&#322;aszcza jak terminy uko&#324;czenia projektu goni&#261;. W takich sytuacjach cz&#281;sto dokumentacj&#281; zostawia si&#281; zwykle &amp;#8220;na p&#243;&#378;niej&amp;#8221; jako zadanie do wykonania po uko&#324;czeniu projektu. Jednak czym innym jest dodanie komentarza do kodu na bierz&#261;co a czym innym napisanie go po paru tygodniach (zw&#322;aszcza jak kod by&#322; tworzony zespo&#322;owo i musimy teraz zastanowi&#263; si&#281; co kolega Jasio mia&#322; na my&#347;li tworz&#261;ca jak&#261;&#347; tam kolejn&#261; funkcj&#281;)&lt;/p&gt;


	&lt;p&gt;Aby ten problem rozwi&#261;za&#263;, praktycznie wszyscy developerzy r&#243;&#380;nych j&#281;zyk&#243;w zacz&#281;li wymy&#347;la&#263; r&#243;&#380;ne metody aby ten proces usprawni&#263;.&lt;/p&gt;


	&lt;p&gt;Po pierwsze, stworzono parsery kodu &#378;r&#243;d&#322;owego, kt&#243;ry potrafi&#261; wy&#322;uska&#263; z wszystkich plik&#243;w projektu definicje klas, metod, modu&#322;&#243;w. Taka pomoc, cho&#263; lepsza nic nic, generalnie niewiele jest warta, bo sprowadza si&#281; do wy&#347;wietlenia nazw klas i ich metod (No mo&#380;e dodatkowo z typami danych, je&#347;li j&#281;zykiem tym jest kt&#243;ry&#347; z j&#281;zyk&#243;w statycznie typowanych) Nie m&#243;wi jednak nic na temat funkcjonalno&#347;ci ani tego jak u&#380;ywa&#263; wy&#322;uskany kod.&lt;/p&gt;


	&lt;p&gt;Aby temu zaradzi&#263; wymy&#347;lono inne podej&#347;cie. Za&#322;o&#380;ono &#380;e programista przed ka&#380;d&#261; funkcj&#261; czy klas&#261; b&#281;dzie dodawa&#322; wielowierszowy komentarz wg &#347;ci&#347;le okre&#347;lonej sk&#322;adni. I potworzono r&#243;&#380;nego rodzaju biblioteki &lt;a href="http://java.sun.com/j2se/javadoc/"&gt;javadoc&lt;/a&gt;, &lt;a href="http://www.phpdoc.org/"&gt;phpdoc&lt;/a&gt; czy &lt;a href="http://stdlib.rubyonrails.org/"&gt;rubydoc&lt;/a&gt;.  Niby lepiej. Mo&#380;na teraz lepiej opisywa&#263; kod, ale nadal trzeba trzyma&#263; si&#281; specyficznej sk&#322;adni i znacznik&#243;w. Poza tym, tak tworzona dokumentacja nie jest w &#380;aden spos&#243;b zwi&#261;zana z tworzonym kodem.&lt;/p&gt;


	&lt;h2&gt;Doctringi&lt;/h2&gt;


	&lt;p&gt;Jednym z za&#322;o&#380;e&#324; le&#380;&#261;cych u podstaw Pythona jest przyj&#281;cie zasady, &#380;e &lt;a href="http://www.python.org/doc/Humor.html#zen"&gt;proste jest lepsze ni&#380; z&#322;o&#380;one&lt;/a&gt;. Tw&#243;rca Pythona, wychodz&#261;c naprzeciw zapotrzebowaniom programist&#243;w wpad&#322; na genialnie prosty i wygodny zarazem spos&#243;b. Przyj&#261;&#322; prost&#261; zasad&#281;: ka&#380;dy fragment tekstu zaczynaj&#261;cy si&#281; zaraz pod deklaracji klasy czy metody b&#281;dzie automatycznie do&#322;&#261;czany do tej klasy, metody jako jego osobista dokumentacja. Nazwano to &lt;a href="http://www.python.org/peps/pep-0257.html"&gt;docstringiem&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Jak wiemy, dobry programista do programista leniwy. Czyli taki, kt&#243;ry stara si&#281; osi&#261;ga&#263; cel jak najmniejszym nak&#322;adem pracy. Docstring nie narzuca na programist&#281; &#380;adnych wymaga&#324; co do konieczno&#347;ci u&#380;ywania jakich&#347; specjalnch znacznik&#243;w. Po prostu, deklaruj&#281; funkcj&#281;. Zaraz pod ni&#261; wpisuj&#281; linijk&#281; opisuj&#261;c&#261; z grubsza do czego s&#322;u&#380;y, i nie  przerywaj&#261;c pracy, pisz&#281; dalej. W zwi&#261;zku jednak z tym, &#380;e ten docstring staje si&#281; automatycznie cz&#281;&#347;ci&#261; danej metody, mam natychmiastowy do niego dost&#281;p z poziomu interpretera, ba, z poziomu konsoli:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.zabiello.com/images/articles/dla-leniwych1.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Ka&#380;dy docstring mog&#281; tak&#380;e wy&#347;wietli&#263; tak:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.zabiello.com/images/articles/dla-leniwych5.gif" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;W Pythonie (od wersji 2.4 wzwy&#380;) mo&#380;na dodawa&#263; docstringi tak&#380;e do&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html"&gt;atrybut&#243;w&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.zabiello.com/images/articles/dla-leniwych2.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Docstringi s&#261; bardzo wygodnym sposobem dodawania dokumentacji do kodu. Wymagaj&#261;  minimum wysi&#322;ku i wiedzy. To powoduje, &#380;e wi&#281;kszo&#347;&#263; aplikacji Pythona tam, gdzie si&#281; ludzie &#347;piesz&#261;, powstaje w&#322;asnie t&#261; metod&#261;.&lt;/p&gt;


	&lt;h2&gt;Pydoc&lt;/h2&gt;


	&lt;p&gt;Standardowo ka&#380;da dystrybucja Pythona wyposa&#380;ona jest w prosty skrypt: pydoc (plik pydoc.py le&#380;y w folderze &lt;em&gt;lib&lt;/em&gt; razem z reszt&#261; modu&#322;&#243;w stadardowej biblioteki pythona. Pydoc umo&#380;liwia automatyczn&#261; generacj&#281; dokumentacje do wszystkich modu&#322;&#243;w Pythona (zar&#243;wno tych z bibioteki standardowej jak i wszystkich jakie zainstalujemy).&lt;/p&gt;


	&lt;p&gt;Aby np. wy&#347;wietli&#263; kr&#243;tki manual na temat modu&#322;u md5 wystarczy &#380;e z poziomu shella wpiszemy np. &lt;strong&gt;pydoc modules md5&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.zabiello.com/images/articles/dla-leniwych3.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;(Zamiast uruchamia&#263; pydoc&amp;#8217;a w shellu, mo&#380;na z poziomu interpretera wpisa&#263;: help(&amp;#8216;md5&amp;#8217;). uzyskamy ten sam efekt co pydoc odpalony z shella. Odpowiada to mniej wi&#281;cej uniksowym manualom.)&lt;/p&gt;


	&lt;p&gt;Mo&#380;na tak&#380;e wygenerowa&#263; pliki html w stylu phpdoc&amp;#8217;a albo po prostu odpali&#263; na dowolnym porcie serwer www z dokumentacj&#261; do wszystkich modu&#322;&#243;w:  &lt;strong&gt;pydoc -P 8080&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;Pod adresem http://localhost:8080 mamy witryn&#281; z opisem wszystkich modu&#322;&#243;w Pythona zainstalowanych w systemie.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.zabiello.com/images/articles/dla-leniwych4.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Istnieje znacznie wi&#281;cej mo&#380;liwo&#347;ci podpowiadania sk&#322;adni, uzupe&#322;niania kodu i innych udogodnie&#324; w Pythonie. Tu ograniczy&#322;em si&#281; tylko do fragmentu, kt&#243;ry nie ma odpowiednika w innych j&#281;zykach &amp;#8211; docstringach &amp;#8211; mechanizmowi tworzenia dokumentacji do kodu dla leniwych. :) To jedna z wielu doskona&#322;ych cech Pythona.&lt;/p&gt;</description>
      <pubDate>Mon, 06 Mar 2006 16:18:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:1481d214-4e8d-49e9-be88-7a260dfe743d</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/03/06/dokumentacja-dla-leniwych-pot%C4%99ga-pythona</link>
      <category>Python</category>
      <category>python</category>
    </item>
  </channel>
</rss>
