Wprowadzenie do refaktoryzacji
|
|
- Seweryn Wróblewski
- 8 lat temu
- Przeglądów:
Transkrypt
1 Wprowadzenie do refaktoryzacji Prowadzący: Bartosz Walter Wprowadzenie do refaktoryzacji 1
2 Motto Nawet idiota potrafi napisać kod zrozumiały dla komputera. Prawdziwi programiści tworzą kod zrozumiały dla ludzi. Martin Fowler Wprowadzenie do refaktoryzacji (2) Mottem wykładu są słowa autora popularnej ksiąŝki dotyczącej refaktoryzacji, M. Fowlera. Słowa te są szczególnie waŝne w kontekście tzw. metodyk zwinnych (ang. agile methodologies), promujących wyŝszość zrozumiałego kodu nad dokumentacją (szczegóły dotyczące wartości głoszonych przez metodyki zwinne moŝna znaleźć pod adresem Kładą one nacisk na okresową restrukturyzację kodu w celu poprawienia jego czytelności. Refaktoryzacja jest jedną z podstawowych praktyk Programowania Ekstremalnego, najpopularniejszej spośród tych metodyk. Wprowadzenie do refaktoryzacji 2
3 Plan wykładu Wprowadzenie Koszt refaktoryzacji Poprawność i jej weryfikacja Przykre zapachy w kodzie programu Metody identyfikacji przykrych zapachów Wprowadzenie do refaktoryzacji (3) Wykład ten jest wprowadzeniem i stanowi pierwszy z czterech poświęconych refaktoryzacji. Omówione będą rozmaite definicje refaktoryzacji, czynniki wypływające na koszt jej stosowania oraz problem poprawności przekształceń i jej weryfikacji. Większą część wykładu zajmie omówienie zagadnienia tzw. przykrych zapachów w kodzie programu, ich rodzajów oraz metod identyfikacji. Wprowadzenie do refaktoryzacji 3
4 Plan wykładu Wprowadzenie Wprowadzenie do refaktoryzacji (4) Wykład rozpoczniemy od wprowadzenia, które przybliŝy motywację stosowania refaktoryzacji, jej ekonomikę oraz ogólne załoŝenia. Wprowadzenie do refaktoryzacji 4
5 Motywacja Wysoki koszt pielęgnacji oprogramowania Yourdon: do 80% kosztu uŝytkowania Boehm: wytworzenie linii kodu: $30, pielęgnacja: $4000 Naturalny wzrost złoŝoności i entropii oprogramowania Prawa Lehmana: konieczna ciągła restrukturyzacja Wprowadzenie do refaktoryzacji (5) Refaktoryzacja jest jedną z technik pielęgnacji oprogramowania. Jak wskazują badania, pielęgnacja pochłania nawet do 80% całkowitych kosztów związanych z oprogramowaniem. Znamienny jest teŝ przykład podany przez Boehma: stworzenie linii kodu w oprogramowaniu dla Boeinga kosztowało ponad stukrotnie mniej niŝ jej pielęgnacja do końca Ŝycia produktu. Ta i podobna obserwacje posłuŝyły M. Lehmanowi do sformułowania praw dotyczących ewolucji oprogramowania. Mówią one, Ŝe oprogramowanie w trakcie ewolucji staje się coraz bardziej złoŝone, a jego struktura w coraz mniejszym stopniu odpowiada wymaganiom. Jedynym sposobem przeciwdziałania temu zjawisku jest ciągła restrukturyzacja, która przywraca pierwotną prostotę projektu. Wprowadzenie do refaktoryzacji 5
6 Intuicyjna definicja Refaktoryzacja to: zmiana wewnętrznej struktury kodu programu która zwiększa jego czytelność i obniŝa koszt pielęgnacji ale nie zmienia jego obserwowalnego zachowania void wykonaj() void wykonaj() Opdyke (1991) Wprowadzenie do refaktoryzacji (6) Pierwsze nieformalne określenie refaktoryzacji podał w swojej rozprawie doktorskiej W. Opdyke w 1991 roku. Podkreślała ona trzy elementy: jest to transformacja kodu źródłowego programu (a więc czytelnego dla programisty) która poprawia jego pielęgnowalność poprzez uproszczenie struktury i dostosowanie jej do zmieniających się wymagań. ale nie zmienia jego funkcjonalności z punktu widzenia uŝytkownika tego oprogramowania Szczególnie ta ostatnia własność najwaŝniejsza, ale i najtrudniejsza do zapewnienia budziła wiele dyskusji. Dotyczyły one kwestii, czy program miał zachowywać się identycznie we wszystkich moŝliwych przypadkach, takŝe wykraczających poza jego specyfikację (np. moŝliwa była inna odpowiedź systemu po przekroczeniu załoŝonego obciąŝenia albo uruchomieniu w odmiennym środowisku), czy teŝ wystarczy, jeŝeli zmiana nie będzie zauwaŝalna w typowym uŝyciu. Narzucenie bardziej rygorystycznej interpretacji powodowało konieczność przeprowadzania dowodu poprawności, co w praktyce wykluczało efektywne refaktoryzowanie programów. Wprowadzenie do refaktoryzacji 6
7 Formalna definicja Refaktoryzacja jest uporządkowaną parą R = (pre; T) gdzie pre jest warunkiem wstępnym, który program musi spełniać, aby przekształcenie refaktoryzacyjne było poprawne T jest przekształceniem programu Roberts (1998) Wprowadzenie do refaktoryzacji (7) Bardziej formalną definicję zaproponował D. Roberts w 1998 roku, opisując przekształcenie refaktoryzacyjne jako parę elementów: zbioru warunków wstępnych, jakie program musi spełniać przed wykonaniem zmiany, aby była ona poprawna i opisu samego przekształcenia. Warto zwrócić uwagę, Ŝe definicja ta zakłada, Ŝe poprawność moŝna stwierdzić przed wykonaniem modyfikacji, tzn. moŝliwe jest przewidzenie wszystkich jej skutków z góry, bez konieczności jej przeprowadzania. Oczywiście, takie załoŝenie nie zawsze jest uzasadnione. Wprowadzenie do refaktoryzacji 7
8 Przykład: Extract Method Wyłączenie metody void scalarproduct(string[] params) { int[] x = preparex(params); int[] y = preparey(params); int[] product = computexy(x, y); //... for (i = 0; i < x.length; i++) { out.println("x = " + x[i]); out.println("y = " + y[i]); out.println("x * Y = " + product[i]); } void scalarproduct(string[] params) { int[] x = preparex(params); int[] y = preparey(params); int[] product = computexy(x, y); //... printscalarproduct(x, y, product); void printscalarproduct(int[] x, int[]y, int[] product) { for (i = 0; i < x.length; i++) { out.println("x = " + x[i]); out.println("y = " + y[i]); out.println("x * Y = " + product[i]); } Jakie są warunki wstępne poprawności tego przekształcenia? Wprowadzenie do refaktoryzacji (8) Ilustracją dla definicji niech będzie jedno z najpopularniejszych przekształceń: Extract Method (wyłączenie metody). Polega ono na podziale złoŝonej metody na mniejsze poprzez wydzielenie z niej fragmentu kodu i przeniesienie go do nowej metody. Zmienne, których definicje znajdują się poza zakresem tego fragmentu, są przekazywane do tej metody jako parametry. W tym przypadku metoda scalarproduct() wykonuje dwie czynności: oblicza wartości zmiennych tablicowych x, y i product, a następnie wyświetla je na ekranie. Kod słuŝący do wyświetlania wyników jest wyłączony do nowej metody printscalarproduct(), która następnie jest wywoływana z oryginalnej metody scalarproduct(). W ten sposób program z funkcjonalnego punktu widzenia zachowuje się tak samo: wywołanie metody scalarproduct() powoduje wykonanie odpowiednich obliczeń oraz wyświetlenie ich wyników na ekranie. Aby spróbować określić warunki poprawności tego przekształcenia, warto zastanowić się, (1) w jakich okolicznościach stworzenie nowej metody będzie niemoŝliwe, (2) kiedy nie moŝna jej przekazać wymaganych parametrów, (3) kiedy niemoŝliwe będzie zwrócenie wartości z tej metody. Proszę je sformułować. Wprowadzenie do refaktoryzacji 8
9 Rozszerzona definicja Refaktoryzacja jest uporządkowaną trójką R = (pre; T; P) gdzie pre jest asercją, któa musi być spełniona w programie, aby przekształcenie R było poprawne, T jest transformacją programu, a P jest funkcją przekształcającą warunki wstępne na warunki końcowe przy kaŝdym zastosowaniu transformacji T. P określa warunki końcowe, które są prawdziwe po zastosowaniu transformacji T. Roberts (1998) Wprowadzenie do refaktoryzacji (9) Roberts zaobserwował, Ŝe proste przekształcenia zdefiniowane przez Opdyke'a nie są stosowane w praktyce, poniewaŝ wprowadzają zbyt drobne zmiany. Konieczne jest zatem stosowanie większych struktur: łańcuchów przekształceń. Jednak dowodzenie poprawności całych łańcuchów było zbyt trudne, poniewaŝ wymagało osobnego dowodu dla kaŝdego przekształcenia z osobna, a co za tym idzie obliczenia warunków wstępnych będących wynikiem wykonania wcześniejszych przekształceń w łańcuchu. Dlatego Roberts zaproponował, aby rozszerzyć definicję kaŝdego przekształcenia o warunki końcowe, które są prawdziwe po jej wykonaniu, np. po utworzeniu metody warunkiem końcowym jest jej istnienie. Ta drobna zmiana pozwoliła jednak znacznie łatwiej wykazywać poprawność łańcuchów przekształceń, wykorzystując znane juŝ informacje pochodzące z analizy wcześniejszych przekształceń prostych. Wprowadzenie do refaktoryzacji 9
10 Przykład: Rename Method Zmiana nazwy metody class KlasaA void metodaa () { // kod } } class KlasaA void metodab () { // kod } } Jakie są warunki wstępne i końcowe tego przekształcenia? Wprowadzenie do refaktoryzacji (10) Tym razem definicja ta zostanie krótko omówiona na przykładzie refaktoryzacji Rename Method (zmiana nazwy metody). Po spełnieniu warunków wstępnych związanych z tym przekształceniem i jego wykonaniu pojawiają się inne warunki, które moŝna wykorzystać przy wprowadzaniu dalszych zmian. Warunki wstępne i końcowe tego przekształcenia dotyczą podobnie jak w przypadku Extract Method moŝliwości utworzenia nowej metody o podanej sygnaturze. Proszę spróbować je wymienić. Wprowadzenie do refaktoryzacji 10
11 Plan wykładu Koszt refaktoryzacji Wprowadzenie do refaktoryzacji (11) Przejdziemy teraz do omówienia kosztu związanego ze stosowaniem refaktoryzacji. Wprowadzenie do refaktoryzacji 11
12 Koszt refaktoryzacji Refaktoryzacja nie zwiększa funkcjonalności programu, ale kosztuje identyfikacja problemu przekształcenie kodu weryfikacja poprawności Koszt zaleŝy od: własności języka programowania wsparcia ze strony narzędzi CASE natury wykonywanego przekształcenia liczby i jakości posiadanych testów Wprowadzenie do refaktoryzacji (12) Refaktoryzacja jest techniką niechętnie stosowaną przez osoby odpowiedzialne za harmonogram prac i zarządzające projektem. Z refaktoryzacją związany jest bowiem dodatkowy nakład pracy (koszt), który nie powoduje wzrostu funkcjonalności systemu. Dlatego wskazane jest jego ograniczenie poprzez automatyzację lub częściową automatyzację niektórych czynności: identyfikacji obszarów kodu wymagających refaktoryzacji, samego wykonania przekształcenia, a na końcu weryfikacji jego poprawności. Nakład ten zaleŝy od środowiska, w którym dokonywana jest refaktoryzacja: języka programowania, narzędzi, a takŝe samego przekształcenia oraz istnienia testów jednostkowych (JUnit), które ułatwiają weryfikację poprawności. Wprowadzenie do refaktoryzacji 12
13 Eksperymentalna ocena kosztu refaktoryzacji Przyrost III: 1 funkcja Przyrost II: 2 funkcje Przyrost I: 2 funkcje Przyrost 0: szkielet Ad hoc 8 osób Testy & refaktoryzacja 6 osób Wprowadzenie do refaktoryzacji (13) W celu określenia wpływu refaktoryzacji na koszt produkcji oprogramowania (rozumianego jako czas jego tworzenia), przeprowadzono małej skali eksperyment. Dwie grupy osób, pracujących w nieco odmienny sposób, tworzyło ten sam system. KaŜdy pracował indywidualnie zgodnie z jednym z dwóch modeli: AdHoc oraz Testy & Refaktoryzacja. System był budowany w sposób przyrostowy: składało się na niego 4 przyrosty, z czego przyrost zerowy był realizowany poza warunkami kontrolowanymi i słuŝył stworzeniu szkieletu aplikacji. Następnie, w odstępach tygodniowych, implementowane były kolejne funkcje: 2 w przyroście I, 2 w przyroście II oraz 1 w przyroście III. Wprowadzenie do refaktoryzacji 13
14 Porównanie cykli produkcyjnych Ad hoc (AH) Z testami i refaktoryzacją (TR) Analiza Programowanie Testy akceptacyjne Analiza Refaktoryzacja Programowanie Testy jednostkowe Testy akceptacyjne Wprowadzenie do refaktoryzacji (14) Grupa AdHoc (AH) pracowała w uproszczonym modelu spiralnym, zaczynając od analizy zadania, następnie tworząc kod programu i uruchamiając testy akceptacyjne. Niepowodzenie któregokolwiek z testów powodowało powrót do programowania. W porównaniu z tym cyklem model TR dodatkowo był rozszerzony o dwie fazy: refaktoryzację i testowanie jednostkowe. Refaktoryzacja następowała po fazie analizy i miała na celu właściwe wkomponowanie nowych funkcji do istniejącej struktury programu, przede wszystkim poprzez restrukturyzację. Testy jednostkowe, tworzone podczas programowania i po jego zakończeniu, słuŝyły efektywnej refaktoryzacji oraz pozwalały programiście na bieŝąco kontrolować jakość kodu. Tak więc model AH składał się z trzech faz, natomiast model TR z pięciu. Wprowadzenie do refaktoryzacji 14
15 Wyniki eksperymentu Pracochłonność kaŝdego przyrostu czas [min] AH I TR I AH II TR II AH III TR III Wprowadzenie do refaktoryzacji (15) Wykres przedstawia średni czas oraz jego odchylenie standardowe w obu grupach (AdHoc AH i Testy&Refaktoryzacja TR), dla trzech faz rozwoju produktu. Warto zwrócić uwagę na dość duŝą wartość odchylenia standardowego we wszystkich grupach, a takŝe gorszy wynik osiągnięty przez grupę TR we wszystkich fazach rozwoju produktu. Wprowadzenie do refaktoryzacji 15
16 Narzut związany z refaktoryzacją KosztRef = czas czas Test&Ref AdHoc 1 KosztRef [%] 80% 70% 60% 50% 40% 30% 20% 10% 0% F I F II F III Wprowadzenie do refaktoryzacji (16) Analizując wyniki eksperymentu, warto zauwaŝyć, Ŝe zastosowanie refaktoryzacji nawet w systemie o tak ograniczonej skali i niewielkiej liczbie przyrostów wprawdzie zwiększyło koszt wytworzenia programu, ale w kolejnych fazach był on coraz mniejszy od 74% w pierwszej fazie do 8% w trzeciej. Wyniki tego eksperymentu, mimo stwierdzonej statystycznej istotności, mogą być kwestionowane z uwagi na akademickie środowisko jego przeprowadzenia, niewielki rozmiar i złoŝoność realizowanego oprogramowania, ewentualny wpływ czynników zewnętrznych, a przede wszystkim niewielką liczność badanej grupy programistów. Wyniki wskazują jednak na pewien trend i mogą stać się argumentem nad włączeniem refaktoryzacji kodu do praktyki produkcji oprogramowania. Wprowadzenie do refaktoryzacji 16
17 Kiedy refaktoryzacja się opłaca? Do trzech razy sztuka Przed implementacją nowej funkcji Identyfikacja obszaru zmienności Regularne przeglądy Stały zakres prac Projekty jednorazowe Przedwcześnie zatwierdzone interfejsy Niestabilny kod Przy bliskich terminach Niedokończona refaktoryzacja przypomina dług. MoŜna z nim Ŝyć, ale jest to kosztowne. Ward Cunningham Wprowadzenie do refaktoryzacji (17) Od początku wokół refaktoryzacji (podobnie jak wokół szerzej rozumianej pielęgnacji) toczy się dyskusja dotycząca opłacalności tego typu działalności. Większość modeli kosztowych uwzględnia jedynie koszt związany z wytworzeniem oprogramowania, pomijając wszelkie inne czynniki. W ten sposób są one traktowane jako dodatkowy narzut, co ma szczególnie negatywne znaczenie w przypadku refaktoryzacji, która nie wprowadza nowej funkcjonalności, a jedynie zmienia wewnętrzną strukturę programu. Wprowadzenie do refaktoryzacji 17
18 Plan wykładu Poprawność przekształceń refaktoryzacyjnych Wprowadzenie do refaktoryzacji (18) W tej części wykładu zajmiemy się kwestią poprawności przekształceń refaktoryzacyjnych, która jak juŝ wspomnieliśmy jest jej najwaŝniejszą, ale i najtrudniejszą do zapewnienia właściwością. Wprowadzenie do refaktoryzacji 18
19 Przykład: Inline Temp i = 0; i = 0;... tab[0] = ++i; tab[1] = ++i; 1 2? x = i++; tab[0] = x; tab[1] = x; 1 1 tab[2] = ++i; 3 tab[2] = x; Wprowadzenie do refaktoryzacji (19) Zmiana struktury programu moŝe stanowić dla niego ogromne zagroŝenie, jeŝeli po jej zakończeniu będzie on działał inaczej. Dlatego najistotniejszym (i najtrudniejszym do spełnienia) warunkiem skutecznej i efektywnej refaktoryzacji jest zapewnienie, Ŝe nie wprowadzi ona do oprogramowania zmian w jego zachowaniu. Rozpatrując prosty przykład przekształcenia polegającego na rozwinięciu zmiennej tymczasowej, łatwo zauwaŝyć, Ŝe moŝe ono spowodować nieprawidłowe zachowanie programu. Występująca w pierwotnej wersji wielokrotnie powtarzająca się instrukcja ++i, po wyłączeniu do zmiennej tymczasowej, jest wykonywana tylko raz. Jednak w efekcie wartości pól tablicy tab będą róŝne od oczekiwanych i pierwotnych. Zatem nawet proste przekształcenie, intuicyjne i zrozumiałe, moŝe stanowić problem. Warto zastanowić się, jaki element jest jego faktyczną przyczyną, skoro wyłączenie wyraŝenia postaci np. i+1 nie spowoduje zmiany zachowania programu.. Jest nią efekt uboczny powodowany przez wyłączaną instrukcję: zmiana wartości zmiennej i wewnątrz wyłączanego wyraŝenia. Zatem to przekształcenie jest poprawne tylko wówczas, gdy wyraŝenie wyłączane do zmiennej nie zmienia stanu systemu, w szczególności nie modyfikuje wartości Ŝadnej ze zmiennych. Wprowadzenie do refaktoryzacji 19
20 Predykat nosideeffectsp Wejścia Program odwołujący się do zmiennej Var o wartości początkowej 1 Funkcja F potencjalnie modyfikująca wartość Var Problem 1 Czy wywołanie funkcji F powoduje efekt uboczny w postaci zmiany wartości zmiennej Var? Lemat 1 Problem 1 (braku efektów ubocznych) jest nierozstrzygalny Wprowadzenie do refaktoryzacji (20) Analityczne stwierdzenie, czy wykonanie wskazanego fragmentu kodu (pewnej funkcji) nie powoduje zmiany zachowania programu (modyfikacji wybranej zmiennej Var), okazuje się nierozstrzygalne. Spełnienie takiego warunku jest konieczne w przypadku wielu przekształceń refaktoryzacyjnych, dlatego stwierdzenie ich poprawności w dowolnym przypadku okazuje się niemoŝliwe. Ten przykład pokazuje, Ŝe analiza statyczna uŝyta jako metoda weryfikacji poprawności jest zbyt słabym narzędziem juŝ w przypadku bardzo prostych warunków wstępnych. Wprowadzenie do refaktoryzacji 20
21 Predykat nosideeffectsp Wejścia Program odwołujący się do zmiennej Var o wartości początkowej 1 Funkcja F potencjalnie modyfikująca wartość Var Problem 2 Czy istnieje zbiór wejść, który powoduje zmianę wartości zmiennej Var? Lemat 2 Problem 2 (zmodyfikowany braku efektów ubocznych) jest NP-zupełny. Wprowadzenie do refaktoryzacji (21) Po ograniczeniu tego problemu do stwierdzenia, czy istnieje taki zbiór wejść, który moŝe spowodować zmianę stanu systemu (czyli znów modyfikację wybranej zmiennej Var), staje się on wprawdzie rozstrzygalny, ale jego złoŝoność obliczeniowa (jest NP-zupełny) nadal sytuuje go wśród problemów bardzo trudnych. Wprowadzenie do refaktoryzacji 21
22 Poprawność przekształceń PROSTE Zautomatyzowana weryfikacja Obecne w wielu środowiskach IDEs TRUDNE Weryfikacja wymaga testowania Testy muszą zostać stworzone ręcznie Wprowadzenie do refaktoryzacji (22) W praktyce istnieją dwie metody weryfikacji poprawności przekształceń: analityczna, wykorzystująca informacje statyczne, nie wymagające uruchamiania programu, jednak dająca w zamian dowód poprawności, i dynamiczna, która wymaga takŝe analizy dynamicznej, zwykle realizowanej poprzez testowanie. Przekształcenia, z punktu widzenie złoŝoności problemu weryfikacji ich poprawności, równieŝ dzielą się na dwie analogiczne grupy: przekształceń prostych oraz przekształceń złoŝonych. Te pierwsze wymagają wymagają jedynie analizy statycznej, natomiast w przypadku drugich konieczne jest wykonanie testów jednostkowych. Przekształceń prostych jest jednak znacznie mniej, dlatego w praktyce niemoŝliwe jest uniknięcie stosowania przekształceń naleŝących do drugiej kategorii. Wprowadzenie do refaktoryzacji 22
23 Przekształcenia proste Weryfikowane poprzez statyczną analizę kodu MoŜna dowieść ich poprawności void metoda() void metoda() warunki początkowe warunki końcowe Wprowadzenie do refaktoryzacji (23) Przekształcenia proste wykorzystują jedynie statyczną analizę kodu, tzn. ich warunki początkowe moŝna sprawdzić jedynie na podstawie znajomości kodu źródłowego i jego właściwości. Na podstawie warunków początkowych i natury przekształcenia moŝna wskazać warunki końcowe, jakie zaistnieją po wprowadzeniu zmiany. Wprowadzenie do refaktoryzacji 23
24 Przekształcenia trudne Nie moŝna dowieść ich poprawności analitycznie Wymagają testów jednostkowych void metoda() void metoda() warunki początkowe warunki końcowe Wprowadzenie do refaktoryzacji (24) W przypadku przekształceń trudnych analiza statyczna nie jest wystarczającym narzędziem. Niektóre warunki poprawności tych przekształceń moŝna zweryfikować jedynie poprzez analizę dynamiczną, np. wykorzystanie testów jednostkowych. Testy sprawdzają wówczas, czy asercje istotne z punktu widzenia przekształcenia są zachowane. NaleŜy jednak zauwaŝyć, Ŝe testy nie pozwalają na dowiedzenie poprawności przekształcenia; przeciwnie niepowodzenie wykonania testu wskazuje na niepoprawność, natomiast poprawności w ten sposób nie moŝna pokazać. Dlatego weryfikacja poprawności jest realizowana dla tej kategorii przekształceń w sposób niepełny i nie dający pewności, Ŝe transformacja została przeprowadzona poprawnie. Wprowadzenie do refaktoryzacji 24
25 Podział przekształceń sposób weryfikacji Proste (ok. 22) (których poprawność moŝna udowodnić analitycznie) Trudne (ok.50) (wymagają testów jednostkowych) Wprowadzenie do refaktoryzacji (25) Wśród przekształceń z katalogu Fowlera niecała jedna trzecia to przekształcenia proste. Znacznie większa grupa to przekształcenia trudne. Wprowadzenie do refaktoryzacji 25
26 Podział przekształceń sposób weryfikacji Proste (ok. 22) (których poprawność moŝna udowodnić analitycznie) Testowalne (ok. 25) (wymagają z góry znanych testów) Nieokreślone (ca. 25) (wymagają dedykowanych testów) Wprowadzenie do refaktoryzacji (26) Jednak wśród przekształceń trudnych takŝe moŝna wyróŝnić dwie podgrupy: przekształceń testowalnych i nieokreślonych. Szczególnie interesująca jest druga kategoria: naleŝące do niej przekształcenia wprawdzie wymagają testowania, jednak moŝna dość precyzyjnie wskazać niezmienniki, które powinny być zweryfikowane (lecz, oczywiście, nie dowiedzione!) za pomocą testów. Zatem moŝliwe jest zapewnienie programiście wsparcia co do rodzaju i sposobu tworzenia testów, a nawet częściowe zautomatyzowanie tego procesu. Kategoria przekształceń nieokreślonych zawiera przekształcenia, które wymagają testów, ale nie moŝna wskazać ich natury i sposobu realizacji. Do tej kategorii naleŝą przekształcenia tradycyjnie trudne, i w ich przypadku pracochłonność nadal jest bardzo wysoka. Wprowadzenie do refaktoryzacji 26
27 Przykład przekształcenia testowalnego Student Student + nazwiskow() + nazwiskow () + przedmiot() Przedmiot + przedmiot () Wykładowca Przedmiot + wykladowca () Wykładowca + nazwisko () metoda przedmiot() w klasie Student nie zaburza dziedziczenia metoda nazwiskow() w klasie Wykładowca nie zaburza dziedziczenia metoda przedmiot() w klasie Student zwraca obiekt klasy Przedmiot? obiekt klasy Przedmiot istnieje w momencie, gdy Student odwołuje się do niego metoda nazwiskow() zwraca tę samą wartość co przed zmianą Wprowadzenie do refaktoryzacji (27) Przykładem przekształcenia naleŝącego do drugiej kategorii jest Move Method. Przesunięcie metody przedmiot() z klasy Przedmiot do klasy Student wymaga sprawdzenia kilku warunków, z których dwa (zaznaczone "ptaszkami") moŝna zweryfikować bez konieczności uruchamiania kodu. Pozostałe wymagają wprawdzie testowania, jednak jest moŝliwe wskazanie, jak powinny wyglądać takie testy, i opracowanie dla nich np. generycznych szablonów związanych z samym przekształceniem. Innymi słowy, wygenerowanie testów dla innych klas wymagałoby jedynie ukonkretnienia szablonów testowych nowymi parametrami. Wprowadzenie do refaktoryzacji 27
28 Plan wykładu Przykre zapachy w kodzie programów Wprowadzenie do refaktoryzacji (28) W tej części przedstawiony zostanie pojęcie przykrego zapachu oraz ich katalog podany przez Martina Fowlera. Wprowadzenie do refaktoryzacji 28
29 Przykre zapachy w kodzie programów JeŜeli brzydko pachnie, naleŝy zmienić filozofia babci Kenta Becka dotycząca pielęgnacji niemowląt Wprowadzenie do refaktoryzacji (29) O ile metryki są ilościowym wskaźnikiem pozwalającym ocenić, czy oprogramowanie wymaga refaktoryzacji, czy nie, o tyle przykre zapachy reprezentują informację jakościową. Pojęcie przykrego zapachu jak wiele innych w obszarze zwinnych metodyk ma anegdotyczną genezę: wg Fowlera, nazwę tę zaproponował K. Beck, "odurzony" zapachami związanymi z pielęgnacją swojej nowonarodzonej córki. Istota przykrego zapachu mieści się właśnie w tym cytacie: jeŝeli coś brzydko pachnie, to naleŝy to zmienić. Pojęcie to jest umyślnie zdefiniowane bardzo ogólnie, aby moŝna nim było objąć najróŝniejsze problemy związane ze strukturą kodu. W praktyce lista przykrych zapachów obejmuje właśnie wiele niespokrewnionych (przynajmniej bezpośrednio) problemów. Wprowadzenie do refaktoryzacji 29
30 Duplicated Code Nazwa Zduplikowany kod Objawy Identyczny lub podobny kod znajduje się w wielu miejscach systemu Rozwiązanie w jednej klasie: wyłącz wspólne fragmenty do nowej metody (Extract Method) w klasach o wspólnej nadklasie: wyłącz wspólne części (Extract Method), a następnie przesuń ją do nadklasy (Pull-up the Method) w klasach niezwiązanych: wyłącz wspólne części do nowej klasy (Extract Class) i deleguj do nich wywołania Wprowadzenie do refaktoryzacji (30) Najczęściej spotykanym problemem, który dotyczy niemal kaŝdego systemu, jest duplikacja kodu. Badania wskazują, Ŝe średnio ok % kodu to dokładne lub przybliŝone duplikaty. Istotą duplikatów jest problem ze śledzeniem zmian: zwykle poprawki i aktualizacje są stosowane jedynie do jednej kopii, natomiast pozostałe w zamyśle programisty zachowujące się identycznie jak pierwsza pozostają niezmienione. To rodzi sporo trudnych do zlokalizowania błędów. Istotnym problemem jest wykrywanie duplikatów. Najprostsze metody posługują się jedynie zwykłym dopasowaniem tekstu, jednak ich skuteczność jest ograniczona. Bardziej zaawansowane dopuszczają przemianowania identyfikatorów, a nawet zmiany algorytmu. W niektórych przypadkach za duplikaty uznaje się takŝe fragmenty nie identyczne, ale w duŝym stopniu podobne. Ocena podobieństwa fragmentów kodu wymaga złoŝonych struktur danych i ma duŝą złoŝoność obliczeniową. Sposób działania zaleŝy od lokalizacji problemu. W przypadku pojedynczej klasy naleŝy wyłączyć zduplikowany kod do wspólnej metody. W przypadku klas "bliźniaczych" przesunąć go do wspólnej nadklasy jako dziedziczoną metodę. W przypadku klas niespokrewnionych ze sobą moŝliwe jest m.in. utworzenie nowej klasy z duplikatami i odwoływanie się do niej lub jej instancji z dotychczasowych lokalizacji zduplikowanego kodu. Wprowadzenie do refaktoryzacji 30
31 Long Method Nazwa Długa metoda Objawy Metoda wykonuje w rzeczywistości wiele czynności Brak wsparcia ze strony metod niŝszego poziomu Rozwiązanie wyłącz fragmenty do nowych metod (Extract Method) wyłącz zmienne tymczasowe do zewnętrznych metod (Replace Temp with Query) wyłącz metodę do nowej klasy (Replace Method with Method Object) zmniejsz liczbę parametrów (Introduce Parameter Object lub Preserve Whole Object) Wprowadzenie do refaktoryzacji (31) Kolejnym często spotykanym problemem w kodzie są długie metody. Istotna nie jest jednak bezwzględna długość (jest ona tylko objawem), a liczba funkcji, jakie metoda realizuje. Przyczyn jest wiele jedną z nich jest niewłaściwy podział aplikacji na warstwy funkcjonalne i brak wsparcia ze strony metod w niŝszych warstwach. Wówczas długa metoda sama realizuje funkcje, które powinny być dostarczone przez inną warstwę aplikacji. Podobnie jak w przypadku duplikatów, podstawową metodą usuwania tego problemu jest wyłączanie kodu do nowych metod. Jednak nie zawsze jest to moŝliwe podział często jest blokowany przez zaleŝności między zmiennymi lokalnymi w metodzie. Wówczas moŝna zamienić je w metody, co pozwala zmniejszyć liczbę powiązań między nimi. JeŜeli to niemoŝliwe, warto zamienić metodę w nową klasę, zmieniając parametry metody w pola klasy. PoniewaŜ długie metody posiadają często długie listy parametrów, warto równieŝ usunąć ten problem za pomocą łączenia ich we wspólne klasy. Wprowadzenie do refaktoryzacji 31
32 Large Class Nazwa Nadmiernie rozbudowana klasa Objawy Klasa posiada zbyt wiele odpowiedzialności Liczne klasy wewnętrzne, pola i metody DuŜa liczba metod upraszczających Rozwiązanie wydziel nową klasę i odwołuj się do niej za pomocą referencji (Extract Class), dziedziczenia (Extract Subclass lub Extract Superclass) lub korzystając z polimorfizmu (Extract Interface), a następnie przesuń do niej pola i metody (Pull up Member, Push Down Member, Move Member) Wprowadzenie do refaktoryzacji (32) Problem nadmiernej złoŝoności klas jest rozwinięciem poprzedniego przykrego zapachu. Klasa niekoniecznie musi być fizycznie zbyt długa istotą problemu jest zbyt duŝa odpowiedzialność, jaką jest obarczona. W efekcie wewnątrz jednej klasy fizycznej znajdują się dwie lub więcej klas logicznych, czyli odrębnych zakresów odpowiedzialności. Jest kilka objawów tego naduŝycia: klasa posiada wiele metod, pól, klas wewnętrznych, duŝą liczbę metod słuŝących jedynie wygodzie programisty etc. Na poziomie pomiarów najlepszym wskaźnikiem tego przykrego zapachu jest niska spójność klasy. Oznacza ona, Ŝe klasa powinna być podzielona na mniejsze jednostki. Właśnie to rozwiązanie jest najczęściej stosowane w celu usunięcia problemu. Nowa klasa moŝe być niespokrewniona z klasą oryginalną, być jej pod- lub nad-klasą lub dziedziczyć wspólny interfejs. Wprowadzenie do refaktoryzacji 32
33 Long Parameter List Nazwa Długa lista parametrów Objawy Metoda otrzymuje więcej danych niŝ potrzebuje Rozwiązanie usuń zbędne parametry (Replace Parameter with Method, Preserve Whole Object lub Introduce Parameter Object) Wprowadzenie do refaktoryzacji (33) Długa lista parametrów czasem jest związana z innymi przykrymi zapachami, w szczególności z długimi metodami. Najogólniej, metoda obciąŝona tym problemem otrzymuje zbyt wiele informacji, której albo nie wykorzystuje, albo wykorzystuje do realizacji zadań odmiennych, niespójnych z ogólnym celem metody. Sposobem przeciwdziałania jest przede wszystkim zmniejszenie liczby parametrów (usunięcie zbędnych, połączenie niektórych parametrów w nową klasę) lub podział metody na mniejsze jednostki. Wprowadzenie do refaktoryzacji 33
34 Comments Nazwa Nadmiar komentarzy Objawy Komentarze niepotrzebnie opisują znaczenie kodu Rozwiązanie przesuń nadmiernie skomentowane fragmenty do nowej metody (Extract Method) zmień nazwę metody (Rename Method) aby lepiej opisywała swoje przeznaczenie wprowadź asercję (Introduce Assertion) jeŝeli to wyjaśnia przepływ sterowania w kodzie Wprowadzenie do refaktoryzacji (34) Nadmiar komentarzy jest zapachem o niewielkiej dokuczliwości, ale warto o nim wspomnieć, poniewaŝ budzi on naturalne i zrozumiałe kontrowersje. Pełne dokumentowanie kodu źródłowego jest przecieŝ oczywistym postulatem inŝynierii oprogramowania; zaleca się programistom, aby komentowali kaŝdą istotną decyzję odpowiednią adnotacją. Nadmiarem komentarzy nazywana jest sytuacja, w której komentarz zawiera dokładnie te same informacje i na tym samym poziomie czytelności, co sam kod źródłowy. W ten sposób komentarz staje się niepotrzebnym duplikatem, który sam w sobie wymaga pielęgnacji i aktualizacji. JeŜeli struktura kodu jest tak skomplikowana, Ŝe wymaga rozbudowanego komentarza, wówczas konieczna jest jej modyfikacja. Podstawowym rozwiązaniem jest, jak w wielu podobnych przypadkach, utworzenie nowej metody. Bardzo waŝne jest nazewnictwo metod, aby intuicyjnie odzwierciedlało ono zadania stojące przed metodą. Czasem czytelność jest wzmacniana poprzez wprowadzenie asercji, która w odróŝnieniu od komentarza jest weryfikowana w momencie wykonywania programu, a jej naruszenie jest zgłaszane programiście. Wprowadzenie do refaktoryzacji 34
35 Incomplete Library Classs Nazwa Niekompletna klasa biblioteczna Objawy Gotowa biblioteka nie posiada pewnej funkcjonalności Rozwiązanie utwórz brakujące metody po stronie klienta i opatrz je właściwym komentarzem (Introduce Foreign Method) utwórz podklasę lub obiekt opakowujący w celu zwiększenia funkcjonalności klasy (Introduce Local Extension) Wprowadzenie do refaktoryzacji (35) Niekompletność klasy bibliotecznej nie jest wynikiem błędu programisty korzystającego z tej klasy, jednak niewątpliwie stanowi zagroŝenie dla struktury programu. Brakująca funkcja musi być zaimplementowana w miejscu, w którym intuicyjnie będzie moŝna ją odnaleźć. Sugerowane są dwa rozwiązania: w prostych przypadkach naleŝy zaimplementować funkcję po stronie klienta, opatrując ją komentarzem dotyczącym niewłaściwej lokalizacji i jej przyczyn. JeŜeli brakuje większej liczby funkcji, wówczas moŝna zastosować tzw. lokalne rozszerzenie klasy bibliotecznej, czyli specjalizowaną podklasę lub opakowanie (ang. wrapper), posiadające te funkcje. Oba rozwiązania mają wady, które wpływają na decyzję dotyczącą ich zastosowania. Stworzenie podklasy wymaga, aby klasa była niefinalna, z drugiej strony udostępnia jednak składowe klasy aŝ do poziomu chronionego. Aby stworzyć opakowanie naleŝy m.in. zaimplementować interfejs klasy bibliotecznej, co oznacza, Ŝe jego brak uniemoŝliwia zastosowanie tego rozwiązania. Ponadto opakowanie ma dostęp jedynie do publicznych składowych klasy bibliotecznej. Wprowadzenie do refaktoryzacji 35
36 Switch Statements Nazwa Skomplikowane instrukcje warunkowe Objawy Metoda zawiera złoŝoną, wielopoziomową instrukcję if lub switch Rozwiązanie wyłącz wspólne fragmenty do nowej metody (Extract Method) wyłącz gałęzie instrukcji warunkowej do polimorficznych klas (Replace Conditional with Polimorphism/State) wyłącz gałęzie instrukcji warunkowej do podklas (Replace Conditional with Subclasses) Wprowadzenie do refaktoryzacji (36) Niepoprawne wykorzystanie instrukcji wyboru i warunkowej w duŝym stopniu wpływa na skomplikowanie przepływu sterowania w programie. Rozbudowane warunki oraz gałęzie kodu wykonywane po ich spełnieniu lub odrzuceniu przypominają zasady programowania strukturalnego, a przede wszystkim utrudniają zrozumienie ich sensu. Pierwszym krokiem w kierunku usunięcia tego problemu jest ponownie wyłączenie fragmentów do nowych metod o intuicyjnych nazwach w wielu przypadkach jest to rozwiązanie wystarczające. W innych moŝna podzielić instrukcje warunkowe korzystając z mechanizmów obiektowych: polimorfizmu (kaŝda gałąź staje się osobną implementacją tego samego interfejsu) lub dziedziczenia (kaŝda podklasa reprezentuje jedną z gałęzi). Wówczas problem sterowania warunkami sprowadza się do tworzenia obiektów odpowiednich klas, a nie wyboru pomiędzy długimi blokami kodu. Wprowadzenie do refaktoryzacji 36
37 Message Chains Nazwa Łańcuchy wywołań metod Objawy łańcuch wywołań przez delegację naruszenie prawa Demeter Rozwiązanie usuń niepotrzebne wywołania i ukryj delegację (Hide Delegate) przesuń zbędne metody do klas w dalszej części łańcucha (Extract Method i Move Method) Wprowadzenie do refaktoryzacji (37) Omówione wcześniej prawo Demeter stanowi regułę opisującą prawidłowy sposób wiązania ze sobą niespokrewnionych obiektów. Omawiany przykry zapach stanowi naruszenie prawa Demeter: metoda w jednym z obiektów dokonuje swoistej podróŝy przez cały system, wywołując metody w celu znalezienia kolejnych obiektów. Takie rozwiązanie powoduje, Ŝe metoda ta jest zaleŝna od całej reszty systemu. Rozwiązaniem tego problemu moŝe być stworzenie dodatkowych metod ukrywających delegacje w kolejnych obiektach. Zwiększy to liczbę metod, ale zmniejszy liczbę powiązań pomiędzy obiektami. MoŜna równieŝ próbować przesuwać metody między obiektami znajdującymi się wewnątrz łańcucha. Wprowadzenie do refaktoryzacji 37
38 Data Class Nazwa Pojemnik na dane Objawy Klasa jedynie przechowuje dane i nie posiada metod oferujących uŝyteczne funkcje (Data Transfer Object) Rozwiązanie przesuń część kodu klientów do klasy-pojemnika danych (Extract Method i Move Method) podziel dane klasy pomiędzy klientów i usuń ją (Inline Class) Wprowadzenie do refaktoryzacji (38) Klasa jest jednostką kodu obdarzoną odpowiedzialnością. Zatem klasy, których odpowiedzialność sprowadza się do przechowywania danych, nie są poprawne i powinny zostać zmodyfikowane. Oczywiście, istnieją technologie lub obszary zastosowań, w których tego typu obiekty są poŝądane. Przykładem moŝe być wzorzec projektowy J2EE Data Transfer Object, w którym obiekt takiej klasy słuŝy do przenoszenia zbioru danych między rozproszonymi komponentami aplikacji. Takie rozwiązanie przynosi wówczas znaczny wzrost wydajności. Podobna argumentacja moŝe równieŝ (choć nie powinna) dotyczyć takŝe technologii Java Beans. W praktyce jednak zawsze powinno się ze zbiorem danych związać pewną funkcjonalność i właśnie jej braku dotyczy ten przykry zapach. Istnieją dwa rozwiązania: rozszerzenie klasy o nową funkcjonalność, aby stałą się w pełni odpowiedzialna za siebie, lub przeniesienie pozostałych resztek funkcjonalności i usunięcie klasy z systemu. Wówczas dane przechowywane przez nią są rozdzielane pomiędzy korzystających z niej klientów. Wprowadzenie do refaktoryzacji 38
39 Data Clumps Nazwa Zbitka danych Objawy Zbiór danych zawsze występuje wspólnie (np. autor, tytuł ksiąŝki i wydawnictwo) Rozwiązanie utwórz nową klasę ze zbitki (Extract Class) i przekazuj jej instancje zamiast zbitki (Introduce Parameter Object i Preserve Whole Object) postępuj podobnie jak z Long Parameter List Wprowadzenie do refaktoryzacji (39) Ten problem jest związany z innym przykrym zapachem długą listą parametrów. Pojawiają się zbiory parametrów, które są wewnętrznie ze sobą związane, tworząc jeden logiczny zestaw informacji. Przekazywanie takich danych osobno ogranicza abstrakcję oraz dodatkowo komplikuje komunikację między metodami. Usunięcie tego przykrego zapachu polega na utworzeniu nowej klasy, która będzie przechowywała dotychczasowe osobne dane jako swoje pola. Warto zauwaŝyć, Ŝe łatwo doprowadzić w ten sposób do powstania przykrego zapachu Data Class, jednak rozbudowa funkcjonalności nowej klasy moŝe temu zapobiec. Natomiast przekazywanie pojedynczego obiektu zamiast zbitki danych pozwala na uproszczenie struktury programu. Wprowadzenie do refaktoryzacji 39
40 Refused Bequest Nazwa Odrzucony spadek Objawy Podklasa nie wykorzystuje odziedziczonych metod i pól Rozwiązanie utwórz nową podklasę i przesuń do niej niechciane składowe z nadklasy (Push Down Member) jeŝeli podklasa nie powinna posiadać interfejsu nadklasy, zastosuj delegację zamiast dziedziczenia (Replace Inheritance with Delegation) Wprowadzenie do refaktoryzacji (40) Odrzucony spadek bardzo mocno wiąŝe się z ogólniejszym problemem złego wykorzystania dziedziczenia do współdzielenia kodu. Ma miejsce wówczas, gdy nadklasa oferuje swoim podklasom znaczną funkcjonalność, natomiast one z niej nie korzystają. Oznacza to,ŝe klasy te są znacznie słabiej związane ze sobą niŝ wskazywałby na to rodzaj relacji między nimi. Problem ten moŝna usunąć przede wszystkim przesuwając wybrane metody do podklas. Pozwala to na usunięcie ich z tych podklas, które ich nie potrzebują, i jednocześnie odciąŝenie nadklasy. Drugim rozwiązaniem jest rezygnacja z relacji dziedziczenia na rzecz delegacji. Wówczas relacja w lepszym stopniu odzwierciedla powiązanie pomiędzy obydwiema klasami. Wprowadzenie do refaktoryzacji 40
41 Inappropriate Intimacy Nazwa Niewłaściwa hermetyzacja Objawy Klasa bezpośrednio odwołuje się do składowych wewnętrznych innej klasy Rozwiązanie przesuń składową do właściwej klasy (Move Member) ogranicz powiązania do jednokierunkowych (Change Bidirectional References to Unidirectional) wyłącz nową klasę ze wspólnych elementów obu klas (Extract Class) w przypadku dziedziczenia odseparuj nadklasę od podklasy (Replace Inheritance with Delegation) Wprowadzenie do refaktoryzacji (41) Niewłaściwa hermetyzacja jest dość częstym i dobrze znanym problemem. WiąŜe się ona nie tylko z niepoprawnym uŝyciem kwalifikatorów dostępu, ale przede wszystkim z niewłaściwym podziałem odpowiedzialności pomiędzy klasy: jeŝeli wymagają one bezpośredniego dostępu do swoich prywatnych części, oznacza to, Ŝe są zbyt ze sobą związane. Podstawowym rozwiązaniem jest przesunięcie metod i pól prywatnych do klas, które najbardziej ich potrzebują. MoŜna takŝe ograniczyć wiedzę o sobie dwóch klas, zmieniając relację dwukierunkową na jednokierunkową. WraŜliwe i współdzielone elementy dwóch klas moŝna wyłączyć do nowej klasy, której obiekty będą współdzielone pomiędzy nie, zachowując jednocześnie hermetyzację. Niepoprawna hermetyzacja jest równieŝ moŝliwa wewnątrz hierarchii dziedziczenia wówczas w celu odseparowania nadklasy od podklas moŝna zmienić dziedziczenie w delegację. Wprowadzenie do refaktoryzacji 41
42 Lazy Class Nazwa BezuŜyteczna klasa Objawy Klasa nie posiada Ŝadnej lub ograniczoną funkcjonalność Rozwiązanie przesuń wybrane funkcje z klas klienckich (Move Member) w przypadku podklas usuń klasę z hierarchii dziedziczenia (Collapse Hierarchy) podziel składowe pomiędzy jej klientów (Move Member) i usuń ją (Inline Class) Wprowadzenie do refaktoryzacji (42) BezuŜyteczna klasa jest przeciwieństwem klasy nadmiernie rozbudowanej. JeŜeli klasa nie posiada Ŝadnej odpowiedzialności lub jest ona ograniczona do pojedynczych drobnych funkcji, warto zastanowić się nad jej modyfikacją. Klasa bezuŝyteczna jest często blisko powiązana z innym przykrym zapachem Data Class. O ile jednak w ostatnim przypadku klasa przechowuje pewne dane, o tyle klasa bezuŝyteczna nie posiada określonego i spójnego zakresu odpowiedzialności. Usuwanie tego zapachu moŝe podąŝać dwiema drogami: zwiększając jej odpowiedzialność kosztem współpracujących z nią klas klienckich lub stopniowo ją ograniczając, a następnie usuwając z systemu. W przypadku dziedziczenia klasa jest usuwana poprzez przeniesienie jej funkcji do nadklasy i/lub podklas, natomiast w pozostałych przypadkach jej składowe są przesuwane do klientów poprzez delegacje. Wprowadzenie do refaktoryzacji 42
43 Feature Envy Nazwa Zazdrość o funkcje Objawy Metoda w klasie częściej korzysta z metod w obcych klasach niŝ we własnej Niska spójność klasy Rozwiązanie przesuń metodę do właściwej klasy (Move Method) przekaŝ referencję this do metody w drugiej klasie (wzorzec projektowy Visitor) Wprowadzenie do refaktoryzacji (43) Problem ten dotyczy sytuacji, w której metoda częściej odwołuje się do metod obcych klas niŝ do metod własnej klasy. Zazdrość o funkcje jest takŝe związana z niewłaściwą hermetyzacją, jednak podstawowym problemem opisywanym przez ten przykry zapach jest niepoprawne rozmieszczenie metod w klasach. Typowym ilościowym wskaźnikiem tego przykrego zapachu jest niska spójność klasy: jej metody nie realizują spójnego zbioru funkcji. Podobnie jak w opisanym wcześniej przypadku niewłaściwej hermetyzacji, z problemem tym moŝna poradzić sobie przenosząc składowe do klasy najbardziej je wykorzystujących. Czasem jednak jest to niemoŝliwe, poniewaŝ zwiększałoby liczbę powiązań między pozostałymi klasami. Wówczas zastosowanie znajduje np. wzorzec projektowy Visitor, w którym obiekt wywołując metodę przekazuje jej referencję do samego siebie, umoŝliwiając tzw. odwrócenie sterowania. Pozwala to ograniczyć liczbę zbędnych asocjacji między klasami. Wprowadzenie do refaktoryzacji 43
44 Parallel Inheritance Hierarchies Nazwa Równoległe hierarchie dziedziczenia Objawy Utworzenie podklasy powoduje konieczność utworzenia odpowiadającej jej podklasy w innej hierarchii dziedziczenia Rozwiązanie przenieś metody między hierarchiami i ujednolić ich interfejsy (Move Method, Move Field, Extract Interface) usuń zbędne klasy (Inline Class) Wprowadzenie do refaktoryzacji (44) Równoległe hierarchie dziedziczenia mogą oznaczać błąd w przydziale odpowiedzialności do klas, poniewaŝ stworzenie klasy w jednej hierarchii oznacza równieŝ konieczność stworzenia jej odpowiednika w drugiej. Jednak ocena nie jest całkowicie jednoznaczna: podobne rozwiązania stosuje się w kilku wzorcach projektowych z rodziny Factory (np. Factory Method czy Abstract Factory). Wówczas obiekt tworzący jest takŝe odseparowany od produktu, i dodanie jednego z nich wymaga dodania takŝe drugiego. Zatem obecność tego przykrego zapachu naleŝy badać dość ostroŝnie. Rozwiązanie polega na przeniesieniu odpowiedzialności z klas jednej hierarchii do drugiej, połączone z unifikacją ich interfejsów. Prowadzi to w duŝej mierze do pozostawienia jednej hierarchii klas i usunięcia zbędnych odpowiedników w drugiej. Wprowadzenie do refaktoryzacji 44
45 Middle Man Nazwa Pośrednik Objawy Klasa deleguje większość swojej funkcjonalności do innych klas Rozwiązanie usuń pośrednika (Remove Middle Man) usuń zbędne metody (Inline Method) zmień pośrednika w podklasę (Replace Delegation with Inheritance) Wprowadzenie do refaktoryzacji (45) Ten przykry zapach oznacza sytuację, w której cała odpowiedzialność pewnej klasy sprowadza się do delegowania wywołań do innych klas. Jest to zatem sytuacja odwrotna do problemu o nazwie Message Chains w tamtym przypadku liczba pośrednich odwołań była zbyt mała, w tym jest zbyt duŝa. Oczywiście, istnieją sytuacje, w których klasa będąca jedynie tłumaczem jednych metod na drugie ma uzasadnienie (np. wzorzec projektowy Adapter), ale są to wyjątki. Generalnie, klasa-pośrednik posiada zbyt mało odpowiedzialności, aby samodzielnie funkcjonować. Rozwiązanie polega na usunięciu pośrednika, które moŝna wykonać na kilka róŝnych sposobów. MoŜna zastąpić wywołania poprzez pośrednika wywołaniami bezpośrednimi, co prowadzi do zwiększenia liczby powiązań między klientem (klasą wywołującą) a serwerem (klasą faktycznie obsługującą Ŝądanie). MoŜna usunąć zbędne metody delegujące wewnątrz pośrednika, co jednak jest tylko rozwiązaniem częściowym. Wreszcie, moŝna zastąpić pośrednika dostępnego przez delegację podklasą czyli zmienić delegowanie wywołań na rzecz ich dziedziczenia i pokrywania. To ostatnie rozwiązanie jest takŝe stosowane przez jedną z wersji wzorca projektowego Adapter. Wprowadzenie do refaktoryzacji 45
46 Divergent Change Nazwa Zmiany z wielu przyczyn Objawy Klasa jest wielokrotnie modyfikowana w róŝnych celach Rozwiązanie znajdź elementy zmieniające się z jednego powodu i hermetyzuj w postaci osobnej klasy (Extract Class) Wprowadzenie do refaktoryzacji (46) Konieczność ciągłych modyfikacji klasy z wielu powodów wskazuje na jej niejasne przeznaczenie: pełni ona wiele niezaleŝnych ról i zaleŝy od wielu czynników. Rozwiązaniem jest wydzielenie z niej fragmentów kodu modyfikowanych z jednego powodu i stworzenie z nich oddzielnej klasy. Dzięki temu modyfikacje będą przeniesione do oddzielnych klas, co pozwoli ograniczyć zasięg zmian. Wprowadzenie do refaktoryzacji 46
47 Shotgun Surgery Nazwa Odpryskowa modyfikacja Objawy Zmiana w jednym miejscu powoduje konieczność modyfikacji w innych Rozwiązanie umieść zmienne elementy wewnątrz jednej klasy (Extract Class, Move Method i Move Field) usuń zbędne klasy (Inline Class) Wprowadzenie do refaktoryzacji (47) Ten przykry zapach jest pewnego rodzaju uzupełnieniem poprzedniego. Ma miejsce wówczas, gdy zmiana w tej klasie powoduje modyfikację innych klas. RóŜnica polega na odwrotnym kierunku zaleŝności: w przypadku Divergent Change są to zaleŝności przychodzące, natomiast w tym wychodzące. Jest to zgodne z koncepcją R. Martina niezaleŝnych metryk dla tych dwóch rodzajów zaleŝności: Ca i Ce. Tym razem przeciwdziałanie temu problemowi polega na hermetyzacji w obrębie jednej klasy wszystkich obszarów podlegającym zmianie z jednego powodu poprzez przesunięcia metod, pól, tworzenie nowych klas i usuwanie niepotrzebnych. Wprowadzenie do refaktoryzacji 47
48 Speculative Generality Nazwa Spekulacyjne uogólnianie Objawy Klasa jest zaprojektowana pod kątem potencjalnej funkcjonalności do zaimplementowania w przyszłości Rozwiązanie usuń klasy abstrakcyjne z hierarchii (Collapse Hierarchy) usuń zbędne delegacje do innych klas (Inline Class) usuń zbędne parametry metod (Remove Parameter) dostosuj nazwy metod do ich przeznaczenia (Rename Method) Wprowadzenie do refaktoryzacji (48) Ostatni przykry zapach podany przez Fowlera to mówiąc kolokwialnie - nadmierna elastyczność i otwartość systemu na zmiany, które nigdy nie nastąpią. Jedną z podstawowych zasad projektowania obiektowego jest hermetyzacja obszarów zmienności, jednak pod warunkiem, Ŝe ta zmienność faktycznie występuje. Optymistyczne zakładanie zmian w pewnych kierunkach zwykle okazuje się nieuzasadnione i prowadzi do nadmiernie rozbudowanej struktury kodu w stosunku do potrzeb. Uproszczenie jest realizowane poprzez usuwanie zbędnych klas, ograniczanie hierarchii dziedziczenia, usuwanie pośredników, metod pomocniczych, nadmiarowych parametrów etc. Wprowadzenie do refaktoryzacji 48
49 Plan wykładu Identyfikacja przykrych zapachów w kodzie Wprowadzenie do refaktoryzacji (49) W celu skutecznego refaktoryzowania kodu, poza znajomością definicji przykrych zapachów niezbędna jest takŝe umiejętność ich identyfikacji. W tej części wykładu krótko zostaną przedstawione metody i narzędzia wykrywania przykrych zapachów w kodzie programów. Wprowadzenie do refaktoryzacji 49
50 Objawy przykrego zapachu Metryki Analiza AST Intuicja programisty Historia zmian kodu Przykre zapachy w kodzie programu Informacja o innych zapachach Analiza dynamiczna Wprowadzenie do refaktoryzacji (50) Jak mówi definicja, obecność przykrego zapachu wskazuje na potrzebę refaktoryzacji. Jednak jak stwierdzić, czy przykry zapach faktycznie występuje? Identyfikacja wymienionych na poprzednich slajdach naruszeń zasad projektowych nie jest łatwa, poniewaŝ ich występowanie nie jest związane prostą zaleŝnością przyczynowo-skutkową z jednym objawem. Przeciwnie ten sam przykry zapach moŝe przejawiać się na róŝne sposoby, które niekoniecznie występują wspólnie. Dlatego wyróŝniono sześć odrębnych źródeł, które mogą dostarczać danych o obecności (lub jej wykluczeniu) danego przykrego zapachu. Są to: intuicja programisty, która jest niemierzalna i trudna do zdefiniowania, a jednak pełni bardzo waŝną rolę w identyfikacji złych praktyk obiektowych; metryki, które są podstawowym mechanizmem ilościowej oceny jakości projektu. Metryki dostarczają liczbowej i łatwej do zinterpretowania informacji o wielu aspektach jakości projektu; analiza Abstrakcyjnego Drzewa Składniowego (AST), które jest graficzną reprezentacją rozbioru gramatycznego programu. Obecność lub brak określonych elementów w drzewie AST wskazuje na obecność lub wyklucza obecność niektórych zapachów; informacja o innych zapachach pozwala wykorzystać znane juŝ fakty o innych przykrych zapachach; analiza dynamiczna, która pozwala określić atrybuty programu nie dające się zidentyfikować wyłącznie poprzez analizę statyczną. Przykładem analizy dynamicznej moŝe być wykonanie przypadków testowych; historia zmian kodu pochodząca z repozytorium zarządzania konfiguracją pozwala ocenić wpływ niektórych zmian na program. Wprowadzenie do refaktoryzacji 50
Etap implementacji. Refaktoryzacja
Etap implementacji Refaktoryzacja Koncepcja refaktoryzacji Termin refaktoryzacja (ang. Refactoring) definiuje się jako mechanizm zmiany struktury kodu bez zmiany jego zachowania (funkcjonalności). Celem
Pielęgnacja kodu: refaktoryzacja. Jacek Starzyński, ZETiIS PW
Pielęgnacja kodu: refaktoryzacja Jacek Starzyński, ZETiIS PW Plan wykładu Wprowadzenie Poprawność i jej weryfikacja Przykre zapachy w kodzie programu Refaktoryzacje Wprowadzenie: po co? Wysoki koszt pielęgnacji
Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski
Adapter: opis Wzorce Strukturalne Tomasz Borzyszkowski Alternatywna nazwa: Wrapper (opakowanie) Rola obiektu Adapter: pełni wobec Klienta rolę otoczki, która umożliwia przetłumaczenie jego żądań na protokół
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Object-oriented programming Najpopularniejszy obecnie styl (paradygmat) programowania Rozwinięcie koncepcji programowania strukturalnego
Metody wytwarzania oprogramowania. Metody wytwarzania oprogramowania 1/31
Metody wytwarzania oprogramowania Metody wytwarzania oprogramowania 1/31 Metody wytwarzania oprogramowania 2/31 Wprowadzenie Syndrom LOOP Late Późno Over budget Przekroczono budżet Overtime nadgodziny
Wzorce projektowe i refaktoryzacja
Wzorce projektowe i refaktoryzacja Paweł Kozioł p.koziol@students.mimuw.edu.pl 18.01.2005 Moja praca magisterska Narzędzie dla środowiska Eclipse wspierające stosowanie wzorców projektowych J2EE Prowadzący:
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017 1 Wzorce podstawowe 1.1 Interface vs Abstract class class InterfaceAbstractClass
hierarchie klas i wielodziedziczenie
Programowanie Obiektowe (język C++) Wykład 15. hierarchie klas i wielodziedziczenie Tomasz Marks - Wydział MiNI PW -1- Tomasz Marks - Wydział MiNI PW -2- Hierarchie klas Dziedziczenie wprowadza relację
Podstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
Wzorce projektowe. dr inż. Marcin Pietroo
Wzorce projektowe dr inż. Marcin Pietroo Adapter - strukturalny wzorzec projektowy, którego celem jest umożliwienie współpracy dwóm klasom o niekompatybilnych interfejsach - adapter przekształca interfejs
Programowanie Zespołowe
Programowanie Zespołowe Dobre Praktyki dr Rafał Skinderowicz mgr inż. Michał Maliszewski Parafrazując klasyka: Jeśli piszesz w Javie pisz w Javie - Rafał Ciepiela Principal Software Developer Cadence Design
Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32
Analiza i projektowanie oprogramowania Analiza i projektowanie oprogramowania 1/32 Analiza i projektowanie oprogramowania 2/32 Cel analizy Celem fazy określania wymagań jest udzielenie odpowiedzi na pytanie:
Modelowanie i Programowanie Obiektowe
Modelowanie i Programowanie Obiektowe Wykład I: Wstęp 20 październik 2012 Programowanie obiektowe Metodyka wytwarzania oprogramowania Metodyka Metodyka ustandaryzowane dla wybranego obszaru podejście do
NAJLEPSZE STRATEGIE SKUTECZNYCH PROGRAMISTÓW. TECHNIKI PRACY Z KODEM KOD: NSKOD
NAJLEPSZE STRATEGIE SKUTECZNYCH PROGRAMISTÓW. TECHNIKI PRACY Z KODEM KOD: NSKOD OPIS Praca programisty oprócz umiejętności i wiedzy technicznej, wymaga również doskonałej pracy z kodem. Umiejętności te
Cuchnące testy Systematyka, objawy, leczenie. Bartosz Walter
Cuchnące testy Systematyka, objawy, leczenie Bartosz Walter Hmmm. Coś mi tu śmierdzi nie wiem dokładnie co i skąd, ale coś mi nie pasuje Skąd te zapachy? Jeżeli coś niemiło pachnie, to warto zmienić pieluchę
Zagadnienia (1/3) Data-flow diagramy przepływów danych ERD diagramy związków encji Diagramy obiektowe w UML (ang. Unified Modeling Language)
Zagadnienia (1/3) Rola modelu systemu w procesie analizy wymagań (inżynierii wymagań) Prezentacja różnego rodzaju informacji o systemie w zależności od rodzaju modelu. Budowanie pełnego obrazu systemu
Wykład VII. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej
Wykład VII - semestr III Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Wytwarzanie oprogramowania Model tworzenia oprogramowania
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015 1 Wzorce podstawowe 1.1 Interface vs Abstract class class InterfaceAbstractClass
problem w określonym kontekście siły istotę jego rozwiązania
Wzorzec projektowy Christopher Alexander: Wzorzec to sprawdzona koncepcja, która opisuje problem powtarzający się wielokrotnie w określonym kontekście, działające na niego siły, oraz podaje istotę jego
Wprowadzenie do programowania aplikacji mobilnych
Wprowadzenie do programowania aplikacji mobilnych dr Przemysław Juszczuk dr Przemysław Juszczuk Trochę historii Idea wzorców projektowych wywodzi się jeszcze z wczesnych lat osiemdziesiątych ubiegłego
Dziedziczenie. Tomasz Borzyszkowski
Dziedziczenie Tomasz Borzyszkowski Podstawy Zobacz: Dziedzictwo1.java Dziedzictwo2.java Dziedziczenie jest jedną z podstawowych cech OOP ponieważ umożliwia łatwe implementowanie klasyfikacji hierarchicznych.
Katalog przekształceń refaktoryzacyjnych cz. I
cz. I Prowadzący: Bartosz Walter cz. I 1 Agenda Szablon przekształcenia refaktoryzacyjnego Przekazywanie parametrów do metod Przekształcenia zmiennych lokalnych Przekształcenia w obrębie metod i pól cz.
Programowanie obiektowe
Programowanie obiektowe Laboratorium 11 - przegląd wybranych wzorców mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 24 maja 2017 1 / 38 mgr inż. Krzysztof Szwarc Programowanie obiektowe Wzorce
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Programowanie obiektowe - 1.
Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która
JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.
JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod
Kod doskonały : jak tworzyć oprogramowanie pozbawione błędów / Steve McConnell. Gliwice, cop Spis treści. Wstęp 15.
Kod doskonały : jak tworzyć oprogramowanie pozbawione błędów / Steve McConnell. Gliwice, cop. 2017 Spis treści Wstęp 15 Podziękowania 23 Listy kontrolne 25 Tabele 27 Rysunki 29 Część I Proces budowy oprogramowania
Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl
Komputerowe Systemy Przemysłowe: Modelowanie - UML Arkadiusz Banasik arkadiusz.banasik@polsl.pl Plan prezentacji Wprowadzenie UML Diagram przypadków użycia Diagram klas Podsumowanie Wprowadzenie Języki
Programowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.
Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1
Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1 Zofia Kruczkiewicz 1 Zunifikowany iteracyjno- przyrostowy proces tworzenia oprogramowania kiedy? Przepływ działań Modelowanie przedsiębiorstwa
Charakterystyka oprogramowania obiektowego
Charakterystyka oprogramowania obiektowego 1. Definicja systemu informatycznego 2. Model procesu wytwarzania oprogramowania - model cyklu Ŝycia oprogramowania 3. Wymagania 4. Problemy z podejściem nieobiektowym
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Wprowadzenie do metodologii modelowania systemów informacyjnych. Strategia (1) Strategia (2) Etapy Ŝycia systemu informacyjnego
Etapy Ŝycia systemu informacyjnego Wprowadzenie do metodologii modelowania systemów informacyjnych 1. Strategia 2. Analiza 3. Projektowanie 4. Implementowanie, testowanie i dokumentowanie 5. WdroŜenie
Etapy życia oprogramowania
Modele cyklu życia projektu informatycznego Organizacja i Zarządzanie Projektem Informatycznym Jarosław Francik marzec 23 w prezentacji wykorzystano również materiały przygotowane przez Michała Kolano
Wzorce projektowe. dr inż. Marcin Pietroo
Wzorce projektowe dr inż. Marcin Pietroo Wzorce projektowe Wzorzec projektowy (ang. design pattern) w inżynierii oprogramowania, rozwiązanie często pojawiających się, powtarzalnych problemów projektowych.
Programowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 03 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas abstrakcyjnych i interfejsów. Wprowadzenie
5. Administracja kontami uŝytkowników
5. Administracja kontami uŝytkowników Windows XP, w porównaniu do systemów Windows 9x, znacznie poprawia bezpieczeństwo oraz zwiększa moŝliwości konfiguracji uprawnień poszczególnych uŝytkowników. Natomiast
Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce rozszerzeń
Projektowanie obiektowe Wzorce projektowe Gang of Four Wzorce rozszerzeń 1 Roadmap Decorator Iterator Visitor 2 Wzorce rozszerzeń Mają na celu uczynić proces rozszerzania kodu bardziej czytelnym, prostym
Programowanie obiektowe
Laboratorium z przedmiotu - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia. Wprowadzenie teoretyczne.
Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016
Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Komentarz. W poszukiwaniu zaginionego wzorca
Komentarz W poszukiwaniu zaginionego wzorca W poszukiwaniu zaginionego wzorca Administrator nadal z powodzeniem używa tego samego programu do zarządzania usługami. Aczkolwiek pojawia się coraz więcej systemów
Adaptywny kod : zwinne programowanie, wzorce projektowe i SOLID-ne zasady / Gary McLean Hall. Gliwice, cop Spis treści
Adaptywny kod : zwinne programowanie, wzorce projektowe i SOLID-ne zasady / Gary McLean Hall. Gliwice, cop. 2018 Spis treści Wprowadzenie 11 CZĘŚĆ I FRAMEWORKI ZWINNE Rozdział 1 Wprowadzenie do metodologii
Etapy życia oprogramowania. Modele cyklu życia projektu. Etapy życia oprogramowania. Etapy życia oprogramowania
Etapy życia oprogramowania Modele cyklu życia projektu informatycznego Organizacja i Zarządzanie Projektem Informatycznym Jarosław Francik marzec 23 Określenie wymagań Testowanie Pielęgnacja Faza strategiczna
szkolenia pod drzewem Wybrane Techniki XP bnd 2008 Tomasz Włodarek. Materiał udostępniany na podstawie licencji Creative Commons (by-nc-nd) 1.00.
szkolenia pod drzewem Wybrane Techniki XP 1.00.00 bnd Wybrane techniki XP współwłasność kodu źródłowego (collective code ownership) częsta/ciągła integracja (continuous integration) programowanie w parach
Oprogramowanie dla biznesu Numer 11 (69) Listopad 2009 JAK SZYBKO I SKUTECZNIE ZAMKNĄĆ ROK?
Oprogramowanie dla biznesu Numer 11 (69) Listopad 2009 JAK SZYBKO I SKUTECZNIE ZAMKNĄĆ ROK? CZY TO MOśLIWE, ABY PRZEZ PROCES ZAMKNIĘCIA ROKU W DUśEJ FIRMIE LEASINGOWEJ PRZEJŚĆ SZYBKO I BEZBOLEŚNIE? MY
Technologie obiektowe
WYKŁAD dr inż. Paweł Jarosz Instytut Informatyki Politechnika Krakowska mail: pjarosz@pk.edu.pl LABORATORIUM dr inż. Paweł Jarosz (3 grupy) mgr inż. Piotr Szuster (3 grupy) warunki zaliczenia Obecność
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie
Web frameworks do budowy aplikacji zgodnych z J2EE
Web frameworks do budowy aplikacji zgodnych z J2EE Jacek Panachida promotor: dr Dariusz Król Przypomnienie Celem pracy jest porównanie wybranych szkieletów programistycznych o otwartym kodzie źródłowym
Podstawy modelowania programów Kod przedmiotu
Podstawy modelowania programów - opis przedmiotu Informacje ogólne Nazwa przedmiotu Podstawy modelowania programów Kod przedmiotu 11.3-WI-INFP-PMP Wydział Kierunek Wydział Informatyki, Elektrotechniki
Technologia informacyjna
Technologia informacyjna Pracownia nr 9 (studia stacjonarne) - 05.12.2008 - Rok akademicki 2008/2009 2/16 Bazy danych - Plan zajęć Podstawowe pojęcia: baza danych, system zarządzania bazą danych tabela,
Projekt dotyczy stworzenia zintegrowanego, modularnego systemu informatycznego wspomagającego zarządzanie pracownikami i projektami w firmie
Projekt dotyczy stworzenia zintegrowanego, modularnego systemu informatycznego wspomagającego zarządzanie pracownikami i projektami w firmie informatycznej. Zadaniem systemu jest rejestracja i przechowywanie
Dokumentacja wstępna TIN. Rozproszone repozytorium oparte o WebDAV
Piotr Jarosik, Kamil Jaworski, Dominik Olędzki, Anna Stępień Dokumentacja wstępna TIN Rozproszone repozytorium oparte o WebDAV 1. Wstęp Celem projektu jest zaimplementowanie rozproszonego repozytorium
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie
Wyszukiwanie. Wyszukiwanie binarne
Wyszukiwanie Wejście: posortowana, n-elementowa tablica liczbowa T oraz liczba p. Wyjście: liczba naturalna, określająca pozycję elementu p w tablicy T, bądź 1, jeŝeli element w tablicy nie występuje.
Diagramy ERD. Model struktury danych jest najczęściej tworzony z wykorzystaniem diagramów pojęciowych (konceptualnych). Najpopularniejszym
Diagramy ERD. Model struktury danych jest najczęściej tworzony z wykorzystaniem diagramów pojęciowych (konceptualnych). Najpopularniejszym konceptualnym modelem danych jest tzw. model związków encji (ERM
Projektowanie oprogramowania. Wykład Weryfikacja i Zatwierdzanie Inżynieria Oprogramowania Kazimierz Michalik
Projektowanie oprogramowania Wykład Weryfikacja i Zatwierdzanie Inżynieria Oprogramowania Kazimierz Michalik Agenda Weryfikacja i zatwierdzanie Testowanie oprogramowania Zarządzanie Zarządzanie personelem
Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.
Umiejętność czytania oraz tworzenia diagramów klas UML jest podstawą w przypadku zawodu programisty. Z takimi diagramami będziesz spotykał się w przeciągu całej swojej kariery. Diagramy klas UML są zawsze
Programowanie obiektowe
Laboratorium z przedmiotu - zestaw 03 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas abstrakcyjnych i interfejsów. Wprowadzenie teoretyczne. Rozważana
UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.
UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami
XII. Warunek wielokrotnego wyboru switch... case
XII. Warunek wielokrotnego wyboru switch... case 12.1. Gdy mamy więcej niŝ dwie moŝliwości Do tej pory poznaliśmy warunek if... else... Po co nam kolejny? Trudno powiedzieć, ale na pewno nie po to, Ŝeby
Analiza i projektowanie aplikacji Java
Analiza i projektowanie aplikacji Java Modele analityczne a projektowe Modele analityczne (konceptualne) pokazują dziedzinę problemu. Modele projektowe (fizyczne) pokazują system informatyczny. Utrzymanie
Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki
Informatyka I Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2017 Dziedziczenie klas
Wykład Ćwiczenia Laboratorium Projekt Seminarium
WYDZIAŁ ELEKTRONIKI KARTA PRZEDMIOTU Nazwa w języku polskim Języki programowania Nazwa w języku angielskim Programming languages Kierunek studiów (jeśli dotyczy): Informatyka - INF Specjalność (jeśli dotyczy):
PLAN ZARZĄDZANIA WYMAGANIAMI PROJEKT <NAZWA PROJEKTU> WERSJA <NUMER WERSJI DOKUMENTU>
Załącznik nr 4.4 do Umowy nr 35-ILGW-253-.../20.. z dnia... MINISTERSTWO FINANSÓW DEPARTAMENT INFORMATYKI PLAN ZARZĄDZANIA WYMAGANIAMI PROJEKT WERSJA numer wersji
Dziedziczenie jednobazowe, poliformizm
Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie jednobazowe 2. Polimorfizm część pierwsza 3. Polimorfizm część druga Zofia Kruczkiewicz, ETE8305_6 1 Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie
Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016
Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016 1 Wzorce strukturalne 1.1 Facade Motto: uproszczony interfejs dla podsystemu z wieloma interfejsami class SmtpFacade
Bazy danych 1. Wykład 5 Metodologia projektowania baz danych. (projektowanie logiczne)
Bazy danych 1 Wykład 5 Metodologia projektowania baz danych (projektowanie logiczne) Projektowanie logiczne przegląd krok po kroku 1. Usuń własności niekompatybilne z modelem relacyjnym 2. Wyznacz relacje
Programowanie obiektowe
Programowanie obiektowe Metody statyczne i klasowe Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk (Wydział Fizyki) PO w. VI Jesień 2013 1 / 23 W poprzednich odcinkach... Klasy kategorie obiektów Przynależność
Laboratorium modelowania oprogramowania w języku UML. Ćwiczenie 5 Ćwiczenia w narzędziu CASE diagram przypadków uŝycia. Materiały dla nauczyciela
Zakład Elektrotechniki Teoretycznej i Informatyki Stosowanej Wydział Elektryczny, Politechnika Warszawska Ćwiczenie 5 Ćwiczenia w narzędziu CASE diagram przypadków uŝycia Materiały dla nauczyciela Projekt
Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h
Programowanie II Lista 3 Modyfikatory dostępu plik TKLientBanku.h plik z funkcją main Przyjaźń Dziedziczenie Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące. Jest to
Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz
Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Lemay, Naughton R. Cadenhead Java Podręcznik 2 dla kaŝdego Języka Programowania Java Linki Krzysztof Boone oprogramowania
Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?
Problemy projektowania obiektowego Czy podobne problemy można rozwiązywac w podobny sposób? Czy te problemy można przedstawić w abstrakcyjny sposób, tak aby były pomocne w tworzeniu rozwiązań w różnych
Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery
http://xqtav.sourceforge.net XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery dr hab. Jerzy Tyszkiewicz dr Andrzej Kierzek mgr Jacek Sroka Grzegorz Kaczor praca mgr pod
Programowanie obiektowe zastosowanie języka Java SE
Programowanie obiektowe zastosowanie języka Java SE Wstęp do programowania obiektowego w Javie Autor: dr inŝ. 1 Java? Java język programowania obiektowo zorientowany wysokiego poziomu platforma Javy z
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36
Automatyzacja testowania oprogramowania Automatyzacja testowania oprogramowania 1/36 Automatyzacja testowania oprogramowania 2/36 Potrzeba szybkich rozwiązań Testowanie oprogramowania powinno być: efektywne
Pętle. Dodał Administrator niedziela, 14 marzec :27
Pętlami nazywamy konstrukcje języka, które pozwalają na wielokrotne wykonywanie powtarzających się instrukcji. Przykładowo, jeśli trzeba 10 razy wyświetlić na ekranie pewien napis, to można wykorzystać
Aplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - dziedziczenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 W ramach poprzedniego laboratorium
Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.
Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r. Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to
Instrukcja warunkowa i złoŝona.
Instrukcja warunkowa i złoŝona. Budowa pętli warunkowej. JeŜeli mielibyśmy przetłumaczyć instrukcję warunkową to brzmiałoby to mniej więcej tak: jeŝeli warunek jest spełniony, to wykonaj jakąś operację
REFERAT PRACY DYPLOMOWEJ
REFERAT PRACY DYPLOMOWEJ Temat pracy: Projekt i implementacja środowiska do automatyzacji przeprowadzania testów aplikacji internetowych w oparciu o metodykę Behavior Driven Development. Autor: Stepowany
Całościowe podejście do testowania automatycznego dla programistów. (TDD, BDD, Spec. by Example, wzorce, narzędzia)
Program szkolenia: Całościowe podejście do testowania automatycznego dla programistów Ruby (TDD, BDD, Spec. by Example, wzorce, narzędzia) Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania:
Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych
PAŃSTWOWA WYŻSZA SZKOŁA ZAWODOWA W ELBLĄGU INSTYTUT INFORMATYKI STOSOWANEJ Sprawozdanie z Seminarium Dyplomowego Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych
Zakres wykładu. Podstawy InŜynierii Oprogramowania
Zakres wykładu Pojęcia podstawowe InŜynierii Oprogramowania Proces wytwarzania oprogramowania Artefakty procesu wytwarzania i ich modele Jakość oprogramowania Literatura: [1] Sacha K., InŜynieria oprogramowania,
Usługa: Audyt kodu źródłowego
Usługa: Audyt kodu źródłowego Audyt kodu źródłowego jest kompleksową usługą, której głównym celem jest weryfikacja jakości analizowanego kodu, jego skalowalności, łatwości utrzymania, poprawności i stabilności
Szablony funkcji i klas (templates)
Instrukcja laboratoryjna nr 3 Programowanie w języku C 2 (C++ poziom zaawansowany) Szablony funkcji i klas (templates) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp
Projektowanie obiektowe Wzorce projektowe
Projektowanie obiektowe Wzorce projektowe Gang of Four Kreacyjne wzorce projektowe (wzorce konstrukcyjne) 1 Roadmap Memento Factory Method Abstract Factory Prototype Builder 2 Wzorce konstrukcyjne wzorce
Laboratorium modelowania oprogramowania w języku UML. Ćwiczenie 4 Ćwiczenia w narzędziu CASE diagram czynności. Materiały dla studenta
Zakład Elektrotechniki Teoretycznej i Informatyki Stosowanej Wydział Elektryczny, Politechnika Warszawska Laboratorium modelowania oprogramowania w języku UML Ćwiczenie 4 Ćwiczenia w narzędziu CASE diagram
Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie
Paweł Kurzawa, Delfina Kongo
Paweł Kurzawa, Delfina Kongo Pierwsze prace nad standaryzacją Obiektowych baz danych zaczęły się w roku 1991. Stworzona została grupa do prac nad standardem, została ona nazwana Object Database Management
Wypożyczalnia VIDEO. Technologie obiektowe
Wypożyczalnia VIDEO Jest to program do obsługi wypożyczalni i wypożyczeń klientów. Głównym zadaniem programu jest zarządzanie wypożyczeniami i drukowanie potwierdzenia wypożyczenia oraz naliczenie punktów
Paradygmaty programowania
Paradygmaty programowania Jacek Michałowski, Piotr Latanowicz 15 kwietnia 2014 Jacek Michałowski, Piotr Latanowicz () Paradygmaty programowania 15 kwietnia 2014 1 / 12 Zadanie 1 Zadanie 1 Rachunek predykatów
Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne
Projektowanie obiektowe Roman Simiński roman.siminski@us.edu.pl www.siminskionline.pl Wzorce projektowe Wybrane wzorce strukturalne Fasada Facade Pattern 2 Wzorzec Fasada Facade Pattern koncepcja 3 Wzorzec
2. Podstawy programu Microsoft Access
8 Wprowadzenie do projektowania baz danych 2. Podstawy programu Microsoft Access Baza danych utworzona w programie Microsoft Access składa się z wielu obiektów róŝnych typów. MoŜna podzielić je na dwie
Zaawansowane programowanie obiektowe - wykład 5
Zaawansowane programowanie obiektowe - wykład 5 dr Piotr Jastrzębski (czynnościowe) opisują zachowanie obiektów, komunikację pomiędzy nimi i ich odpowiedzialność. Interpreter Iterator (kursor) Łańcuch
Wzorce projektowe ArrayList. Aplikacja i zdarzenia. Paweł Chodkiewicz
Wzorce projektowe ArrayList DataGridView Aplikacja i zdarzenia Paweł Chodkiewicz Wzorzec uniwersalne rozwiązanie często powtarzających się problemów. Wzorzec opisuje problem, który powtarza się wielokrotnie