Metodyki zwinne wytwarzania oprogramowania

Podobne dokumenty
Metodyki zwinne wytwarzania oprogramowania

Programowanie obiektowe

Polimorfizm. dr Jarosław Skaruz

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe i zdarzeniowe

Wprowadzenie do zasad SOLID - czyli jak pisać SOLIDny kod

Programowanie obiektowe

Dziedziczenie. » Dodawanie nowych elementów klasy (składowych funkcyjnych, danych składowych)» Modyfikacje odziedziczonych składowych funkcyjnych

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Język ludzki kod maszynowy

Programowanie obiektowe

Java: interfejsy i klasy wewnętrzne

Przykład -

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Polimorfizm, metody wirtualne i klasy abstrakcyjne

SOLIDnie śmierdzący kod.

Logger. Następnie w klasie Bootstrapper muimy zarejestrować nasz nowy logger:

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Plik pobrano z Tytuł: Wzorce projektowe, cz. 2 Strategy Ostatnia aktualizacja:

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Czym są zasady SOLID?

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

C++ Przeładowanie operatorów i wzorce w klasach

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Wskazówki projektowe. Programowanie Obiektowe Mateusz Cicheński

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Szablony funkcji i szablony klas

Delphi podstawy programowania. Środowisko Delphi

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie Komputerów

Zaawansowane programowanie w C++ (PCP)

Dokumentacja do API Javy.

Programowanie Zespołowe

C++ - [4-7] Polimorfizm

Testowanie oprogramowania

Projektowanie obiektowe oprogramowania Wykład 4 - SOLID GRASP Wiktor Zychla 2012

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Programowanie bez fabryki. Po co używać wzorca fabryki?

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie w środowiskach graficznych. Wykład 3 Język C#

Ekspert radzi. mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8. Ekspert radzi.

Programowanie obiektowe

Abstract Factory (fabryka abstrakcyjna)

Wzorce projektowe cz. II. Wzorce projektowe cz. II 1/35

Programowanie obiektowe

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

1 Definiowanie prostych klas

Języki i metody programowania Java Lab2 podejście obiektowe

Wykład 6: Dziedziczenie

Dziedziczenie. dr Jarosław Skaruz

Wprowadzenie do szablonów klas

Klasy abstrakcyjne, interfejsy i polimorfizm

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie komputerowe. Zajęcia 7

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Klasy i obiekty cz II

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Wprowadzenie do szablonów szablony funkcji

Aplikacje RMI

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Informatyka II. Laboratorium Aplikacja okienkowa

Projektowanie obiektowe oprogramowania Wykład 7 wzorce czynnościowe (2) Wiktor Zychla 2018

Wykład 4: Klasy i Metody

Programowanie zorientowane obiektowo. Mateusz Kołecki

Wykład 7: Pakiety i Interfejsy

Command (action, transaction, polecenie)

Wprowadzenie do szablonów szablony funkcji

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Aplikacje RMI Lab4

Programowanie obiektowe i zdarzeniowe

Przypomnienie o klasach i obiektach

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres lub

Zaawansowane programowanie w C++ (PCP)

Podstawy programowania obiektowego

Wzorce projektowe. Wstęp

Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Podstawy programowania obiektowego

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

Klasy cd. Struktury Interfejsy Wyjątki

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Transkrypt:

Metodyki zwinne wytwarzania oprogramowania Wykład 7 Marcin Młotkowski 23 listopada 2016

Plan wykładu 1 2 3 Kilka negatywnych przykładów Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 2 / 48

Single Responsibility Principle (SRP) Definicja Za chwilę... Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 3 / 48

Przykład Prostokąt +rysowanie() +pole(): double Aplikacja graficzna Geomertia obliczeniowa Interfejs graficzny Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 4 / 48

Co robi klasa Prostokąt Geometria Modeluje matematyczny obiekt prostokąt, dzięki czemu może obliczyć jego pole. Grafika Wizualizuje prostokąt za pomocą interfejsu graficznego. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 5 / 48

Zmiana projektu Zmiana interfejsu graficznego z 2D na 3D. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 6 / 48

Zmiana projektu Zmiana interfejsu graficznego z 2D na 3D. Zmiana wymaga Ponowna implementacja metody rysowanie() Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 6 / 48

Zmiana projektu Zmiana interfejsu graficznego z 2D na 3D. Zmiana wymaga Ponowna implementacja metody rysowanie() Konieczne Skompilowanie, przetestowanie i wdrożenie Aplikacji geometrycznej, czy przypadkiem coś się nie zmieniło. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 6 / 48

Zmiana projektu ProstokątGeometryczny +pole(): double Aplikacja graficzna Interfejs graficzny Prostokąt Geomertia obliczeniowa +rysowanie() Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 7 / 48

Obserwacje Zmiana projektu wymusiła zmiany tylko części klasy, tj. części graficznej. Może być druga przyczyna zmiany projektu: zmiana części geometrycznej. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 8 / 48

Definicja Żadna klasa nie może być modyfikowana z więcej niż jednego powodu. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 9 / 48

Inny przykład Klasa Pracownik + ObliczPensję(): decimal + Zapisz() + EdycjaGUI() Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 10 / 48

Plan wykładu 1 2 3 Kilka negatywnych przykładów Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 11 / 48

Tydzień temu na wykładzie: Sztywność Drobna zmiana w specyfikacji powoduje kaskadowe zmiany Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 12 / 48

Cel Chcemy aby: rozbudowa systemu wymagała tylko dodawania kodu, a nie jego modyfikacji. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 13 / 48

(open close principle, OCP) Definicja Składniki oprogramowania (klasy, moduły, procedury etc.) muszą być otwarte na rozbudowę, ale zamknięte na dla modyfikacji. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 14 / 48

Objaśnienia Otwarte na rozszerzenia łatwo rozbudować funkcjonalność modułu Zamknięte na modyfikacje Zmiany nie mogą skutkować modyfikacją kodu źródłowego, ani nawet zmianami na poziomie binariów. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 15 / 48

Przykład niezgodności z zasadą OCP: architektura klient-serwer Dokument DotPrinter Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 16 / 48

Kod źródłowy public class DotPrinter {... } public class Dokument { } public void drukuj(dotprinter prn) {... } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 17 / 48

Kod źródłowy public class DotPrinter {... } public class Dokument { } public void drukuj(dotprinter prn) {... } Wymiana sprzętu public class LaserPrinter {... } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 17 / 48

Rozwiązanie nr 1: wzorzec projektowy Strategia Dokument <<interface>> ClientInterface DotPrinter Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 18 / 48

Implementacja public interface Printer {... } public class DotPrinter : Printer {... } public class Dokument { } public void drukuj(printer prn) {... } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 19 / 48

Rozwiązanie nr 2: wzorzec projektowy Template Method Dokument Drukarka DotPrinter Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 20 / 48

Inny przykład złego projektu: figury geometryczne enum ShapeType { circle, square }; typedef struct Shape *ShapePointer; void DrawAllShapes(ShapePointer list[], int n) { int i; for(i = 0; i < n; i++) { struct Shape *s = list[i]; switch (s->itstype) { case square: DrawSquare( (struct Square*)s); break; case circle: DrawCircle( (struct Circle*)s); break; } } }

Ocena takiego systemu Dodanie nowej figury, np. trójkąta: wyszukanie wszystkich warunków sprawdzających typ figury; konieczność ponownej kompilacji modułu i wszystkich modułów zależnych; konieczność ponownej instalacji bibliotek. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 22 / 48

Wady Sztywność Dodanie nowego elementu do wyliczenia wymusza serię działań: kompilacja, testowanie, instalacja. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 23 / 48

Wady Sztywność Dodanie nowego elementu do wyliczenia wymusza serię działań: kompilacja, testowanie, instalacja. Wrażliwość Rozszerzenie implementacji wymaga starannego przejrzenia kodu w poszukiwaniu switch--case i if--else badających typ figury. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 23 / 48

Dobre rozwiązanie public interface Shape { void Draw(); } public class Square : Shape { public void Draw() {... } } public class Circle : Shape { public void Draw() {... } } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 24 / 48

Zgodność z zasadą Otwartość Łatwość zmian w zakresie dodawania nowych figur. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 25 / 48

Zgodność z zasadą Otwartość Łatwość zmian w zakresie dodawania nowych figur. Zamkniętość Nie ma konieczności modyfikacji istniejącego kodu przy rozbudowie. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 25 / 48

A jakie są wady Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 26 / 48

A jakie są wady Trzeba przewidzieć kierunek zmian projektu. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 26 / 48

Kiedy ten projekt zawiedzie Shape shapes[]; foreach (Shape sh in shapes) sh.draw(); Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 27 / 48

Kiedy ten projekt zawiedzie Shape shapes[]; foreach (Shape sh in shapes) sh.draw(); Dodatkowe założenie Chcemy, aby najpierw były kwadraty, a potem okręgi. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 27 / 48

Kiedy ten projekt zawiedzie Shape shapes[]; foreach (Shape sh in shapes) sh.draw(); Dodatkowe założenie Chcemy, aby najpierw były kwadraty, a potem okręgi. Smutny wniosek Nie da się zaprojektować tak system, aby był otwarty na dowolne zmiany. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 27 / 48

Próba poprawienia public interface Shape : IComparable { void Draw(); }... shapes.sort(); foreach (Shape sh in shapes) sh.draw(); Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 28 / 48

Przypomnienie public interface IComparable { int CompareTo(Object obj) } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 29 / 48

Próba implemetacji public class circle : Shape { public int CompareTo(object o) { if (o is Square) return -1; else return 0; } } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 30 / 48

Ocena implementacji Czy ta implementacja spełnia warunek ocp? Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 31 / 48

Przewidywanie kierunku zmian szybkie wydania; Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 32 / 48

Przewidywanie kierunku zmian szybkie wydania; szybkia prezentacja; Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 32 / 48

Przewidywanie kierunku zmian szybkie wydania; szybkia prezentacja; szybkie uzyskanie informacji zwrotnej od klienta. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 32 / 48

Plan wykładu Kilka negatywnych przykładów 1 2 3 Kilka negatywnych przykładów Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 33 / 48

Oryginalne sformułowanie Kilka negatywnych przykładów Oczekujemy czegoś na kształt właściwości podstawienia: jeżeli dla każdego obiektu o 1 typu S istnieje taki obiekt o 2 typu T, że zachowanie wszystkich programów P zdefiniowanych na bazie typu T nie zmieni się, jeśli obiekt o 1 zastąpimy obiektem o 2, typ S jest podtypem typu T. Barbara Liskov, 1988 Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 34 / 48

Kilka negatywnych przykładów Pierwszy przykład: figury geometryczne public enum ShapeType { square, circle }; public class Shape { private ShapeType type; public Shape(ShapetType t) { this.type = t; } } public static void DrawShape(Shape s) { if (s.type == ShapeType.square) (s as Square).Draw(); else if (s.type == ShapeType.circle) (s as Circle).Draw(); } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 35 / 48

Implementacja klas Kilka negatywnych przykładów public class Circle : Shape {... public Circle() : base(shapetype.circle) {} public void Draw() {... } } public class Square : Shape { public Square() : base(shapetype.square) {} public void Draw() {... } } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 36 / 48

Użycie Kilka negatywnych przykładów Chcemy uniknąć polimorficznych wywołan bo kosztowne... Shape[] obrazek = new Shape[100];... foreach(shape sh in Shape) Shape.DrawShape(sh); Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 37 / 48

Użycie Kilka negatywnych przykładów Chcemy uniknąć polimorficznych wywołan bo kosztowne... Shape[] obrazek = new Shape[100];... foreach(shape sh in Shape) Shape.DrawShape(sh); Ocena implementacji Narusza zasadę otwarte zamknięte Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 37 / 48

Drugi błąd Kilka negatywnych przykładów Shape s = new Circle(ShapeType.circle); s.draw(); Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 38 / 48

Drugi błąd Kilka negatywnych przykładów Shape s = new Circle(ShapeType.circle); s.draw(); Shape s = new Shape(ShapeType.circle); s.draw(); Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 38 / 48

Ciekawszy przykład Kilka negatywnych przykładów public class Rectangle { double width; double height; public double Width { get { return width; } set { width = value; } } public double Height { get { return height; } set { height = value; } } } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 39 / 48

Ciąg dalszy Kilka negatywnych przykładów Rozszerzamy implementację o Kwadraty. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 40 / 48

Jak rozwinąć projekt Kilka negatywnych przykładów Rectangle double: Height double: Width kwadrat jest prostokątem; Square Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 41 / 48

Jak rozwinąć projekt Kilka negatywnych przykładów Rectangle double: Height double: Width kwadrat jest prostokątem; Square ale w klasie Square nie potrzebujemy tylu atrybutów! Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 41 / 48

A może tak Kilka negatywnych przykładów Square double: Height double: Width W kwadracie wysokość i szerokość są równe, w prostokącie musimy usunąć ten warunek; Rectangle Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 42 / 48

A może tak Kilka negatywnych przykładów Square double: Height double: Width Rectangle W kwadracie wysokość i szerokość są równe, w prostokącie musimy usunąć ten warunek; musimy zmienić implementację klasy Square (czego programiści zwinni unikają). Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 42 / 48

Poprawiamy projekt Kilka negatywnych przykładów public class Square : Rectangle { public new double Width { set { base.width = value; base.height = value; } } public new double Height { set { base.width = value; base.height = value; } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 43 / 48

Czy to działa? Kilka negatywnych przykładów void obszar(rectangle r) { r.width = 4.0; r.height = 5.0; if (r.area()!= 20.0) throw new Exception("Nieprawidłowa metoda Area!"); } Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 44 / 48

Czy to działa? Kilka negatywnych przykładów void obszar(rectangle r) { r.width = 4.0; r.height = 5.0; if (r.area()!= 20.0) throw new Exception("Nieprawidłowa metoda Area!"); } obszar(new Square()); Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 44 / 48

Kilka negatywnych przykładów Morał Nie można używać obiektów klasy Square zamiast Rectangle. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 45 / 48

Kilka negatywnych przykładów Morał Nie można używać obiektów klasy Square zamiast Rectangle. Szukanie winnego klasa Rectangle? klasa Square? funkcja obszar? Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 45 / 48

Analiza przypadków Kilka negatywnych przykładów Funkcja obszar Wygląda na to, że programista użył prawidłowo interfejsu klasy Rectangle. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 46 / 48

Analiza przypadków Kilka negatywnych przykładów Funkcja obszar Wygląda na to, że programista użył prawidłowo interfejsu klasy Rectangle. Klasa Rectangle? Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 46 / 48

Analiza przypadków Kilka negatywnych przykładów Funkcja obszar Wygląda na to, że programista użył prawidłowo interfejsu klasy Rectangle. Klasa Rectangle? Klasa Square Programista zmodyfikował działanie metod. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 46 / 48

Kilka negatywnych przykładów Może klasa Square nie musi być podklasą Rectangle? Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 47 / 48

Zasada podstawiania Liskov Kilka negatywnych przykładów Definicja Musi istnieć możliwość zastępowania typów bazowych ich podtypami. Marcin Młotkowski Metodyki zwinne wytwarzania oprogramowania 48 / 48