PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY DIPLOMOVÁ PRÁCE. Vyhledávání vzorů ve zdrojových kódech.net. 2010 Václav Bazgier



Podobné dokumenty
Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

TÉMATICKÝ OKRUH Softwarové inženýrství

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

0.1 Úvod do lineární algebry

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

Základní pojmy teorie grafů [Graph theory]

Seznámení s prostředím dot.net Framework

OSTRAVSKÁ UNIVERZITA V OSTRAVĚ PŘÍRODOVĚDECKÁ FAKULTA

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Vývoj informačních systémů. Přehled témat a úkolů

1. Dědičnost a polymorfismus

0.1 Úvod do lineární algebry

Obsah. Zpracoval:

KRY. Projekt č. 2. Kamil Dudka xdudka00

U Úvod do modelování a simulace systémů

Matice. Modifikace matic eliminační metodou. α A = α a 2,1, α a 2,2,..., α a 2,n α a m,1, α a m,2,..., α a m,n

Lineární algebra Operace s vektory a maticemi

Usuzování za neurčitosti

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

1. Programování proti rozhraní

TGH02 - teorie grafů, základní pojmy

Grafové algoritmy. Programovací techniky

Matematika (CŽV Kadaň) aneb Úvod do lineární algebry Matice a soustavy rovnic

Grafové algoritmy. Programovací techniky

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

2. Modelovací jazyk UML 2.1 Struktura UML Diagram tříd Asociace OCL. 3. Smalltalk 3.1 Jazyk Pojmenování

OOT Objektově orientované technologie

Obsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest

Vývoj informačních systémů. Přehled témat a úkolů

Základy informatiky. Teorie grafů. Zpracoval: Pavel Děrgel Úprava: Daniela Szturcová

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Znalostní systém nad ontologií ve formátu Topic Maps

Matice přechodu. Pozorování 2. Základní úkol: Určete matici přechodu od báze M k bázi N. Každou bázi napíšeme do sloupců matice, např.

INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ. Modernizace studijního programu Matematika na PřF Univerzity Palackého v Olomouci CZ.1.07/2.2.00/28.

Číselné vektory, matice, determinanty

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

Úvod do teorie grafů

Architektury Informačních systémů. Jaroslav Žáček

GRAFY A GRAFOVÉ ALGORITMY

Operace s maticemi

Analýza a Návrh. Analýza

Architektury Informačních systémů. Jaroslav Žáček

ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ

Modely teorie grafů, min.kostra, max.tok, CPM, MPM, PERT

3. Matice a determinanty

Množinu všech matic typu m n nad tělesem T budeme označovat M m n (T ), množinu všech čtvercových matic stupně n nad T pak M n (T ).

Matice. a m1 a m2... a mn

FORTANNS. 22. února 2010

Základy algoritmizace. Pattern matching

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

ANALÝZA A KLASIFIKACE BIOMEDICÍNSKÝCH DAT. Institut biostatistiky a analýz

MBI - technologická realizace modelu

Česká zemědělská univerzita v Praze

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

5 Orientované grafy, Toky v sítích

Profilová část maturitní zkoušky 2013/2014

Pracovní celky 3.2, 3.3 a 3.4 Sémantická harmonizace - Srovnání a přiřazení datových modelů

Kolik existuje různých stromů na pevně dané n-prvkové množině vrcholů?

Architektura softwarových systémů

INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ. Modernizace studijního programu Matematika na PřF Univerzity Palackého v Olomouci CZ.1.07/2.2.00/28.

Profilová část maturitní zkoušky 2017/2018

Reporting. Ukazatele je možno definovat nad libovolnou tabulkou Helios Orange, která je zapsána v nadstavbě firmy SAPERTA v souboru tabulek:

Tabulkový procesor. Základní rysy

StatSoft Jak vyzrát na datum

Program pro tvorbu technických výpočtů. VIKLAN - Výpočty. Uživatelská příručka. pro seznámení se základními možnostmi programu. Ing.

[1] Determinant. det A = 0 pro singulární matici, det A 0 pro regulární matici

Teorie systémů TES 1. Úvod

Informační systémy 2008/2009. Radim Farana. Obsah. Nástroje business modelování. Business modelling, základní nástroje a metody business modelování.

X36SIN: Softwarové inženýrství. Životní cyklus a plánování

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

Aplikovaná numerická matematika - ANM

Bakalářské práce realizované v.net/c# Bachelor thesis implemented in.net/c#

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

1 Úvod 1.1 Vlastnosti programového vybavení (SW)

Návrhové vzory OMO, LS 2014/2015

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

Vyřešené teoretické otázky do OOP ( )

Determinanty. Obsah. Aplikovaná matematika I. Pierre Simon de Laplace. Definice determinantu. Laplaceův rozvoj Vlastnosti determinantu.

Úvod do programovacího jazyka Python

Uspořádanou n-tici reálných čísel nazveme aritmetický vektor (vektor), ā = (a 1, a 2,..., a n ). Čísla a 1, a 2,..., a n se nazývají složky vektoru

7.5 Diagram tříd pokročilé techniky

INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ. Modernizace studijního programu Matematika na PřF Univerzity Palackého v Olomouci CZ.1.07/2.2.00/28.

Datové struktury 2: Rozptylovací tabulky

PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY BAKALÁŘSKÁ PRÁCE. Návrhové vzory Dan Doležel

(Cramerovo pravidlo, determinanty, inverzní matice)

Úvod do programovacího jazyka Python

UML. Unified Modeling Language. Součásti UML

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

6. blok část C Množinové operátory

MATICE. a 11 a 12 a 1n a 21 a 22 a 2n A = = [a ij]

Lineární algebra - I. část (vektory, matice a jejich využití)

Tvorba informačních systémů

PQ-stromy a rozpoznávání intervalových grafů v lineárním čase

Metody analýzy dat I. Míry a metriky - pokračování

1 Projekce a projektory

1 Nejkratší cesta grafem

Transkript:

PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY DIPLOMOVÁ PRÁCE Vyhledávání vzorů ve zdrojových kódech.net 2010 Václav Bazgier

Místopřísežně prohlašuji, že jsem celou práci včetně příloh vypracoval samostatně. 9. dubna 2010 Václav Bazgier i

Anotace Cílem této diplomové práce bylo nahlédnout do problematiky detekce návrhových vzorů ve zdrojových kódech platformy.net. Seznámení se s problematikou převodu komponent a vzorů do matice a provedení analýzy pomocí vybraných metod. ii

Děkuji Ing. Jiřímu Hronkovi za vedení mé diplomové práce, poskytnutou volnost při realizaci a za rady při konzultacích. iii

Obsah 1. Úvod 1 2. Cíl práce 1 3. Návrhové vzory 2 3.1. Historie vzorů............................. 2 3.2. Rozdělení návrhových vzorů..................... 2 3.2.1. Vytvářející vzory....................... 3 3.2.2. Strukturální vzory...................... 3 3.2.3. Vzory chování......................... 4 3.3. Application architecture patterns.................. 5 3.4. Data access patterns......................... 6 4. Teorie grafů 6 5. Matice 8 6. Reprezentace grafu jako matice 9 7. Převod vzoru do grafu 9 8. Vzory vhodné pro analýzu 11 9..NET framework 12 9.1. Historie................................ 13 9.2. Common Intermediate Language.................. 13 9.3. Reflexe................................. 14 9.4. Převod zdrojového kódu do grafu.................. 14 10.Metody detekce 14 10.1. Přesné metody............................ 15 10.2. Přibližné metody........................... 17 10.2.1. Editační vzdálenost...................... 17 10.2.2. Neuronové sítě........................ 17 10.2.3. Similarity scoring....................... 17 11.Uživatelská příručka 20 12.Popis implementace 26 12.1. Specifikace požadavků........................ 26 12.2. Návrh aplikace............................ 26 12.2.1. Diagram tříd......................... 27 12.2.2. Diagram vrstev........................ 28 i

12.3. Klíčové funkce............................. 29 12.3.1. Sestavení matic asociace a generalizace........... 29 12.3.2. Detekce vzoru na základě izomorfizmu........... 29 12.3.3. Detekce vzoru na základě similarity scoring......... 30 12.4. Popisy metod............................. 30 12.4.1. Metody třídy MatrixMake.................. 31 12.4.2. Metody třídy CompareMatrix................ 31 12.4.3. Metoda třídy ExportToCSV................. 31 12.4.4. Metody třídy MathOperation................ 31 12.4.5. Metody třídy SimilarityScoring............... 32 13.Experimenty 32 13.1. Pozitivní příklady........................... 32 13.2. Negativní případy........................... 32 13.3. Vlastní experimenty......................... 33 13.3.1. Experiment č. 1........................ 33 13.3.2. Experiment č. 2........................ 33 13.3.3. Experiment č. 3........................ 34 13.3.4. Experiment č. 4........................ 34 13.3.5. Experiment č. 5........................ 35 13.4. Závěr experimentů.......................... 35 14.Závěr 37 15.Conclusions 38 Reference 39 ii

Seznam obrázků 1. Návrhový vzor Továrna........................ 3 2. Návrhový vzor Dekorátor....................... 4 3. Návrhový vzor Pozorovatel...................... 5 4. Neorientovaný graf.......................... 7 5. Orientovaný graf........................... 7 6. Graf vzoru dekorátor - asociace................... 10 7. Graf vzoru dekorátor - generalizace................. 11 8. Rozdělení metod detekce....................... 15 9. Část systému............................. 16 10. Jednoduchý vzor........................... 16 11. Úvodní obrazovka aplikace...................... 20 12. Aplikace po načtení komponenty................... 21 13. Aplikace s maticí asociace...................... 22 14. Aplikace s maticí generalizace.................... 23 15. Aplikace, popis matic návrhového vzoru.............. 24 16. Výsledek přesné metody....................... 25 17. Výsledek přibližné metody...................... 26 18. Diagram tříd............................. 28 19. Diagram vrstev............................ 28 20. Sestavení matic asociace a generalizace............... 29 21. Detekce vzoru na základě izomorfizmu............... 30 22. Detekce vzoru na základě similarity scoring............. 30 iii

Seznam tabulek 1. Experiment č. 1............................ 33 2. Experiment č. 2............................ 33 3. Experiment č. 3............................ 34 4. Experiment č. 4............................ 34 5. Experiment č. 5............................ 35 iv

1. Úvod Během návrhu a následného vývoje software se velice často stává, že problémy, které se vyskytují, mají stejné řešení. V roce 1991 se této problematice věnovala skupina programátorů, kteří této problematice dali jistý řád a pravidla. O historii pojednává další kapitola. Návrhové vzory (dále jen vzory) hrají v dnešní době velmi důležitou roli při návrhu a následném vývoji softwaru především v komerční sféře. Znalost a použití vzorů napomáhá softwarovým architektům a analytikům řešit každodenní problémy při návrhu aplikací. Vzory popisují postupy, které se během vývoje často opakují, a které se velice často používají pro řešení konkrétního problému. Nejedná se však o nějakou část zdrojového kódu nebo komponentu, která se připojí k programu, ale jedná se o textový (většinou doplněný UML diagramem) popis řešení, jak daný problém vyřešit. Použití vzorů při vývoji software je také důležitým měřítkem při hodnocení kvalit a technologické zralosti softwarové společnosti. V rámci modelu CMMI (Capability maturity model integrity) je použití vzorů vhodné od stupně tři a výš. Model CMMI popisuje kvalitu organizace v rámci vývoje software. Model byl poprvé zaveden v roce 1990 a má pět úrovní. Každá úroveň modelu popisuje zralost vývojového týmu a tím vlastně poskytuje měřítko kvality dané organizace. Úrovně modelu jsou tyto: 1. Počáteční (Initial) - tým nerealizuje žádný proces vývoje nebo jen velice minimálně 2. Řízené (Managed) - vývojový proces je řízený a činnosti s tím spjaté také 3. Definované (Defined) - postupy jsou definovány a podrobně dokumentovány 4. Kvantitativní řízení (Quantitaviely managed) - procesy jsou řízeny a kontrolovány kvantitativně 5. Optimalizující (Optimizing) - vývojový tým neustále optimalizuje svou činnost Model CMMI je nepostrádatelnou součástí v každé společnosti, která se snaží vyvíjet kvalitní a moderní software. 2. Cíl práce V dnešní době je vhodné posoudit a zpětně analyzovat vytvořené aplikace, zdali během vývoje softwarového systému byly použity návrhové vzory, které napomáhají analytikům nebo vývojářům řešit problémy při vývoji systému. Analýza je možná buď okem zkušeného softwarového experta anebo pomocí nějakých algoritmů. Proto je cílem této diplomové práce seznámení se s postupy automatizované detekce vzorů ve zdrojových kódech na platformě.net. Práce se 1

stručně zaměřuje na popis jednotlivých metod detekce, a dále se podrobněji zabývá dvěma přístupy detekce. První kategorie metod se nazývá přesná. V této kategorii se budeme zabývat izomorfizmem grafu. Druhá kategorie metod je přibližná a v ní si popíšeme metodu similarity scoring. V druhé části textu je pak uvedený podrobnější popis aplikace, která v rámci této práce vznikla. Na závěr je pak uvedena sada experimentů, která byla provedena na různých vstupních datech. Data byla buď speciálně pro tuto práci vytvořená, tak data reálných programů (komponent). 3. Návrhové vzory 3.1. Historie vzorů Historie vzorů je spojena se stavební architekturou. V této souvislosti se totiž poprvé použil termín návrhový vzor. Vyslovil ho architekt Christopher Alexander v šedesátých letech dvacátého století. Jednalo se o popis architektonický stylů, které měly vlastně stejný původ, ale rozdílnou vlastní realizaci. Třeba gotika, baroko a další. Ve světě počítačů se s tímto termínem poprvé setkáváme v roce 1987 na konferenci OOPSLA v Orlandu (ve státě Florida). Použili jej pánové Kent Beck a Ward Cunningham na základě několika připravených vzorů v jazyce SmallTalk, které sloužily pro začínající programátory v tomto jazyce. Dalším významným milníkem pro zavedení vzorů bylo utvoření skupiny Gang Of Four na začátku devadesátých let dvacátého století, konkrétně v roce 1991. Skupinu GoF (jak se často zkracuje) jak samotný název napovídá, tvořilo uskupení čtyř mužů a to Ericha Gammy, Richarda Helma, Ralpha Johnsona a Johna Vlissidese, kteří se zabývali problematikou objektově orientovaného návrhu softwaru. 3.2. Rozdělení návrhových vzorů Vzory dělíme (podle GoF) do třech hlavních kategorií: 1. Vytvářející vzory (creational patterns) 2. Strukturální vzory (structual patterns) 3. Vzory chování (behavioral patterns) Dále jsou na ukázku uvedeny typické příklady vzorů, po jednom z každé kategorie. Pro detailnější studium vzorů lze doporučit [2]. 2

3.2.1. Vytvářející vzory Tento typ vzorů nabízí řešení, jakým způsobem vytvářet v rámci systému jednotlivé objekty. Řeší problematiku jakým způsobem vybrat správnou třídu a jak ji inicializovat a tím ji zařadit do systému. Mezi základní vzory z této kategorie patří: abstraktní továrna, továrna, stavitel, prototyp a singleton. Továrna Tento vzor (viz. obrázek 1.) popisuje možnost, jakým způsobem rozhodnout o vytvoření konkrétní instance třídy až během samotného průběhu programu. Obrázek 1. Návrhový vzor Továrna Vzor továrna se doporučuje použít, pokud v systému existuje několik tříd, které mají stejného předka a tyto třídy pracují s různými daty. Vzor pak nabízí vytvoření konkrétní instance třídy v průběhu program. 3.2.2. Strukturální vzory Strukturální vzory popisují možnosti, jakým způsobem v systému uspořádat jednotlivé třídy popř. komponenty. Snaží se maximálně zpřehlednit čitelnost takto navrženého systému. 3

Mezi základní vzory, které do této kategorie patří, jsou: adaptér, most, kompozit, dekorátor, fasáda, proxy a muší váha (flyweight). Dekorátor S pomocí tohoto vzoru je možné řešit problém změny vlastností instance třídy, bez toho aniž by se vytvořit nová odvozená třída. Obrázek 2. Návrhový vzor Dekorátor 3.2.3. Vzory chování Vzory chování se zajímají o to, jakým způsobem se systém chová a to především, jak spolu jednotlivé algoritmy a objekty spolupracuji. V této kategorii vzorů jsou nejznámější tyto: Pozorovatel, Stav, Návštěvník, Template, Příkaz, Iterátor, Strategie a Řetězec zodpovědnosti. Pozorovatel Tímto vzorem se řeší problém závislosti jednoho objektu na dalších objektech. Jedná se vlastně o řešení problému, jakým způsobem šířit události z jednoho objektu na objekty na něm závislými. 4

Obrázek 3. Návrhový vzor Pozorovatel Důležité je také podotknout, že rozdělení podle GoF, není jediné možné rozdělení. Existují další rozdělení vzorů podle různých témat. Mezi další kategorie patří například Application architecture patterns a Data access patterns. Více o rozdělení vzoru například [8]. 3.3. Application architecture patterns Toto rozdělení vzorů vychází z knihy Patterns of Enterprise Application Architecture od autora Martina Fowlera. Vzory jsou rozděleny do skupin, které v rámci aplikace zastupují různé komponenty systému. Skupiny jsou následující: Domain logic patterns Data source architecural patterns Object-relational behavioral patterns Object-relational structural patterns Object-relational metadata mapping patterns 5

Web presenation patterns Distribution patterns Offline concurrency patterns Session state patterns Base patterns 3.4. Data access patterns Tento typ vzorů se zabývá různými metodami přístupu k datům. Vzory se v tomto rozdělení nedělí dál na kategorie, proto si vyjmenujeme nejvýznamnější vzory, které do této kategorie patří: Cache patterns Resource patterns Input/output patterns Decoupling patterns A další 4. Teorie grafů Při vlastní realizaci této práce se pracuje s některými důležitými pojmy z oblasti teorie grafů. V této kapitole budou popsány pouze nezbytné pojmy, pro více informací lze doporučit [3]. Teorie grafů je významnou kapitolou teoretické informatiky a také má široké praktické využití. Pomocí grafů se můžou řešit úlohy, jako je tok v síti, problém čtyř barev a jiné. Grafy se v počítači mohou reprezentovat několika způsoby. Mezi nejčastěji používanou reprezentaci bychom mohli zařadit reprezentaci pomoci matice, v důsledku tedy ve formě dvojrozměrného pole. Více si o reprezentaci napíšeme na konci této kapitoly. Definice 4.1. Graf je trojice G = (H, U, P ), kde H je množina hran H = {h 1, h 2,.., h n } U je množina uzlů U = {u 1, u 2,., u n } P je incidenční funkce, která je dána předpisem: 6

Pro neorientovaný graf: H U U, kde U U označuje množinu všech neuspořádaných dvojic prvků z množiny U. Pro orientovaný graf H U U, kde U U označuje kartézský součin (množinu všech uspořádaných dvojic prvků z množiny U). Pro počet hran v množině H používáme zápis H a pro počet uzlů v množině U používáme zápis U. Graf může také obsahovat uzly, do kterých nevedou žádné hrany, v takovém případě nazýváme graf nesouvislý. Grafy tedy můžeme podle definice rozdělit na orientované a neorientované. Neorientovaný graf obsahuje symetrické vztahy mezi objekty, kdežto orientovaný graf má vazby nesymetrické. Orientace vztahu se v takovémto grafu vyznačuje pomocí šipky. Obrázek 4. Neorientovaný graf Obrázek 5. Orientovaný graf Dále si musíme zavést pojmy podgraf a isomorfismus grafů. = (H, U, P ) ta- Definice 4.2. Mějme graf G = (H, U, P ). Pak graf G kový, že 7

H H množina hran grafu G je podmnožinou množiny hran grafu G U U množina uzlů grafu G je podmnožinou množiny uzlů grafu U Pro každou hranu h H platí p (h) = p(h) incidenční funkce grafu G je zúžením incidenční funkce grafu G se nazývá podgraf grafu G. Definice 4.3. Dva grafy G a G jsou isomorfní právě tehdy, když existuje takové zobrazení f : V (G) V (G ), že platí {i, j} E(G) {f(i), f(j)} E(G ) 5. Matice Dalším důležitým pojmem, se kterým se v této práci bude pracovat je pojem matice. Definice 5.1. Matice M se definuje nad číselným tělesem P jako zobrazení {1, 2,..., n} {1, 2,..., m} P. Jedná se vlastně o tabulku, která obsahuje n sloupců a m řádku, každý prvek matice se dá jednoznačné určit pomocí indexu, který je dán z rozsahu {1,..., n} popř. {1,..., m}. Pokud n = m, pak hovoříme o tzv. čtvercových maticích. S tímto typem matic budeme dále pracovat. S maticemi můžeme provádět různé operace, kterým se obecně říká maticový počet. Ukázka čtvercové matice n = 3: 1 0 1 M = 0 0 1 0 0 0 Mezi základní operace s maticemi, které v této práci budeme používat, jsou sčítání, násobení, dělení matic, transpozice matice a shoda matic. Shoda matic O dvou maticích A a B řekneme, že jsou shodné, právě když mají stejný počet sloupců a řádků a prvek a ij A je roven prvku b ij B. Rovnost matic se zapisuje A = B. Sčítáni matic Máme-li dvě matice A a B typu m n, matice jejich součtu S je typu m n, S = A + B, prvky matice S jsou určeny vztahem s ij = a ij + b ij. Násobení matice 8

Máme-li matici A typu m s a matici B typu s n, pak matice jejich součinu S je typu m n. Prvky matice S jsou dány vztahem s ij = s k=0 a ik b kj. Dělení matice konstantou Matice A typu m n a konstantu k 0, pak vydělená matice S = A/k, pro její prvky platí s ij = a ij /k. Transpozice matice Matice, která vznikne z matice A typu m n se nazývá transponovaná (označuje se A T ) typu n m, pokud dojde v matici A na výměnu řádků a sloupců. a T ij = a ji. Dále s maticemi budeme pracovat tak, že budeme měnit pořadí u řádků a sloupců matice. Abychom dosáhli záměny všech řádků a sloupců, je nutné použít permutace na zvolené množině, která je v tomto případě reprezentována počtem řádku (nebo sloupců) matice. Více o této problematice nalezneme v [4]. 6. Reprezentace grafu jako matice Graf můžeme reprezentovat několika způsoby. Obvykly a již zde prezentovaný způsob je grafický, tzn. pomocí diagramu. Další způsob je už více formální a to pomoci matice. K tomuto účelu se zavádí pojem matice sousednosti a její definice zní takto: Definice 6.1. Mějme graf G = (H, U, P ) s množinou hran H = {h 1, h 2,..., h n } a množinou uzlů U = {u 1, u 2,..., u m }. Matice sousednosti je čtvercová matice řádu m. Její prvky pro orientovaný graf jsou dány předpisem: S jk = 1, jestliže je hrana z uzlu u j do uzlu u k S jk = 0, jestliže mezi uzly u j a u k není hrana. 7. Převod vzoru do grafu Na návrhový vzor můžeme nahlížet jako na orientovaný graf, kde jednotlivé uzly jsou třídy a orientované hrany jsou vazby mezi třídami. Při převodu vzor na graf musíme vytvořit zvlášť graf, který reprezentuje asociaci a zvlášť generalizaci mezi třídami. Důvod je ten, že operace s těmito grafy je pak jednodušší. Orientovaný graf dále převedeme na čtvercovou matici, kde řád matice je roven počtu uzlů v grafu. 9

Jako příklad uvedeme převod vzoru dekorátor na graf a následně na matici sousednosti. Vzor dekorátor podle obrázku 2.. obsahuje čtyři třídy. Ve vzoru je zastoupena jak dědičnost, tak asociace a proto se vytvoří dva orientované grafy, které reprezentují tyto dvě vlastnosti a dále grafy převedeme na matice sousednosti. Na začátek si označíme třídy vzoru čísly, pro jednodušší orientaci: Component = 1 ConcreteComponent = 2 Decorator = 3 ConcreteDecorator = 4 Obrázek 6. Graf vzoru dekorátor - asociace A asociace = 1 2 3 4 1 0 0 0 0 2 0 0 0 0 3 1 0 0 0 4 0 0 0 0 10

Obrázek 7. Graf vzoru dekorátor - generalizace A generalizace = 1 2 3 4 1 0 0 0 0 2 1 0 0 0 3 1 0 0 0 4 0 0 1 0 Z tohoto příkladu je patrný převod grafu na matice sousednosti, které nám dále umožní operace spojené s detekcí vzoru. 8. Vzory vhodné pro analýzu Jednotlivé vzory se dají reprezentovat jako matice za předpokladu, že ve vzorech jsou mezi třídami obsaženy vazby typu asociace a generalizace. Toto pravidlo, ale neplatí u všech vzorů, které jsou zastoupeny v rozdělení podle GoF. Typickými zástupci jsou vzory z kategorie chovaní (behavorial patterns), které se nezajímají o návrh systému jako takového, ale jejich využití je především v návrhu komunikaci mezi jednotlivými objekty, což se děje na úrovni volání různých metod. Pro příklad si můžeme uvést návrhový vzor Pozorovatel (Observer), jehož hlavní ideji je definice závislostí mezi jedním a více objekty. Vzor umožňuje řešení šíření informace, která nastala v jednom objektu, ke všem závislým objektům. Tohoto řešení se docílí použitím metod attach a detach, které umožňují se objektu zaregistrovat jako pozorovatel (observer) a tím sledovat změny, které nastaly v pozorovaném objektu. Protože tento vzor řeší návrh algoritmů (metody attach, 11

detach atd.) a nikoliv vztahy mezi objekty, nelze tedy toto řešení popsat pomocí matic sousednosti a provést analýzu. Dalším vzorem, který se nehodí pro analýzu a není zařazen do kategorie vzorů chování, je vzor Fasáda (Facade). Tento vzor nabízí řešení, jak zjednodušit vstup do systému. Tento vzor vytvoří vstupní bod do systému a nabízí tak rozhraní, přes které můžeme se systémem komunikovat. Vzor je ale povýšen nad vlastní systém a neměl by se chápat jako součást systému z pohledu vazeb asociace a generalizace. Vzor Singleton také není vhodný pro analýzu, protože jeho úkolem je zajistit instanci pouze jednoho objektu ze zvolené třídy. Tohoto stavu se v rámci.net frameworku dosáhne pomocí klíčového slova static a nejedná se tedy o žádnou vazbu typu generalizace/asociace. 9..NET framework K tomu abychom mohli analyzovat zdrojové kódy, je zapotřebí si vybrat nějaké prostředí, ve kterém se analýza realizuje. Můžeme zvolit jakýkoliv objektový jazyk, jako je třeba C++ nebo C#, ale často se stává, že komponenty a různé části systému jsou napsány v různých jazycích, což je pro potřeby analýzy nevhodné. Proto je vhodné zvolit za prostředí nějaký framework,který tyto vyšší programovací jazyky překládá do nějakého nízko úrovňového mezijazyka. Důležitou vlastností zvoleného frameworku je, aby byl framework objektový. Jedním z nejrozšířenějších frameworků pro vývoj aplikací na světě a plně objektovým prostředím je.net framework. Dříve než popíšeme vlastní.net framework je nutné poznamenat, že samotný.net framework je jen součásti platformy.net, což je kolekce technologií vyvíjená především společností Microsoft. Platforma nabízí technologie nejen pro operační systém Windows, ale také webové technologie a také třeba technologie pro mobilní zařízení. Samotný.NET framework je hlavní součásti platformy.net a slouží pro provoz aplikací, tak i pro samotný vývoj těchto aplikací. Nabízí knihovny, které velice usnadňují vývoj aplikací v prostředí.net. Hlavním vývojovým prostředkem pro platformu.net je Visual Studio (aktuálně ve verzi 2010)..NET framework obsahuje několik programovacích jazyků a tím nabízí vývojáři širší možnosti při vývoji samotné aplikace. Mezi nejznámější patří C#, Visual Basic a J#. Obsahuje také ale méně obvyklé jazyky ve Windows, jako je třeba IronPython, F# nebo LSharp. Ať už si programátor vybere jakýkoliv jazyk, při samotném překladu programu je zdrojový kód převeden do jazyka Common intermediate language (CIL). Tomuto jazyku je věnována samostatná podkapitola dále. 12

9.1. Historie.NET framework byl poprvé vydán v roce 2002 a to ve verzi 1. Součásti frameworku bylo uvedení jazyka C#, který vycházel z jazyků C++ a Java. Další novou a převratnou verzí.net frameworku byla verze 2, která vyšla v roce 2005 a její součásti byl jazyk C# 2.0. V současné době je aktuální verze frameworku 3.5, které obsahuje programovací jazyk C# 3.0. Mezi důležité součásti aktuální verze frameworku jsou tyto technologie: ASP.NET pro tvorbu webových aplikací Windows presenation foundation - technologie pro vytváření nového uživatelského technologie pro tvorbu distribuova- Windows communication foundation ných aplikací Language integrated query (LINQ) nová objektová technologie pro přístup k datům Samotný framework se neustále vyvíjí a nabaluje na sebe nové technologie a možnosti tvorby software. V brzké době by se měla uvolnit verze 4.0. 9.2. Common Intermediate Language Common Intermediate Language (ve zkratce CIL) je nejnižší programovací jazyk (nazýván také někdy jako mezijazyk) v rámci platformy.net. Do jazyka CIL se překládají všechny programovací jazyky, které jsou obsaženy v rámci.net frameworku. Jazyk je nezávislý na hardwarové platformě. Mezi jeho základní charakteristiky a vlastnosti patří: Objektová orientace Přísná typizace dat Ošetření chyb prostřednictvím výjimek Užití atributů Tyto vlastnosti a přístup daly možnost vytvořit jazyk CIL a tak poskytnout základní platformu pro.net framework. 13

9.3. Reflexe Reflexe (také se používá termín reflection) je obecný termín, který v platformě.net obsahuje třídy a metody, pro dynamický přístup k typům a objektům v programech. Jak již bylo napsáno výše, základním stavebním kamenem.net frameworku je matajazyk CIL, do kterého jsou zkompilovány veškeré programovací jazyky v rámci.netu. Reflexe nám nabízí možnost sestavit zdrojový kód do metajazyka CIL, z již zkompilovaného programu. A proto můžeme zkompilovaný kód analyzovat. Protože jazyk CIL zachovává i logickou strukturu programu, můžeme tak zjistit vazby mezi jednotlivými objekty. Třídy a metody reflexe jsou dostupné ve jmenném prostoru System.Reflection. Mezi jednu z nejdůležitějších metod lze považovat metodu GetTypes(). Tato metoda vrací kolekci typů v programu, které nám dále poslouží k vytvoření grafu reprezentující asociaci a generalizaci mezi třídami v programu. Další důležitou metodou v reflexe je metoda GetFields(), která slouží k přečtení informací o datových členech. Metodu lze některými parametry nastavit a získat tak potřebné informace k sestavení grafu sousednosti. 9.4. Převod zdrojového kódu do grafu Jak již bylo napsáno výše, reflexe a metajazyk CIL nám slouží k vytvoření seznamu tříd a rozhraní a následně lze sestavit grafy reprezentující vazby mezi nimi. Pro to, abychom mohli analyzovat zdrojový kód aplikace pomocí reflexe, musí být program tedy přeložen do binární podoby. Jakmile je tedy program (také komponenta) přeložená do binární podoby, je tedy možné pomocí reflexe ji analyzovat. Reflexe nám umožňuje získat kompletní seznam tříd a dále zjistit vazby mezi jednotlivými třídami. Na základě těchto tříd a vazeb je pak možné sestavit grafy, které reprezentují analyzovaný program. Grafy se popisují pomocí matic sousednosti, se kterými se pracuje dál. 10. Metody detekce Ve chvíli, kdy máme dva grafy popisující vzor a náš zdrojový program, můžeme začít tyto dva grafy porovnávat. Problematikou porovnání dvou grafů se zabývá tzv. graph matching (do češtiny volně přeloženo jako porovnávání grafů). V současné době existuje několik technik a přístupů k této problematice. Hlavní rozdělení, které se v odborné literatuře uvádí ([9]), rozděluje možnosti detekce do takzvaných přesných a přibližných metod, které se dále dělí do dalších podkategorií(viz. obrázek 8.). 14

10.1. Přesné metody Obrázek 8. Rozdělení metod detekce V angličtině se také používá termín exact graph matching. Tyto metody jsou založeny na izomorfizmu dvou grafů. Je tedy nutné, aby graf reprezentující vzor a zdrojový kód měly stejný počet uzlů. Protože často je graf reprezentující zdrojový kód větší než graf vzoru, je nutné přistoupit k vytváření podgrafů grafu zdrojového kódu o velikosti grafu vzoru. Pak je možné tyto grafy porovnat a zjistit, zdali jsou vzájemně izomorfní. Složitost tohoto problému patří do kategorie NP-úplné, proto se většinou nedá v konečném čase vyřešit. V této práci ale pracujeme s malým množstvím uzlů (do deseti), proto je možné použít i tuto metodu a úspěšně ji používat. Vstupy algoritmu: Matice reprezentující systém Matice reprezentující vzor Popis algoritmu: 1. Vytvoření permutace množiny o počtu prvků, která je rovna stupni matice reprezentující systém 2. Vytvoření všech matic (ozn. All(M)) ze vstupní matice reprezentující analyzovaný systém se záměnou pořadí v řádcích a sloupcích 15

3. Vytvoření všech pod-matic (ozn. SubAll(M)) matic z All(M) o stupni matice reprezentující vzor 4. Porovnání všech matic ze SubAll(M) maticí, která reprezentuje vzor. Příklad: Na jednoduchém příkladu si ukážeme jak tato metoda funguje. Nyní převedeme Obrázek 9. Část systému Obrázek 10. Jednoduchý vzor systém a vzor na matice sousednosti: Sys asociace = A B C A 0 0 0 B 0 0 0 P att asociace = C 1 0 0 ( 1 2 ) 1 0 0 2 1 0 Sys generalizace = A B C A 0 0 0 B 1 0 0 P att generalizace = C 0 1 0 ( 1 2 ) 1 0 0 2 1 0 Pro další ukázku porovnání si zvolíme matice generalizace. Nyní je zapotřebí vytvořit všechny podmatice matice Sys generalizace o řádu matice P att generalizace. Nyní když máme vytvořené všechny podmatice matice Sys generalizace, můžeme tyto matice porovnat s maticí P att generalizace. Když se matice sobě rovnají, 16

je nalezena shoda a byl tak v matici Sys generalizace identifikován vzor. Tuto metodu musíme dále provést i s maticí, která reprezentuje asociace mezi třídami. Výsledkem této metody je tedy seznam podmatic, které se rovnají matici sousednosti, která reprezentuje vzor. Z tohoto příkladu jsou to například tyto matice: ( A B A 0 0 B 1 0 ) ( A C A 0 0 B 1 0 ) ( A C ) C 0 0 B 1 0 10.2. Přibližné metody Tyto metody detekce řeší problém složitosti u přesných metod. Problémem přibližných metod je ten, jak již samotný název napovídá, že nedovedou přesně odpovědět na otázku, je-li návrhový vzor obsažen ve zdrojovém kódu. Výhodou těchto metod je i to, že graf vzoru a graf aplikace nemusí mít stejný počet uzlů. V této práci jsem se zaměřil na algoritmus Similarity scoring a dříve než si ho detailně popíšeme, představíme si ještě jiné metody detekce. 10.2.1. Editační vzdálenost Tato metoda je založena na principu počtu jednoduchých operací, pomocí kterých lze převést jeden graf na druhý. Operace jsou přidáni, odebráni a přejmenování hrany nebo uzlu. Jako výsledek je pak uváděné číslo, které znamená nejmenší počet operací, které byly použity k přechodu z jednoho grafu na druhý. Tato metoda se velice často používá při práci s textem a také s grafy. Více se o této metodě lze nají v [10]. 10.2.2. Neuronové sítě Pomocí neuronových sítí se dá řešit mnoho problémů spojená s teorií grafů a podobnosti dvou grafů. Vždy se na konkrétní problém volí konkrétní neuronová sít, se specifickou tréninkovou množinou. Typy problémů, které jsou spojeny s neuronovými sítěmi a grafy jsou např. autentifikace pomocí obličeje, dále pak předpovědi chování tropických cyklónů anebo zkoumání mozku. Více k této problematice lze najít v [11]. 10.2.3. Similarity scoring Tento algoritmus jsem si vybral pro implementaci z kategorie přibližných metod. Jeho principem je výpočet podobnostní matice, která udává, jak moc 17

je návrhový vzor obsažen ve zdrojovém kódu. Vychází ze vzorce, který vypočte podobnostní matici na základě dvou různých grafů (více viz. [12]). Algoritmus je založen na iterativním způsobu výpočtu podobnostní matice. Dokud se dvě předchozí matice neliší o předem nadefinovanou hodnotu, výpočet pokračuje dál. Vstupem výpočtu jsou dvě matice A a B, které reprezentují zdrojový kód a návrhový vzor. Podobnostní matice S velikosti n a n b je definována prvky s ij, které reprezentují, jak moc uzel j z grafu G a a tedy matice sousednosti A, je podobný uzlu i z grafu G b tedy matice B. Hodnota v s ij je nazývána podobnostní skóre. Popis algoritmu: 1. Z 0 = 1, v matici Z jsou uloženy dočasné výsledky výpočtu. Na začátku jsou všechny prvky matice nastaveny na 1 2. Dokud matice Z nebude konvergovat, opakuje se výpočet pomocí tohoto vzorce: Z k+1 = 3. Výsledná matice S je poslední matice Z k Vysvětlivky: A, B jsou matice sousednosti grafů G a a G b. 1 je výpočet 1-normy. BZ ka T + B T Z k A BZ k A T + B T Z k A 1 Výpočet první normy: První norma matice se vypočte pomoci vzorce: A 1 = max 1 j n m a ij Vzorec vypočte maximální hodnotu sloupců zadané matice. Příklad: Jako ukázku výpočtu pomocí tohoto algoritmu, použijeme již výše uvedený příklad u přesných metod. Po převodu malého systému (viz. obrázek 9.) a návrhového vzoru (viz obrázek 10.) můžeme přejít k samotnému výpočtu podobnostní matice. Nejprve vypočteme matici s asociacemi: Vstup: i=1 18

Matice asociace reprezentující aplikaci Matice asociace reprezentující vzor Výstup: S asociace = 1 2 A 1 0 B 0 0 C 0 1 Vstup: Dále provedeme výpočet s maticemi reprezentujícími generalizaci: Matice generalizace reprezentující aplikaci Matice generalizace reprezentující vzor Výstup: S generalizace = 1 2 A 0.5 0 B 0.5 0.5 C 0 0.5 Nyní máme k dispozici dvě matice, které reprezentují podobnostní skóre za použití matic asociací a generalizací. K výsledné podobnostní matici se dostaneme tak, že matice sečteme a výslednou matici normalizujeme. Matice, kterou výsledek normalizujeme má na hlavní diagonále hodnoty 1/k. Číslo k je rovno počtu matic ve kterých se vzor popisoval, tzn. v našem případě k = 2. Výsledná podobnostní matice S: S = 1 2 A 0.75 0 B 0.25 0.25 C 0 0.75 Výsledná matice S se tedy dá číst tak, že jednotlivé řádky jsou třídy reprezentující analyzovaný systém a sloupce jsou třídy vzoru. Když tedy výslednou matici budeme analyzovat, z matice vyplývá, že existuje silná podobnost mezi třídami (A, 1) a (C, 2). Podle obrázku 9. a 10. je systém a vzor vzájemně podobné. 19

11. Uživatelská příručka Abychom mohli vybrané metody ověřit pomocí experimentů, vytvořil jsem aplikaci PathFinder, která implementuje výše zmíněné metody detekce. Jedná se o jednoduchou aplikaci, která obsahuje několik vzorů vhodných pro experimenty a dále nabízí základní možnosti práce s načtenou komponentou. Výsledky detekčních metod jsou pak jednoduše zobrazeny. Obsahem uživatelské příručky je seznámit čtenáře s vlastním ovládáním aplikace a jejími možnostmi. Aplikace PathFind je vytvořená jako klasická desktopová aplikace v prostředí Microsoft Windows. K jejímu spuštění je zapotřebí mít nainstalovaný.net framework 2.0 nebo vyšší. Aplikace nevyžaduje instalaci, proto je možné aplikaci spouštět přímo. Po spuštění aplikace se zobrazí okno (viz. 11.), v tuto chvíli můžeme začít s aplikací pracovat. Aplikace je rozdělena na tři záložky. V první záložce lze načíst zdrojový kód a dále nastavit návrhový vzor k porovnání. Obrázek 11. Úvodní obrazovka aplikace Po načtení zkompilovaného zdrojového kódu, se zobrazí seznam tříd, které byly nalezeny a pomocí tlačítek: Matice asociace a Matice generalizace se můžeme podívat na vazby mezi jednotlivými třídami (viz. obrázek 12.). 20

Obrázek 12. Aplikace po načtení komponenty Dále je možné se podívat na vzniklé matice asociace a generalizace, jak je zobrazeno na obrázcích. Jak je možno vidět, zobrazí se čtvercová matice, která je doplněna o seznamem tříd. V místě, kde je vazba mezi dvěma třídami, je v matici jednička (viz. obrázek 13. pro asociace a obrázek 14. pro generalizaci). 21

Obrázek 13. Aplikace s maticí asociace 22

Obrázek 14. Aplikace s maticí generalizace V další části aplikace (Výběr vzoru), si může uživatel vybrat návrhový vzor, který chce vyhledávat a také si může prohlédnout, jak jsou u tohoto vzoru definovány matice asociace a generalizace (viz. obrázek 15.). Poté co má uživatel načtenou aplikaci a vybraný návrhový vzor, může zahájit vyhledávání návrhového vzoru. V záložce Přesné metody může spustit Vyhledání vzoru. 23

Obrázek 15. Aplikace, popis matic návrhového vzoru Jakmile algoritmus doběhne, zobrazí se výsledné okno s jednotlivými výsledky vyhledávání (viz. obrázek 16.). Výsledky se zobrazují tak, že jsou tam takové kombinace tříd, ve kterých byl zvolený návrhový vzor nalezen. 24

Obrázek 16. Výsledek přesné metody Poslední záložkou je ta, pomocí které lze realizovat detekci pomocí přibližné metody. Po spuštění detekce vzoru se zobrazí výsledné podobnostní matice (viz. obrázek 17.). Ve výsledku je zobrazena i legenda, pro jednodušší orientaci v podobnostní matici. 25

Obrázek 17. Výsledek přibližné metody 12. Popis implementace V této části práce se budeme zabývat popisem praktické části diplomové práce. Aplikace, kterou jsem vytvořil, se jmenuje PathFind a aplikuje dvě výše popsané metody a to přesnou metodu pomocí izomorfizmu a přibližnou metodu similarity scoring. Nejprve si napíšeme něco o analýze požadavků, pak se zaměříme na návrh aplikace a klíčové funkce. Dále pak se seznámíme s uživatelskou příručkou a nakonec, v programátorské části, napíšeme o jednotlivých metodách aplikace. 12.1. Specifikace požadavků Úkolem aplikace je načíst překompilovaný program v prostředí.net framework, dále pak pomocí reflexe detekovat všechny třídy a rozhraní a na základě vazeb typu asociace a generalizace sestavit orientovaný graf, který se v aplikaci reprezentuje pomocí matice sousednosti. 12.2. Návrh aplikace Návrhem aplikace se myslí především diagram tříd a diagram vrstev. Protože samotná aplikace není příliš složitá, stačila jednoduchá analýza, která ve svém výsledku navrhuje vytvořit dvou-vrstvou aplikaci, kde uživatelské rozhraní nabízí základní ovládání ze strany uživatel, tak jak je standardně zvykem a pak business 26

vrstvu, která se stará jak o vlastní logiku programu, tak i o vstupy a výstupy aplikace. 12.2.1. Diagram tříd V této podkapitole si vyjmenuje a popíšeme třídy, které se nacházejí v tzv. business vrstvě aplikace a které mají za úkol načíst zdrojový kód a následně na něm provést detekci vybraného vzoru. V aplikaci jsou tyto třídy: MatrixMake - třída, která obsahuje metody pro tvorbu matic asociace a generalizace CompareMatrix - v této třídě jsou obsaženy přesné metody výpočtu ExportToCSV - třída, která obstarává export do formátu CSV MathOperation - třída s metodami pro počítání s maticemi SimilarityScoring - tato třída obsahuje metody pro výpočet algoritmu similarity scoring 27

Obrázek 18. Diagram tříd 12.2.2. Diagram vrstev Jak již bylo napsáno na úvod této kapitoly, jedná se o dvou-vrstvou aplikaci. Proto tzv. business vrstva kromě vlastní logiky aplikace pracuje i se vstupy a výstupy. Obrázek 19. Diagram vrstev 28

12.3. Klíčové funkce V aplikaci PathFind můžeme najít několik důležitých funkcí, mezi ty klíčové bychom mohli zařadit tyto tři: Sestavení matic asociace a generalizace mezi třídami a rozhraními Detekce vzoru na základě izomorfizmu Detekce vzoru na základě similarity scoringu Ke každé klíčové funkci si uvedeme sekvenční diagram, který nám znázorňují časové uspořádání událostí mezi jednotlivými objekty. 12.3.1. Sestavení matic asociace a generalizace V této klíčové funkci systém po zadání cestky k souboru načte soubor s překompilovanými zdrojovými kódy, následně vytvoří seznam tříd a rozhraní a vytvoří dvě matice, které reprezentují asociaci a generalizaci mezi třídami. Obrázek 20. Sestavení matic asociace a generalizace 12.3.2. Detekce vzoru na základě izomorfizmu Uživatel si vybere ze seznamu nabízených vzorů a následně se provede analýza metodou izomorfizmu, zdali je vzor obsažen v analyzovaném zdrojovém kódu. 29

Obrázek 21. Detekce vzoru na základě izomorfizmu 12.3.3. Detekce vzoru na základě similarity scoring V této poslední klíčové funkci se realizuje detekce vzoru za použití nepřesné metody a to algoritmu similarity scoring. Obrázek 22. Detekce vzoru na základě similarity scoring 12.4. Popisy metod V této kapitole si přiblížíme nejdůležitější metody, které se v aplikaci vyskytují. Jejich rozdělení je podle jednotlivých tříd, do kterých patří a dále abecedně 30

seřazené. 12.4.1. Metody třídy MatrixMake Public Type[] GetTypeFromAssembly() - načte informace z assembly Private bool isclass(string cname) - v této metodě se otestuje, je-li zadaná třída v seznamu tříd Public void MakeListOfClass() - metoda, která vytvoří seznam tříd Private int PositionInList(string cname) - metoda, která určí pozici matice v rámci matice 12.4.2. Metody třídy CompareMatrix Public bool CompareTwoMatrix(double[,] submatrix) - porovná dvě matice stejné velikosti Public List<List<int[]>> DoCompare(double[,] matrix,double[,] pattern) - metoda, která provádí porovnání Private void MakeAllSubMatrix(double[,] p,int n, List<int[]> poleindex) - vytvoří všechny submatice matice o velikosti n Public static void Permutation(int k,int n,int[] nums) - vytvoří pole všech permutací zadané číselné řady 12.4.3. Metoda třídy ExportToCSV Public void ExportCSV() - export matice do CSV formátu 12.4.4. Metody třídy MathOperation Public double 1norm(double[,] A) - výpočet první normy matice Public double[,] MatrixAdd(double[,] A, double[,] B) - metoda na součet dvou matic Public double[,] MatrixDivide(double[,] A, double[,] B) - dělení matice konstantou Public double[,] MatrixMultiple(double[,] A, double[,] B) - násobení dvou matic Public double[,] MatrixTranspone(double[,] A) - transpozice matice 31

12.4.5. Metody třídy SimilarityScoring Public double[,] CalculationSimilarityScore(double[,] MatrixCode, double[,] MatrixPattern) - metoda na vlastní výpočet similarity score Public bool Convergence(double[,] A, double[,] B) - metoda výpočtu na konvergenci matice Public double[,] MatrixFill(double what, int x, int y) - pomocná metoda před-vyplnění matice 13. Experimenty Součásti této práce jsou experimenty, které byly provedeny v aplikaci PathFinder. Experimentem tedy myslíme, pokus na vstupních datech (komponentách), které nám poskytnou výsledky o tom, je-li nějaký vzor obsažený v komponentě nebo ne. Máme tedy k dispozici komponenty a dále máme možnost pomocí reflexe sestavit vztahy mezi třídami v komponentě. Tyto vstupní informace, tedy matice asociací a generalizací jsou vstupem pro přesné a přibližné metody. V této části práce si popíšeme pokusy, které byly v rámci aplikace PathFinder provedeny na několika typech vstupních dat. Vstupní data bychom mohli rozdělit do dvou kategorií: Pozitivní příklady Negativní příklady 13.1. Pozitivní příklady Těmito vstupními daty jsou myšlená takové data, u kterých víme, že návrhový vzor je obsažen ve zdrojovém kódu programu. Těmito daty můžeme tak prokázat spolehlivost detekčních metod a posoudit jejich kvalitu. Do pozitivních dat tedy zvolíme data, které jsou speciálně vytvořena pro tuto aplikaci, a tedy to nejsou data reálných programů. Vytvořili jsme tedy sadu testovacích vstupních dat, které jsme poté analyzovali. Jedná se o velice jednoduchou komponentu, která je již uvedena v příkladech u jednotlivých metod. 13.2. Negativní případy Negativními případy jsou myšlená taková vstupní data, o kterých víme, že v nich nejsou vzory obsaženy. Použité metody detekce by měly prokázat, že vzory nejsou detekovány. Jak se ale ukáže níže, ne vždy se ale tato domněnka potvrdí. 32

13.3. Vlastní experimenty Vlastní experimenty byly provedeny na pěti různých vstupních komponentách a na různých vzorech, které jsou v aplikaci PathFinder k dispozici. Jednotlivé experimenty s popisky a výsledky jsou shrnuty v jednotlivých podkapitolách. Jeli u přesné metody vzor alespoň jednou detekován, je ve výsledné tabulce zapsána hodnota 1. Počet nalezených shod je v tomto případě irelevantní. U podobnostní metody je jako výsledek zaznamenaná nejvyšší hodnota z podobnostní matice. 13.3.1. Experiment č. 1 První experiment byl proveden na testovací komponentě, která byla pro tuto potřebu vytvořena. Jedná se o malou část systému, na které již výše byly demonstrovány metody detekce. Vzor je zde reprezentován malým vzorem, který se jmenuje element. Vzor element Přesná metoda 1 Přibližná metoda 0,75 Tabulka 1. Experiment č. 1 Vyhodnocení: Tímto experimentem se na jednoduché komponentě a jednoduchém vzoru demonstrovala ukázka toho, že obě metody našly vztah mezi komponentou a vzorem. 13.3.2. Experiment č. 2 V tomto experimentu je použita komponenta, která opět testuje použitou aplikaci a vzory a byla speciálně vytvořena. V této komponentě není obsažený žádný z testovaných vzorů. Vzor dekorátor Vzor adaptér Vzor bridge Přesná metoda 0 0 0 Přibližná metoda 0,55 0,25 0,65 Tabulka 2. Experiment č. 2 Vyhodnocení: Jak je vidět z tabulky, pomocí přesné metody nebyl nalezen žádný vzor, na který byla aplikace testována. U přibližné metody je nějaká shodnost nalezena, což 33

může odpovídat tomu, že v aplikaci jsou použity postupy, které se částečně blíží návrhovému vzoru. V tomto případě se nejblíže komponenta podobá návrhovému vzoru bridge (most). 13.3.3. Experiment č. 3 Další z řady testů metod je opět komponenta, která je speciálně vytvořena pro tuto aplikaci. Jejím hlavním úkolem je demonstrace ukázkového použití návrhového vzoru dekorátor. Vzor dekorátor Vzor adaptér Vzor bridge Přesná metoda 1 1 0 Přibližná metoda 1 0 0,5 Tabulka 3. Experiment č. 3 Vyhodnocení: Z tabulky jasně vyplývá, že obě metody detekce spolehlivě detekovaly návrhový v komponentě návrhový vzor dekorátor. U vzoru adaptér v přesném testu, byla nalezena také shoda, což se dá vysvětlit shodě matic asociace jak u vzoru dekorátor tak vzoru adaptér. V tomto případě se ukazuje, že přibližná metoda poskytuje lepší výsledky. 13.3.4. Experiment č. 4 Tento experiment je provedený na komponentě, která má za úkol logovat zprávy v rámci systému. Není známa struktura tříd v rámci komponenty, proto nedokážeme dopředu říct, jeli v komponentě obsažený nějaký návrhový vzor. Vzor dekorátor Vzor adaptér Vzor bridge Přesná metoda 1 1 1 Přibližná metoda 1 0 0,5 Tabulka 4. Experiment č. 4 Vyhodnocení: U tohoto experimentu se prokázala ta vlastnost přesné metody, že i když zvolíme pro testovanou komponentu různé vzory, často se v komponentě najdou. To lze vysvětlit několika způsoby. V prvé řadě je to optimistický způsob a to, že programátoři při vytváření této komponenty opravdu zvolené vzory použili. Další důvod, proč přesná metoda vzory nalezla je ten, že vzory na kterých byla 34

analýza provedena, mají podobné (a někdy i shodné) matice sousednosti. Důležité je připomenout, že jak komponenta, tak vzor jsou popsány dvěma maticemi sousednosti (jedna popisuje asociace a druhá generalizaci) a proto šance, že vzor je nalezen, je větší. Přibližná metoda již dává jiné výsledky a to takové, že v komponentě byl bezpečně detekován vzor dekorátor, u vzoru bridge byla podobnost také detekována, ale hodnota 0, 5 jasně neprokazuje podobnost mezi komponentou a vzorem. 13.3.5. Experiment č. 5 Tento poslední experiment je provedený na komponentě z jednoho ročníkového projektu, která má za úkol poskytovat tzv. logickou vrstvu pro webovou aplikaci. O komponentě toho tedy není příliš známo, a proto tedy je vyzkoušeno několik vzorů. Předpoklad je ale takový, že vzory v komponentě nejsou použity. U tohoto experimentu také nelze použít přesnou metodu. Důvodem je její časová složitost - komponenta obsahuje 14 tříd a generování všech podmatic vstupní matice vyžaduje n!, a tedy v tomto případě 14!, operací. Vzor dekorátor Vzor adaptér Vzor bridge Přesná metoda Nelze analyzovat Nelze analyzovat Nelze analyzovat Přibližná metoda 0,5 0,5 0,5 Tabulka 5. Experiment č. 5 Vyhodnocení: V tomto experimentu se potvrdil předpoklad, že v komponentě není použit žádný z testovaných návrhových vzorů. To, že nejvyšší hodnota odpovídá hodnotě 0, 5, znamená, že v komponentě byly použity nějaké vazby typu asociace/generalizace,nicméně neodpovídaly žádnému hledanému vzoru. 13.4. Závěr experimentů Z experimentů je patrné, že několik zajímavých poznatků. U přesné metody detekce se dalo předpokládat, že bude fungovat, tak jak je očekáváno. To znamená, že je-li vzor ve zdrojovém kódu obsažen, je také metodou detekován. To, že ve zdrojovém kódu byly nalezeny pomocí této metody i jiné vzory, než se předpokládalo, je dáno tím, že některé vzory mají k sobě velice blízko a také jejich matice sousednosti jsou si velice podobné, například vzory dekorátor adaptér. Velkým omezením této metody je, že není praktická pro zkoumání rozsáhlejšího systému, z důvodu toho, že je potřeba vytvořit všechny možné podmatice matice reprezentující zdrojový kód zkoumaného systému. Toto omezení se v některých experimentech potvrdilo. 35

U přibližné metody očekávané výsledky korespondují s předpoklady, které na začátku každého experimentu byly napsány. Důležité je podívat se na hodnotu čísla z intervalu (0, 1), která vyjadřuje podobnost matice popisující systém a matice vzoru. Z provedených experimentů se jako toto číslo jeví koeficient 0, 65. Pro hodnoty větší se tedy dá předpokládat, že existuje podobnost mezi analyzovaným systémem a návrhovým vzorem. 36

14. Závěr V této diplomové práci jsem se pokusil popsat metody a přístupy k vyhledávání návrhových vzorů v rámci.net frameworku. Vybral jsem si dvě metody, které jsem teoreticky popsal a dále jsem je implementoval a vytvořil tak aplikaci PathFinder. Výsledkem této práce jsou experimenty, kterými jsem ověřil, že zvolené metody (izomorfismus grafu a similarity scoring) fungují a dávají zajímavé výsledky o analyzovaných komponentách. Jednoznačně se potvrdilo, že je-li návrhový vzor v komponentě obsažený, jednotlivé metody ho detekovaly. U přesné metody detekce proběhla jednoznačně, ale díky její vysoké výpočetní náročnosti, nebylo možné analyzovat rozsáhlejší systémy. U přibližné metody nejsou výsledky 100%, ale dávají i tak relevantní informace o tom, je-li v komponentě vzor obsažen nebo ne. Výsledky této mi práce poslouží k dalšímu zkoumání v této oblasti a k vytvoření optimalizačního postupu při vytváření matic sousednosti a následné analýze. 37

15. Conclusions In this diploma thesis, I tried to describe the methods and approaches to the design patterns detection in.net Framework. I chose two methods that I described and then I implemented and developed the application PathFinder. The results of this thesis are the experiments due to them I have verified that the chosen method (graph isomorphism and similarity scoring) works and give interesting results about the analyzed components. Unambiguously is confirmed that if the design pattern contained in a component, the methods detected it. The exact method of detection was completely clear, but thanks to its high computational difficulty, it was not possible to analyze larger systems. The approximate methods do not give a hundred percent results, but they also give relevant information if the design patterns is included in component or not. The results of the thesis will allow me another research in this area and creation of an optimization procedure in creating of anadjacency matrix and analysis. 38

Reference [1] Nikolaos Tsantalis, Alexander Chatzigeorgiou, George Stephanides, Spyros T. Halkidis: Design pattern detection using similarity scoring, IEEE Transactions on Software Engineering, 2006 [2] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software, 1994 [3] Arnošt Večerka: Grafy a grafové algoritmy, Olomouc, 2007 http://phoenix.inf.upol.cz/esf [4] Daniel Hort, Jiří Rachůnek : Algebra I, VUP, Olomouc, 2003 [5] Judith Bishop: C# 3.0 Design Patterns, O REILLY, 2007 [6] Jim Arlow, Ils Neustadt: UML 2 a unifikovaný proces vývoje aplikací, Computer Press, 2007 [7] Simon Robinson,K.Scott Allen,Ollie Cornes,Jay Glynn,Zach Greenvoss, Burton Harvey,Christian Nagel,Morgan Skinner,Karli Watson: C# Programujeme profesionálně, Computer Press, 2003 [8] Ondřej Lehečka: PATTRON patterns online, 2005 http://www.pattron.net [9] Endika Bengoetxea: Inexact Graph Matching Using Estimation of Distribution Algorithms, 2002 http://www.sc.ehu.es/acwbecae/ikerkuntza/these/ [10] Kaspar Riesen: Bipartite Graph Matching for Computing the Edit Distance of Graphs, Bern, 2007 http://videolectures.net/gbr07_riesen_bgm/ [11] P.N. Suganthan, E.K. Teoh, D.P. Mital: Pattern recognition by homomorphic graph matching using Hopfield neural networks, Singapore, 1995 [12] V.D.Blonde, A. Gajaro, M. Heymans, P.Senellart, P. Van Dooren: A measure of similarity between graph vertices:applications to synonym extraction and web searching, SIAM Rev., vol. 46, no. 4, pp. 647-666, 2004 [13] Craig Larman: Applying UML and Patterns, Prentice Hall, 2009 39

[14] Vondrák I., Kožusznik J., Ochodková E.: Metody specifikace softwarových systémů, VŠB, 2006 40