1. Robert C. Martin: Clean Code: A Handbook of Agile Software Craftsmanship (Czysty Kod: Podręcznik Dobrego Programisty)

Podobne dokumenty
Testy automatyczne. Korzystające z junit

METODY PROGRAMOWANIA

Programowanie zespołowe

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

JUnit TESTY JEDNOSTKOWE. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java

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

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Podstawy programowania obiektowego

Budowa aplikacji webowej w oparciu o Maven2 oraz przykłady testów jednostkowych. Wykonał Marcin Gadamer

Programowanie Zespołowe

Paradygmaty programowania

Testowanie II. Cel zajęć. Pokrycie kodu

Języki i techniki programowania Ćwiczenia 2

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Testowanie I. Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego.

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

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wykład 4: Klasy i Metody

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Programowanie w Javie

JUNIT. Terminologia. Organizacja testów

Programowanie obiektowe

Programowanie poprzez testy z wykorzystaniem JUnit

Programowanie obiektowe - 1.

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

NAJLEPSZE STRATEGIE SKUTECZNYCH PROGRAMISTÓW. TECHNIKI PRACY Z KODEM KOD: NSKOD

Testowanie mutacyjne

Wprowadzenie do testów jednostkowych. Marcin Dziedzic, Wiktor Żołnowski

Wzorce projektowe. dr inż. Marcin Pietroo

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

Technika mikroprocesorowa. Struktura programu użytkownika w systemie mikroprocesorowym

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Platformy Technologiczne

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

Modelowanie i Programowanie Obiektowe

Programowanie obiektowe

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

Ogólne zasady projektowania algorytmów i programowania


10. Programowanie obiektowe w PHP5

Akademia ADB Wykład I Praca w grupie i jakość kodu

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

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

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Lekcja 5 - PROGRAMOWANIE NOWICJUSZ

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

Szablony funkcji i szablony klas

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Sexy unit testy. czyli o kilku praktykach w testach jednostkowych

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Kod doskonały : jak tworzyć oprogramowanie pozbawione błędów / Steve McConnell. Gliwice, cop Spis treści. Wstęp 15.

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

programowanie w oparciu o platformę netbeans w praktyce

Technologie i usługi internetowe cz. 2

Testy jednostkowe Wybrane problemy testowania metod rekurencyjnych

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie dla początkujących w 24 godziny / Greg Perry, Dean Miller. Gliwice, cop Spis treści

Testowanie. Ryszard Beczek & Piotr Miłkowski 1 04/11/07

1 Podstawy c++ w pigułce.

Wzorce projektowe i refaktoryzacja

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Programowanie obiektowe

Klasy abstrakcyjne, interfejsy i polimorfizm

Podstawy i języki programowania

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

TEMAT : KLASY DZIEDZICZENIE

Optimizing Programs with Intended Semantics

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Polimorfizm. dr Jarosław Skaruz

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe zastosowanie języka Java SE

Zaawansowane programowanie w C++ (PCP)

Dokumentacja do API Javy.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

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

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

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Dziedziczenie. Tomasz Borzyszkowski

Podstawy Programowania Programowanie Obiektowe

użytkownika 1 Jak wybrać temat pracy 2 Spis treści 3 Część pierwsza problematyka 4 Część druga stosowane metody 5 Część trzecia propozycja rozwiązania

Tworzenie aplikacji w języku Java

Klasy i obiekty cz II

BAZY DANYCH MAKRA I PRZYCISKI. Microsoft Access. Adrian Horzyk. Akademia Górniczo-Hutnicza

Transkrypt:

Jakoś(ć) kodu

Polecana literatura 1. Robert C. Martin: Clean Code: A Handbook of Agile Software Craftsmanship (Czysty Kod: Podręcznik Dobrego Programisty) 2. Peter Kim: Podręcznik pentestera. Bezpieczeństwo systemów informatycznych 3. Bill Karwin: Antywzorce języka SQL. Jak unikać pułapek podczas programowania baz danych 4. Gynvael Coldwind: Zrozumieć programowanie

Miara jakości kodu

Jakie są konsekwencje niechlujstwa?

Przyczyny kodu spaghetti Pośpiech, ale przecież naprawa i zrozumienie bałaganu zajmie więcej czasu. Presja szefa, ale dobry szef wie, że niektóre rzeczy wymagają czasu (jeśli Twój PM twierdzi, że wystarczy 9 kobiet i 1 miesiąc, aby urodzić dziecko, to uciekaj z tej firmy) Zmęczenie i znużenie aktualnym kodem. Każdy lubi nowości, ale złe nawyki tam też się przeniosą No przecież działa. Tylko do czasu

Przyczyny raz jeszcze Harmonogram był nierealny, ale kto go tworzył? Zmiany wymaga były zbyt poważne, ale jeśli kod byłby napisany z wizją na przyszłość nie byłoby problemu.

A czym jest czysty kod?

A czym jest czysty kod?

A czym jest czysty kod?

A czym jest czysty kod?

A czym jest czysty kod?

Praca programisty Bob wszedł do modułu. Usunął to jeszcze raz. Wpisał połowę czegoś innego, ale usunął to! Przewinął w dół, do funkcji wymagającej zmiany. Wpisał to jeszcze raz. Przesunął się do innej funkcji, która wywoływała zmienianą funkcję, aby sprawdzić, jak była Otworzył nowe okno i zajrzał do klasy pochodnej. Czy ta funkcja jest przesłonięta? Przerwał, rozważając możliwości. Ups, usunął to, co napisał! wywoływana. Ponownie usunął ten kod. Przeszedł do początku modułu w celu sprawdzenia inicjalizacji zmiennej. Teraz przesunął się w dół i zaczął pisać. Przeszedł znów w górę i wpisał ten sam kod, który usunął. Zatrzymał się.

Konkretne umiejętności, które warto nabyć

Komentarze Niewłaściwe informacje Jeśli coś można napisać w nazwach klas/funkcji/zmiennych, to umieść to tam. VCS też jest dobrym pomysłem Stare komentarze Jeśli coś jest przestarzałe, to tylko wprowadzi zamęt zamiast pomóc Nadmiarowe komentarze Zakomentowany kod i++ //inkrementacja zmiennej i Używasz VCSów, prawda? Zakomentowany kod jest bardzo enigmatyczny.

Środowisko programistyczne One click build Budowanie i inne czynności niebezpośrednio związane z kodowaniem powinny być maksymalnie uproszczone One click test Podobnie uruchomienie wszystkich testów automatycznych. Skróty klawiszowe Poznaj debugera Znasz i korzystasz z nich, prawda? Zamiast odrywać się od pisania, naucz się skrótów (czy wiesz, że w Netbeansie wystarczy wpisać sout i dać [TAB] żeby wstawić System.out.println()? Debuger to potężne narzędzie. Z pozoru tylko należy poświęcić dużo czasu, żeby zdebugować program. Ale właściwie jest to znacznie szybsze niż szukanie po omacku!

Funkcje Nadmiar argumentów Argumenty wyjściowe Argumenty znacznikowe Martwe funkcje Idealna funkcja nie ma argumentów. Jeśli jednak ma ich więcej niż 3 coś jest nie tak. Czyli inaczej przekazywanie przez referencję. Rzadko kiedy jest usprawiedliwione. Czyli argument typu prawda/fałsz, który zmienia sposób wykonania funkcji. Argh! Skoro do niczego jest niewykorzystywana, to po co ją zostawiać w kodzie?

Przykład

Inne Zaskoczenie Spodziewamy się, że nazwa funkcji odzwierciedla jej sposób działania. Jeśli coś nie działa tak jak sądzimy, musimy zajrzeć do kodu. Błędy graniczne Wyłączanie zabezpieczeń Niby proste, ale czemu zwykle ograniczamy się do testowania kilku przypadków standardowych zamiast wysilić szare komórki i wymyśleć co może pójść nie tak? NIGDY nie jest dobrym pomysłem. Wszystkie tylko tutaj na chwilę i inne brudne hacki prędzej czy później się zemszczą. Powtórzenia Ten sam kod w wielu funkcjach? Ten sam zbiór warunków switch-if-else? Moduły, które robią to samo, ale różnymi algorytmami?

Co tutaj jest nie tak?

Co tutaj jest nie tak? Funkcja percentfull() jest na nieodpowiednim poziomie abstrakcji. Po pierwsze nie zwraca żadnego wyjątku (a jaki stos jest tak naprawdę nieograniczony?) Po drugie istnieją implementacje, które nie muszą znać poziomu wypełnienia stosu. A ten interfejs wymusza takową funkcję.

Co tutaj jest nie tak?

Co tutaj jest nie tak? Obiekt klasy ParameterAnalyser jest całkowicie przeładowany informacjami. Czy da się to jakoś poprawić? Czy widząc pierwszy raz taki konstruktor wiadomo, co wykonuje?

Inne Martwy kod Niczym martwe zło jest to kod, który jest niemożliwy do wykonania. Większość IDE sygnalizuje taki fakt (np. kod po returnie z funkcji) Separacja pionowa Jeśli definiujemy funkcje, które korzystają z innych funkcji, to dobrze je mieć blisko siebie w kodzie. Niespójność Jeśli zawsze rezultat nazywa się result, to trzymajmy się tego we wszystkich funkcjach.

Zazdrość funkcji gettenthrate() i gettenthsworked() należą do innej klasy. Funkcja calculateweeklypay zazdrości klasie HourlyEmployee, że w niej nie jest.

Zazdrość funkcji - kontrprzykład

Argumenty wybierające

Argumenty wybierające Trzeba pamietać, czym jest executeupdate(, false)

Funkcje statyczne Math.max(double a, double b) new Math().max(a, b) lub a.max(b)

Funkcje statyczne Math.max(double a, double b) new Math().max(a, b) lub a.max(b) Staramy się unikać niepotrzebnych funkcji statycznych (polimorfizm!), ale czasami mają one sens.

Kroki pośrednie

Kroki pośrednie Drugi z kodów jest mniej czytelny dla postronnego czytelnika. Oszczędność kilku bajtów pamięci oraz dwóch kroków pośrednich zwykle nie jest warta zaciemnienia kodu.

Stałe

Hermetyzacja warunków Nie tylko powoduje to zdecydowanie szybsze zrozumienie i sprawdzenie kodu, ale także pozwala uniknąć wielu błędów w konstrukcjach warunkowych. Warto tu wspomnieć też o: 1. Szybkiej ewaluacji warunków logicznych 2. Minimalizacji funkcji logicznych 3. Zwiększeniu abstrakcji i re-use kodu.

Inne Funkcje specjalizowane Każda z funkcji powinna wykonywać dokładnie jedną operację. Błędem jest pisanie uber-funkcji. Hermetyzacja warunków granicznych Kod mówi sam za siebie: for(int i=1;i<=length()-1;i++) Stałe na wysokim poziomie abstrakcji Najlepiej stałe wrzucić do oddzielnej klasy Constants, żeby były dostępne wszędzie, tak? Standardowa nomenklatura Znamy funkcję tostring()? To czemu piszemy wszystko po swojemu?

Testy jednostkowe Test jednostkowy to fragment kodu napisany przez dewelopera, który wykonuje fragment testowanej aplikacji i ewaluuje jej wynik. Dobry program to taki, którego pokrycie testami jest maksymalne (czyli procent kodu testowanego) Unit testy pokrywają mały fragment kodu (zwykle jedną metodę lub maksymalnie klasę) Testy jednostkowe zapewniają zamierzone działanie kodu. Zwykle są wykonywane wielokrotnie w trakcie powstawania aplikacji aby być pewnym, że funkcjonalność działa przez cały czas pomimo zmian w kodzie.

junit JUnit jest narzędziem służącym do tworzenia powtarzalnych testów jednostkowych oprogramowania pisanego w języku Java. Cechy JUnit: metoda najmniejszą jednostką testowania, przypadki testowe, oddzielenie testów od kodu, wiele mechanizmów uruchamiania, tworzenie raportów, integracja z różnymi środowiskami programistycznymi. http://www.vogella.com/tutorials/junit/article.html http://junit.org/

Testujemy klasę

Tworzymy testy

Możliwe testy @Test public void method() @Test (expected = Exception.class) W ten sposób oznaczamy metodę do wykonania jako test Metoda powinna zwrócić wyjątek Exception @Test(timeout=100) Metoda powinna się wykonać w mniej niż 100ms @Before public void method() @After public void method() @BeforeClass public static void method() @AfterClass public static void method() Metoda wykonywana przed każdym testem Metoda wykonywana po każdym teście Metoda wykonywana raz przed wszystkimi testami Metoda wykonywana raz po wszystkich testach

Test dla dodawania

Możliwe asercje fail() Zawsze się nie uda (zwróci test negatywny) asserttrue([message], boolean condition) Sprawdzi, czy warunek jest prawdziwy assertequals([string message], expected, actual, tolerance) Sprawdzi czy expected == actual +/- tolerance. Do tego ewentualnie wyświetli message assertnull([message], object) Czy obiekt jest nullem assertsame([string], expected, actual) Czy obiekty są takie same http://junit.sourceforge.net/javadoc/org/junit/assert.html

Wykonujemy testy

Testowanie - błędy Niewystarczające testy Pokrycie kodu testami Proste testy Pobliskie błędy Szybkość testów Nigdy nie ma czegoś takiego jak wystarczająca liczba testów Idealnie 100% kodu jest pokryte testami; są narzędzia, które to sprawdzają Zgodnie z prawami Murphy ego, jeśli coś się może nie udać, to na pewno się nie uda Jeśli odkryliśmy błąd, to sprawdźmy podobne elementy i podobne fragmenty kodu Testy powinny być szybkie. Inaczej nie będą wykonywane