<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>xlab &#187; projektowanie</title>
	<atom:link href="http://xlab.pl/tag/projektowanie/feed/" rel="self" type="application/rss+xml" />
	<link>http://xlab.pl</link>
	<description>XSolve laboratory - dzielimy się tym co wiemy...</description>
	<lastBuildDate>Thu, 12 Apr 2012 07:23:58 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Agile estimating and planning</title>
		<link>http://xlab.pl/agile-estimating-and-planning/</link>
		<comments>http://xlab.pl/agile-estimating-and-planning/#comments</comments>
		<pubDate>Mon, 17 May 2010 20:29:30 +0000</pubDate>
		<dc:creator>tomasz.szulik</dc:creator>
				<category><![CDATA[Ogólne]]></category>
		<category><![CDATA[estymacja]]></category>
		<category><![CDATA[product management]]></category>
		<category><![CDATA[projektowanie]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1084</guid>
		<description><![CDATA[W firmie XSolve tradycją stały się już piątkowe prezentacje.　Tym razem zaszczytną rolę prelegenta wywalczyłem sobie ja. Zainspirowany lekturą &#8222;Agile Estimating and Planning&#8221; autorstwa Mike Cohn postanowiłem przedstawić teorię związaną z podejściem &#8222;agile&#8221; do zagadnienia estymacji. Zagadnienie estymacji jest dosyć trudnym tematem, dlatego dobrze zapoznać się z teorią oraz praktykami wykorzystywanymi przez doświadczonych &#8222;graczy&#8221;. Słowo &#8222;graczy&#8221; [...]]]></description>
			<content:encoded><![CDATA[<div>
<div>W firmie XSolve tradycją stały się już piątkowe prezentacje.　Tym razem zaszczytną rolę prelegenta wywalczyłem sobie ja. Zainspirowany lekturą &#8222;Agile Estimating and Planning&#8221; autorstwa Mike Cohn postanowiłem przedstawić teorię związaną z podejściem &#8222;agile&#8221; do zagadnienia estymacji.</div>
<div></div>
<div>Zagadnienie estymacji jest dosyć trudnym tematem, dlatego dobrze zapoznać się z teorią oraz praktykami wykorzystywanymi przez doświadczonych &#8222;graczy&#8221;. Słowo &#8222;graczy&#8221; wydaje się być trafione jako że, jedna z technik estymacji nosi nazwę: &#8222;Planning poker&#8221;.</div>
<div></div>
<div>Sądząc po dyskusji, która wywiązała się pod koniec prezentacji, temat jest na prawdę niebanalny i interesujący, dlatego zamieszczam tutaj parę odnośników do materiałów, które pomogą Wam w zaspokojeniu wiedzy.</div>
<p></p>
<div>Przyjemnej lektury!</div>
<p></p>
<div>
<ul>
<li> <a href="http://www.amazon.com/Agile-Estimating-Planning-Robert-Martin/dp/0131479415">&#8222;Agile Estimating and Planning&#8221; &#8211; Mike Cohn</a></li>
<li> <a href="http://xlab.pl/wp-content/uploads/2010/05/Agile-estimating-and-planning.pptx">Moja prezentacja</a></li>
<li> <a href="http://www.agile-software-development.com/2009/04/agile-estimating.html">Estimating in Agile Software Development</a></li>
<li> <a href="http://www.ibm.com/developerworks/linux/library/l-agile-plan/">Agile planning in real life<span style="color: #000000"><br />
</span></a></li>
</ul>
</div>
</div>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/agile-estimating-and-planning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Insight w programowanie msejf: .NET</title>
		<link>http://xlab.pl/insight-w-programowanie-msejf-net/</link>
		<comments>http://xlab.pl/insight-w-programowanie-msejf-net/#comments</comments>
		<pubDate>Mon, 17 May 2010 08:19:35 +0000</pubDate>
		<dc:creator>jaroslaw.kroczek</dc:creator>
				<category><![CDATA[Programowanie .NET]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[msejf]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[projektowanie]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1071</guid>
		<description><![CDATA[Poniższym wpisem chcielibyśmy rozpocząć serię postów dedykowanych technologiom, w jakich tworzymy aplikację msejf. Projekt i jego poszczególne elementy wymagają połączenia różnych rozwiązań i dzięki temu jest wyjątkowo ciekawy z punktu widzenia programistów i web developerów. Cykl chcielibyśmy zacząć od przyjrzenia się technologii .NET, w oparciu o którą zbudowaliśmy część desktopową aplikacji. Spośród typowych bibliotek tej [...]]]></description>
			<content:encoded><![CDATA[<p>Poniższym wpisem chcielibyśmy rozpocząć serię postów dedykowanych  technologiom, w jakich tworzymy aplikację msejf. Projekt i jego  poszczególne elementy wymagają połączenia różnych rozwiązań i dzięki  temu jest wyjątkowo ciekawy z punktu widzenia programistów i web  developerów.</p>
<p>Cykl chcielibyśmy zacząć od przyjrzenia się technologii .NET, w  oparciu o którą zbudowaliśmy część desktopową aplikacji. Spośród  typowych bibliotek tej platformy z których korzystaliśmy szczególnie  dwie zasługują na szczególną uwagę: WPF i WCF.</p>
<p>WPF (Windows Presentation Foundation) to silnik graficzny bazujący na  platformie .NET od wersji 3.0. Co takiego ciekawego jest w WPF, że  postanowiliśmy użyć jej do naszej aplikacji? WPF daje nam ogromne  możliwości co do kształtowania wyglądu aplikacji. msejf ma być  niebanalny, a jeśli tak, to WPF jest naturalnym wyborem. Tworząc  interfejs użytkownika praktycznie nie musimy się niczym ograniczać. Nie  musimy martwić się o to, że nie będziemy w stanie przełożyć kreatywności  naszych grafików na działającą aplikację.</p>
<p>Dla nas, programistów, WPF ma też inne zalety. Przede wszystkim, WPF  zmienia całkowicie sposób implementacji aplikacji desktopowych,  zbliżając się stylem do aplikacji webowych. Nasze aplikacje oparte są o  wzorzec projektowy Model-View-ViewModel, co skutkuje przejrzystym i  łatwiejszym w utrzymaniu kodem.</p>
<p>WCF to drugie w kolejności ciekawe rozwiązanie, w oparciu o które  zbudowaliśmy klienta msejf. WCF (Windows Communication Foundation) to  część .NET Framework’a, która dostarcza ujednolicony model  programistyczny dla aplikacji opartych o usługi. Większości będzie się  to zapewne kojarzyć z komunikacją z zewnętrznymi serwisami. My  wykorzystujemy WCF do komunikacji międzyprocesowej. Technologia  znakomicie sprawdza się w tej roli, upraszczając wymianę informacji  między komponentami. Jej zastosowanie daje nam też duże możliwości  łatwej zmiany konfiguracji oraz monitorowania pracy komponentów dzięki  wbudowanym mechanizmom logowania.</p>
<p>Co jeszcze w msejf desktop zasługuje na szczególną uwagę?  Zastosowaliśmy mnóstwo ciekawych  rozwiązań. Długo zastanawialiśmy się  nad wyborem optymalnej architektury, co zaowocowało sprawnie działającą,  łatwą w utrzymaniu i stabilną aplikacją. Na każdym etapie prac  staraliśmy się trzymać najlepszych praktyk wytwarzania i projektowania  oprogramowania.</p>
<p>msejf desktop to nie tylko ciekawe technologie, ale przede wszystkim  innowacyjna aplikacja, a efekt końcowy naszych prac będzie można już  wkrótce podziwiać.</p>
<p>źródło: <a title="blog.msejf.pl" href="http://blog.msejf.pl/">blog.msejf.pl</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/insight-w-programowanie-msejf-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Najprostszy sposób na zalogowanie użytkownika</title>
		<link>http://xlab.pl/najprostszy-sposob-na-zalogowanie-uzytkownika/</link>
		<comments>http://xlab.pl/najprostszy-sposob-na-zalogowanie-uzytkownika/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 19:33:33 +0000</pubDate>
		<dc:creator>Krzysztof Wawoczny</dc:creator>
				<category><![CDATA[Programowanie .NET]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[projektowanie]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=962</guid>
		<description><![CDATA[Obecnie, w niemal każdej aplikacji biznesowej wymagane jest zalogowanie się, by w pełni móc korzystać z możliwości, jakie taka aplikacja daje, lub by wogóle móc cokolwiek zrobić. Jakiś czas temu zrobiłem krótki research po sieci w poszukiwaniu jakiegoś sprytniejszego rozwiązania niż to, które używam w swoich aplikacjach. Cóż&#8230; Dziwni są ludzie, którzy zatrudniają do obrony [...]]]></description>
			<content:encoded><![CDATA[<p>Obecnie, w niemal każdej aplikacji biznesowej wymagane jest zalogowanie się, by w pełni móc korzystać z możliwości, jakie taka aplikacja daje, lub by wogóle móc cokolwiek zrobić. Jakiś czas temu zrobiłem krótki research po sieci w poszukiwaniu jakiegoś sprytniejszego rozwiązania niż to, które używam w swoich aplikacjach. Cóż&#8230; Dziwni są ludzie, którzy zatrudniają do obrony swojego zamku legiony, a pozwalają do niej wejść zwykłym OR 1=1 (to tak na marginesie), nie rozumię też rozwiązania, które zostało pozytywnie ocenione na jednym z for programistycznych, a wygląda ono tak:<br />
W aplikacji sprawdzamy, czy ustawiony jest w bazie znacznik informujący o zalogowaniu, jeśli nie, to po zalogowaniu generujemy go, a usuwamy, gdy użytkownik zamknie aplikację&#8230; A co, jeśli zwiesi się komp, zabraknie prądu albo wydarzy się coś innego? Przecież po wystąpieniu tak nieoczekiwanego zdarzenia wartość w bazie może się nie zmienić, a wtedy każdy, kto skorzysta z komputera będzie zalogowany.  Naprawdę nie rozumię wielu tych wielkich idei, dlatego na razie nadal korzystam z bardzo prostego rozwiązania, które wygląda następująco:</p>
<p>W aplikacji w sekcji odpowiedzialnej za przechowanie predefiniowanych zmiennych globalnych (jak np. nazwa bazy, string wyświetlany w górnej belce aplikacji etc.) ustawiam sobie zmienną, określającą, czy użytkownik jest zalogowany (domyślnie ustawioną na false) oraz metodę pozwalającą zmienić wartość tej zmiennej:</p>
<pre name="code" class="php">public class GlobalAppVariables
{
    /// Globalna zmienna, której wartość jest ustwaiona na 1, gdy użytkownik się zaloguje.
    static int _logged = 0;

    /// Dostęp/zmiana wartości globalnej zmiennej _logged
    public static int Logged
    {
      get
      {
        return _logged;
      }
      set
      {
        _logged = value;
      }
    }
}</pre>
<p>Samo logowanie polega na wywołaniu metody, która połączy się z bazą, sprawdzi, czy dla podanych parametrów istnieje wpis i  na tej podstawie zwróci wynik pozytywny/negatywny, co z kolei pozwoli mi ustawić wartość zmiennej _logged w następujący sposób:</p>
<pre name="code" class="php">private void button1_Click(object sender, EventArgs e)
{
    object result = Queries.StartSession(this.loginTxt.Text, this.PasswordTxt.Text);
   //Queries to osobna klasa, w której przechowywane są metody odpowiedzialne za operacje na bazie
    if (result != null)
    {
        this.Close(); //zamknięcie okna logowania
        GlobalAppVariables.Logged = 1; // w tej chwili wiem, że już mam zalogowanego użytkownika
    }
    else
    {
       //info o nieudanym logowaniu
    }
}</pre>
<p>Jeśli już mam zalogowanego użytkownika, mogę odblokować domyślnie wyłączone opcje, lub zrobić coś innego.<br />
Jeśli nie potrzebujesz wymyślnego systemu logowania skorzystaj z przedstawionego sposobu. Jest on wystarczający dla wielu nieskomplikowanych aplikacji. AVE!</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/najprostszy-sposob-na-zalogowanie-uzytkownika/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamiczne generowanie kontrolek</title>
		<link>http://xlab.pl/dynamiczne-generowanie-kontrolek/</link>
		<comments>http://xlab.pl/dynamiczne-generowanie-kontrolek/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 23:02:41 +0000</pubDate>
		<dc:creator>Krzysztof Wawoczny</dc:creator>
				<category><![CDATA[Programowanie .NET]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[c# kontrolki]]></category>
		<category><![CDATA[projektowanie]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=946</guid>
		<description><![CDATA[W czasie pracy nad swoim małym projektem w C#, stanąłem przed problemem dynamicznego generowania kontrolek na formie. Nie chciałem, aby cały kod za to odpowiedzialny znajdował się w zdarzeniu kliknięcia w button, wiec stworzyłem przykładową klasę, którą nazwałem ControlGenerator. Generalnie, trzeba by ją jakoś połączyć z główną formą aplikacji (w projekcie Form1 &#8211; standardowe nazewnictwo, [...]]]></description>
			<content:encoded><![CDATA[<p>W czasie pracy nad swoim małym projektem w C#, stanąłem przed problemem dynamicznego generowania kontrolek na formie. Nie chciałem, aby cały kod za to odpowiedzialny znajdował się w zdarzeniu kliknięcia w button, wiec stworzyłem przykładową klasę, którą nazwałem ControlGenerator.<br />
<a rel="attachment wp-att-947" href="http://xlab.pl/2010/04/dynamiczne-generowanie-kontrolek/klasa/"><img class="aligncenter size-full wp-image-947" title="klasa" src="http://xlab.pl/wp-content/uploads/2010/04/klasa.jpg" alt="klasa" width="241" height="40" /></a><br />
Generalnie, trzeba by ją jakoś połączyć z główną formą aplikacji (w projekcie Form1 &#8211; standardowe nazewnictwo, gdyż więcej form nie przewiduję). W klasie ControlGenerator utworzyłem zmienną typu Form1 służącą za łącznik klasa &#8211; forma:</p>
<pre class="php">public class ControlGenerator
{
    /// Prywatna zmienna typu Form1
    private Form1 pf;
   //...
}</pre>
<p>Następnie, konstruktor klasy musi posiadać takie przypisanie zmienej pf, aby wskazywała ona na referencję instancji mojej Form1 (trochę to może zamieszane, więc kawałek kodu wyjaśni, co miałem na myśli):</p>
<pre class="php">public ControlGenerator(Form1 f1)
{
  pf = f1;
}</pre>
<p>Tak właśnie wygląda konstruktor, o którym była mowa, a jak to wygląda &#8216;na żywo&#8217; jest ukazane poniżej.</p>
<p>W formie głównej aplikacji (Form1) po kliknięciu w jeden z przycisków powinny wygenerować się kontrolki, inicjuję więc obiekt klasy ControlGenerator w następujący sposób:</p>
<pre class="php">private void button1_Click(object sender, EventArgs e)
{
    ControlGenerator generate = new ControlGenerator(this);
   // właśnie tu do konstruktora przekazuje referencję do Form1 za pomocą this
}</pre>
<p>Skoro moje połączenie klasa &#8211; forma jest już aktywne, to pora napisać metodę generującą kontrolki. Do owej metody powinna być przekazana informacja jak wiele kontrolek utworzyć. W poniższym przykładzie ograniczę się do wygenerowania TextBoxów z Labelkami zawartymi w GroupBoxie (które mogą być oczywiście dodatkowo osadzone na jakimś panelu, czy czymkolwiek się chce).<br />
Gotowa funkcja prezentuje się następująco:</p>
<pre class="php">    public void GenerateRegisterControls(int number, string text)
    {
      int[] textboxes = new int[number];
      string[] labels = { "Imię", "Nazwisko", "PESEL", "Ulica", "Numer budynku",
                              "Miasto", "Kod pocztowy", "Województwo", "Telefon" };
      int i = 0, move = 0;

      //tworzę GroupBoxa, do którego wrzucę tworzone kontrolki (opis metody w następnym listingu)
      GroupBox box = GenerateGroupBoxControl(text); 

      foreach (int element in textboxes)
      {
        TextBox textbox = new TextBox(); //tworzę nowego TextBoxa
        Label label = new Label(); //tworzę nowy Label
        //lokalizacja TextBoxa
        textbox.Location = new System.Drawing.Point(200, 70 + move);
        textbox.Name = "textbox" + i.ToString();
        textbox.Size = new System.Drawing.Size(360, 20 + move); //wymiary TextBoxa
        //Rozmiar czcionki w TextBoxie - funkcja nie zostanie przedstawiona
        //w tym wpisie
        textbox.Font = SetFontForElement(40, textbox.Font);
        textbox.TabIndex = i;
        textbox.Visible = true;
        //automatyczna zmiana rozmiarów TextBoxa przy zmianie rozmiaru okna
        textbox.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
        textbox.BorderStyle = BorderStyle.FixedSingle; //styl ramki
        //lokalizacja Labela
        label.Location = new System.Drawing.Point(20, 80 + move);
        label.Name = "label" + i.ToString();
        //nazwa Labela wzięta z wcześniej utworzonej tablicy stringów
        label.Text = labels[i];
        label.Font = SetFontForElement(28, label.Font);
        label.Size = new System.Drawing.Size(160, 28);
        label.Visible = true;

        box.Controls.Add(textbox); //dodaję do GroupBoxa utworzone TextBoxy
        box.Controls.Add(label); //dodaję do GroupBoxa utworzone Labele

        i++;
        move += 50;
      }
      //dodaję GroupBoxa z kontrolkami do panelu w kontenerze Form1
      pf.splitContainer1.Panel2.Controls.Add(box);
    }</pre>
<p>Jak widać funkcja nie jest specjalnie skomplikowana, a tablicę z nazwami labelek można by przekazać jako parametr &#8211; jednak nie ma potrzeby w tym wpisie rozmieniać się na drobne. Tworzenie TextBoxów i Labelek można by dodatkowo zostawić osobnym funkcjom wywołanym w GenerateRegisterControls, jak np. GenerateGroupBoxControl, która wygląda następująco:</p>
<pre class="php">    private GroupBox GenerateGroupBoxControl(string text)
    {
      GroupBox box = new GroupBox();

      box.Name = "GroupBoxRegister";
      box.Text = text;
      box.Location = new System.Drawing.Point(1, 9);
      box.Size = new System.Drawing.Size(pf.splitContainer1.Panel2.Width - 20, pf.splitContainer1.Panel2.Height - 20);
      box.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;

      return box;
    }</pre>
<p>Samo wygenerowanie kontrolek po kliknięciu w jeden z przycisków wygląda następująco:</p>
<pre class="php">    private void button1_Click(object sender, EventArgs e)
    {
      ControlGenerator generate = new ControlGenerator(this);
      //9 TextBoxów i 9 Labelek, GroupBox będzie opatrzony tekstem Rejestracja
      generate.GenerateRegisterControls(9, "Rejestracja");
    }</pre>
<p>Efekt:<br />
<a rel="attachment wp-att-948" href="http://xlab.pl/2010/04/dynamiczne-generowanie-kontrolek/efekt/"><img class="aligncenter size-full wp-image-948" title="efekt" src="http://xlab.pl/wp-content/uploads/2010/04/efekt.jpg" alt="efekt" width="648" height="531" /></a></p>
<p>Jeśli ktoś dopiero zaczyna swoją przygodę z C#, to informacje, które przedstawiłem z pewnością się przydadzą, albo przynajmniej wskażą drogę poszukiwań w google. AVE!</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/dynamiczne-generowanie-kontrolek/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enterprise Architect &#8211; transformacja diagramu klas na DDL</title>
		<link>http://xlab.pl/enterprise-architect-transformacja-diagramu-klas-na-ddl/</link>
		<comments>http://xlab.pl/enterprise-architect-transformacja-diagramu-klas-na-ddl/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 15:31:03 +0000</pubDate>
		<dc:creator>Marcin Dryka</dc:creator>
				<category><![CDATA[Ogólne]]></category>
		<category><![CDATA[architect]]></category>
		<category><![CDATA[ddl]]></category>
		<category><![CDATA[diagram]]></category>
		<category><![CDATA[ea]]></category>
		<category><![CDATA[enterprise]]></category>
		<category><![CDATA[klas]]></category>
		<category><![CDATA[projektowanie]]></category>
		<category><![CDATA[uml]]></category>

		<guid isPermaLink="false">http://www.xlab.pl/?p=74</guid>
		<description><![CDATA[Enterprise Architect firmy Sparx Systems, to potężne narzędzie do projektowania aplikacji. Możemy w nim wykonać projekt od początku do końca. Zaczynając od wymagań klienta, możemy przejść przez wygenerowanie odpowiedniej bazy danych, kończąc na eksportowaniu dokumentacji, która po wydrukowaniu może trafić w ręce klienta. Jednak tak ogromne narzędzie ma jedną sporą wadę &#8211; trzeba mu poświęcić [...]]]></description>
			<content:encoded><![CDATA[<p>Enterprise Architect firmy <a href="http://www.sparxsystems.com.au/">Sparx Systems</a>, to potężne narzędzie do projektowania aplikacji. Możemy w nim wykonać projekt od początku do końca. Zaczynając od wymagań klienta, możemy przejść przez wygenerowanie odpowiedniej bazy danych, kończąc na eksportowaniu dokumentacji, która po wydrukowaniu może trafić w ręce klienta.</p>
<p><span id="more-74"></span></p>
<p>Jednak tak ogromne narzędzie ma jedną sporą wadę &#8211; trzeba mu poświęcić mu trochę czasu zanim stanie się ono użyteczne. W pierwszej kolejności po narysowaniu poprawnego diagramu klas chciałem wygenerować diagram DDL. Co z tego wszystkiego wynikło opisuję poniżej.</p>
<p>Opis zawiera uniwersalny sposób generacji DDL, jednak znacząco jest ukierunkowany na zgodność z symfony (zgodność nazw atrybutów, klas modelu itp.)</p>
<ol>
<li>Utworzyłem nowy projekt:<br />
Klikając kolejno:<strong> File </strong>&gt; <strong>New project</strong> wpisując nazwę pod którą będę trzymać plik projektu (wszystkie informacje zawarte są w pojedynczym pliku) kontynuowałem przyciskiem <strong>Zapisz</strong>.</li>
<li>Moim oczom ukazało się okno w którym mogę wybrać rodzaj diagramu który automatycznie chciałbym dołączyć do projektu. Zaznaczam jedynie <em>Class</em>, bo o eksporcie tego diagramy jest ten artykuł.</li>
<p style="text-align: center;">
<a href="http://www.xlab.pl/wp-content/uploads/2009/03/selectmodel.png"><img class="alignnone size-medium wp-image-76" title="Select Model" src="http://www.xlab.pl/wp-content/uploads/2009/03/selectmodel-300x265.png" alt="" width="300" height="265" /></a></p>
<li>Po zatwierdzeniu modelu w przeglądarce projektu (<em>Project Browser</em>) ukazał się pakiet (<em>package</em>) o nazwie Class Model, a w nim przykładowy model klas. Usunąłem z niego zarówno folder Systems jak i Frameworks oraz zawartość diagramu. Teraz mogę przystąpić do właściwego projektowania diagramu klas. Metodą przeciągnij i upuść z okna narzędzi (<em>Tools</em>) przeciągnąłem interesujące nas elementy diagramu. Ja w przykładzie wykorzystałem taki diagram:</li>
<p style="text-align: center;"><a href="http://www.xlab.pl/wp-content/uploads/2009/03/diagramklas.png"><img class="alignnone size-medium wp-image-77" title="Diagram Klas" src="http://www.xlab.pl/wp-content/uploads/2009/03/diagramklas-300x133.png" alt="" width="300" height="133" /></a></p>
<li>Teraz pora na transformacje na DDL. W przeglądarce projektu klikając na pakiet prawym klawiszem myszy mam dostępną opcję transformacji aktualnego pakietu (<em>Transform Current Package</em>). Zaznaczając wszystkie dostępne elementy oraz transformację DDL (określając docelowe miejsce położenia) korzystam z przycisku &#8222;Do Transform&#8221;. Po kilu sekundach został utworzony pakiet DDL wraz z jego diagramem.</li>
<p style="text-align: center;"><a href="http://www.xlab.pl/wp-content/uploads/2009/03/ddl.png"><img class="alignnone size-medium wp-image-79" title="ddl" src="http://www.xlab.pl/wp-content/uploads/2009/03/ddl-300x121.png" alt="" width="300" height="121" /></a></p>
<li>W zasadzie w tym momencie mogłbym wygenerować z diagramu plik SQL gotowy do użycia w bazie danych, gdyby nie jedna niezgodność. Zauważmy, że utworzone klucze główne oraz obce są w formacie {nazwa}ID (kategoriaID, artykulID). Symfony posiada inną konwencję ({nazwa}_id). Aby poprawnie skonfigurować nazewnictwo skorzystałem z edycji szablonów transformacji.</li>
<li style="text-align: left;">Wybierając <strong>Setting </strong>&gt; <strong>Transformation Templates</strong> otworzyłem edytor szablonów</li>
<p style="text-align: center;"><a href="http://www.xlab.pl/wp-content/uploads/2009/03/transformationeditor.png"><img class="alignnone size-medium wp-image-80" title="Transformation Editor" src="http://www.xlab.pl/wp-content/uploads/2009/03/transformationeditor-300x153.png" alt="" width="300" height="153" /></a></p>
<li>Aby skonfigurować poprawnie nazwy identifikatorów tabel oraz nazwy kluczy obcych należy wyedytowałem dwa szablony: <em>Class </em>oraz <em>Connector</em>. Odnajdując linię:
<pre class="bash">name=%qt%%CONVERT_NAME(className, "Pascal Case","Camel Case")%ID%qt%</pre>
<p>zmieniłem ją na następującą:</p>
<pre class="bash">name=%qt%%CONVERT_NAME(className, "Pascal Case","Underscored")%_id%qt%</pre>
<p>Zostaje do wprowadzenia w szablonie<em> Connector </em>dziesięć analogicznych zmian.</li>
<li style="text-align: left;">Po wykonaniu wszystkich zmian, ponownie przegenerowałem diagram DDL (jak w punkcie 4). W wyniku czego otrzymałem diagram zgodny z konwencjami symfony (wcześniej należy usunąć poprzedni diagram DDL w celu wygenerowania nowych, poprawnych nazw kluczy obcych:</li>
<p style="text-align: center;"><a href="http://www.xlab.pl/wp-content/uploads/2009/03/ddl_final.png"><img class="alignnone size-medium wp-image-83" title="ddl_final" src="http://www.xlab.pl/wp-content/uploads/2009/03/ddl_final-300x126.png" alt="" width="300" height="126" /></a></p>
<li>Nareszcie to czego oczekiwałem od samego początku! Pozostaje skorzystać z <strong>Project </strong>&gt; <strong>Database Engineering </strong>&gt; <strong>Generate Package DDL</strong>, w którym zaznaczając <em>Generate Primary/Foreign Key Constrains</em> oraz określając plik wynikowy <em>File Generation</em> &gt; <em>Single File</em> generuje za pomocą <em>Generate </em>plik sql. W tym momencie mam gotowy skrypt SQL do wczytania do bazy danych.</li>
<li>Co jednak jeśli nie chcielibyśmy tych wszystkich kroków wykonywać na każdej stacji klienckiej z Enterprise Architectem lub po prostu podzielić się ze znajomym wykonaną pracą? Nic prostrzego. Korzystając z <strong>Tools</strong> &gt; <strong>Export Reference Data </strong>możemy zaznaczyć interesujący nas <em>DDL_Transform_Template</em> i wyeksportować go do pliku xml. Taki plik możemy wczytać w dowolnym momencie do każdej stacji klienckiej korzystając z <strong>Tools </strong>&gt;<strong> Import Reference Data</strong></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/enterprise-architect-transformacja-diagramu-klas-na-ddl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

