SlideShare uma empresa Scribd logo
1 de 148
Jak programować aby
nie zwariować?
Jakub Marchwicki
20.05.2013
Na początek
Co to za gość?
Co ja tu robię?
Co ja tu robię?
Co ja tu robię?
Co ja tu robię?ból
Co ja tu robię?ból
liczba slajdów
Co ja tu robię?ból
liczba slajdów
OK
Ryzyko
utraty
zdrowia
35 slajdów
Co ja tu robię?ból
liczba slajdów
OK
Ryzyko
utraty
zdrowia
148 slajdów
Punkt wyjścia
Kiedy software jest dobry?
Oprogramowanie musi działać
Musi być na czas
Musi być rozbudowywalne
Modyfikowalne
Musi mieć odpowiednią jakość
Punkt wyjścia
Punkt wyjścia
I po co to wszystko?
Bo software to nasze hobby
I po co to wszystko?
Bo software to nasze hobby
fach
I po co to wszystko?
Bo software to nasze hobby
fach
zawód
I po co to wszystko?
Bo software to nasze hobby
fach
zawód
przyjemność
I po co to wszystko?
bo płacą nam za pisanie
dokumentacji
pisanie kodu to przyjemność
Więc czym jest jakość
Dla kogoś Dla siebie
Dla kogo pracuje?
Więc czym jest jakość
Dla kogoś Dla siebie
Dla kogo pracuje?
„Jakość (jak piękno) jest sądem
wartościującym, wyrażonym przez
użytkownika. Jeśli nie ma takiego
użytkownika – nie ma takiego sądu”
Platon
Więc czym jest jakość
Więc czym jest jakość
Dla kogoś Dla siebie
Dla kogo pracuje?
„Jakość to sposób myślenia,
który powoduje, że stosuje się i
bez przerwy poszukuje
najlepszych rozwiązań”
William Edwards Deming
Więc czym jest jakość
Jak programować aby nie zwariować?
Czysty kod
Czysty kod
• Uczymy się… bez wnikania w kontekst
 Nazywaj zmienne w taki a taki sposób
 Stosuj komentarze w takich a nie innych
przypadkach
 Dziel funkcje na części zgodnie z takimi
a takimi zasadami
• Z czasem zobaczymy że z czystym
kodem lepiej się pracuje… tak po
ludzku
Nasz mózg lepiej reaguje na czysty kod
• Utrzymujemy koncentrację
• Nie gubimy wątków, swobodniej
podążamy tokiem myślenia
• Cognitive load – możemy pomieścić
poszczególne kawałki kodu w głowie
więc potrafimy się miedzy nimi
swobodnie przemieszczać
• Nazwy
• Funkcje
• Komentarz
• Formowanie kodu
• Obiekty i struktury danych
• Obsługa błędów
Poziom I
• Nazwy
• Funkcje
• Komentarz
• Formatowanie kodu
• Obiekty i struktury danych
• Obsługa błędów
Poziom I
int d1; //dni od rozpoczęcia
int d2; //dni do zakończenia
int d3; //dni wolnych
int daysSinceStart;
int daysTillEnd;
int daysOf;
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
} public List<int[]> getDates() {
List<int[]> dateList = new ArrayList<int[]>();
for (int[] week : theWeeksArray)
if (week[0] == BEGIN_DATE)
dateList.add(x);
return dateList;
}
for (int i=0; i<10; i++){
k += ((l[i]*1.5) / 3 );
}
float milleageRate;
const int NUMER_OF_EMPLOYEE = 3;
float sum = 0;
for ( int i=0; i<numberOfTrips; i++ ){
float totalCompensation = tripLength[i] * milleageRate;
float deduction = totalCompensation / NUMER_OF_EMPLOYEE;
sum += deduction;
}
public class CsmrDt {
public void crtshpcrt() {/*...*/};
public void remcrt() {/*...*/};
private final int ssntm = 10;
/*...*/
}
public class CustomerDataset {
public void createShoppingCart() {/*...*/};
public void removeCart() {/*...*/};
private final int sessionTimeout = 10;
/*...*/
}
• Nazwy powinny sugerować co zwracają
• Nazwy muszą mówić o całym zakresie
funkcjonalności
Metody
String findLastNameOfCustomerWithId(long customerId){...}
Map<Long, Customer> customers;
Customer getCustomer(Long id){
Customer customer = customers.get(id);
if(customer == null){
customer = createNewCustomer(id);
}
return customer;
}
• Nazwy
• Funkcje
• Komentarz
• Formatowanie kodu
• Obiekty i struktury danych
• Obsługa błędów
Poziom I
• Zasada pierwsza:
funkcje powinny być małe
• Zasada druga:
funkcje powinny być jeszcze mniejsze
Funkcje
Functions should do one thing.
Should do it well
Should do it only!
Funkcje
writeField(outputStream, name);
outputStream.writeField(name);
createSquare(width, height);
calculateRectangularPrismVolume(double height,
double width, double depth);
calculateRectangularPrismVolume(Area rectangle,
double depth);
Funkcje
DRY – Don’t repeat yourself
• Duplikacja zmniejsza czytelność
• Zwiększa koszty utrzymania, refactoringu i
poprawiania błędów
• Prowadzi do rozbieżności funkcjonalnej
modułów wykonujących to samo
• Zmniejsza reusability kodu
• Nazwy
• Funkcje
• Komentarz
• Formatowanie kodu
• Obiekty i struktury danych
• Obsługa błędów
Poziom I
Komentarze
DON’T
Komentarze
„Nie komentuj złego kodu – popraw go”
Brian W. Kernighan i P.J. Plaugher
//Sprawdzenie czy klient ma możliwość korzystania ze zniżki
if (customer.isStudent() ||
(customer.age < 18) || (customer.age > 65))
if (customer.isEligibleForDiscount())
„If you decide to write a comment, then
spend the time necessary to make sure it is
the best comment you can write”
Robert C. Martin
Komentarze
• Nazwy
• Funkcje
• Komentarz
• Formatowanie kodu
• Obiekty i struktury danych
• Obsługa błędów
Poziom I
Formatowanie
• Konwencje formatowania w zespole.
Ustal i się ich trzymaj
• Nazwy
• Funkcje
• Komentarz
• Formatowanie kodu
• Obiekty i struktury danych
• Obsługa błędów
Poziom I
• Prawo Demeter – zasada minimalnej
wiedzy
• Moduł powinien nie wiedzieć nic o
wnętrzu obiektów, którymi manipuluje
Prawo Demeter
• Prawo Demeter głosi, że metoda f
klasy C powinna wywoływać tylko
metody z:
• Klasy C,
• Obiektu utworzonego przez f,
• Obiektu przekazanego jako argument f,
• Obiektu umieszczonego w zmiennej
instancyjnej klasy C.
Prawo Demeter
• Możesz bawić się ze sobą
• Możesz bawić się własnymi
zabawkami (ale nie możesz ich
rozbierać)
• Możesz bawić się zabawkami które
dostałeś
• Możesz bawić się zabawkami które
zrobiłeś samodzielnie
Prawo Demeter
final String outputDir = context.getOptions().getScratchDir().getAbsolutePath();
Options options = context.getOptions();
File scratchDir = options.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
• Nazwy
• Funkcje
• Komentarz
• Formatowanie kodu
• Obiekty i struktury danych
• Obsługa błędów
Poziom I
Zwracanie null
DON’T
• Wykorzystuj zgłaszanie wyjątków lub
zwracanie obiektu specjalnego
przypadku
Zwracanie null
List<Item> items = getItems();
if (items != null) {
for (Item i : items) {
totalCost += i.getCost();
}
}
List<Item> items = getItems();
for(Item i : items) {
totalCost += i.getCost();
}
public interface Animal {
public void makeSound();
}
public class Dog implements Animal {
public void makeSound() {
System.out.println("woof!");
}
}
public class NullAnimal implements Animal {
public void makeSound() {
}
}
• Przekazywanie null jest gorsze od
jego zwracania
Przekazywanie null
public class MetricsCalculator {
public double rectanglePerimeterCalculate(
double x, double y) {
return 2 * (y + x);
}
/* ... */
}
• Defensive programming
Przekazywanie null
public class MetricsCalculator {
public double rectanglePerimeterCalculate(
double x, double y) {
if (x == null || y == null) {
throw InvalidArgumentException("Niewłaściwy
argument.");
}
return 2 * (y + x);
}
} public class MetricsCalculator {
public double rectanglePerimeterCalculate(
double x, double y) {
assert x != null : "x nie może być null";
assert y != null : "y nie może być null";
return 2 * (y + x);
}
}
Miara czystego kodu
Czysty projekt
Poziom II - SOLIDny programista
• The Single Responsibility Principle – klasa
powinna mieć tylko jeden powód do zmiany
• The Open Closed Principle – klasę można
łatwo rozszerzać, nie modyfikując jej
• The Liskov Substitution Principle – klasy
pochodne muszą być przeźroczystymi
zamiennikami klasy nadrzędnej
• The Interface Segregation Principle – dla
różnych klientów twórz osobne interfejsy
• The Dependency Inversion Principle –
bądź zależny od abstrakcji a nie od
konkretnych implementacji
SOLIDny programista
To znaczy jaki?
Kod obiektowy
• Odpowiedzialność – tylko jedna
 obiekty maja własną osobowość,
unikaj schizofrenicznych obiektów
• Enkapsulacja – to co się zmienia jest
hermetyzowane
• Preferencja kompozycji ponad
dziedziczenie
• Dokładanie ponad modyfikacje
– Gdy dodajemy nową funkcjonalność raczej dokładamy
nowe byty niż modyfikujemy istniejące.
• Lokalne zmiany
– Zmiana ma konsekwencje lokalne, a nie globalne.
Zasięg rażenia zmian jest jak najmniejszy.
• Nieinwazyjność zmian
– Dodanie nowych rzeczy (odpowiedzialności,
funkcjonalności, zachowań) do istniejących bytów jest
przezroczyste ich dla klientów.
public class Sql {
public Sql(String table, Column[] columns)
public String create()
public String insert(Object[] fields)
public String selectAll()
public String fieldByKey(
String keyColumn, String keyValue)
private String ColumnList(Column[] columns)
private String valuesList(
Object[] fields, final Column[] columns)
}
abstract public class Sql {
public Sql(String table, Column[] columns)
abstract public String generate();
}
public class CreateSql extends Sql {
public CreateSql(String table, Column[] columns)
@Override public String generate()
}
public class SelectSql extends Sql {
public SelectSql(String table, Column[] columns)
@Override public String generate()
}
public class InsertSql extends Sql {
public InsertSql(String table, Column[] columns)
@Override public String generate()
private String valuesList(Object[] fields, final Column[] columns)
}
public class FindKeyBySql extends Sql {
public FindKeyBySql(String table, Column[] columns, String keyColumn, String keyValue)
@Override public String generate()
}
public class ColumnList {
public ColumnList(Column[] columns)
public String generate()
}
Odpowiedzialność. Enkapsulacja. Kompozycja
• To co leży u podstaw możemy
stosować na każdym poziomie
• Projektując klasy
• Projektując moduły, komponenty
• Projektując systemy
• Każdy wzorzec opisujemy w trzech
kontekstach:
 Odpowiedzialność
 Enkapsulacja / hermetyzacja
 Kompozycja
Wzorce projektowe
• Rozdziela i przesłania implementację
zachowań, czynności.
• Hermetyzujemy zmienny sposób
tworzenia obiektów
• Nowe funkcjonalności uzyskujemy
poprzez dodawanie komend, poprzez
kompozycję.
Wzorce projektowe: komenda
Wzorce projektowe: komenda
• Każdy element systemu:
 Ma swoją odpowiedzialność
 Hermetyzuje pewne zachowania
 Składa się z kilku współpracujących
elementów
Moduły
• Każdy framework opisujemy w trzech
zdaniach:
 Odpowiedzialność
 Enkapsulacja
 Preferowanie kompozycji
Frameworki
• Spring czy EJB
Nie ma idealnych rozwiązań
• Spring czy EJB
• JSF czy JSP
Nie ma idealnych rozwiązań
• Spring czy EJB
• JSF czy JSP czy Velocity
Nie ma idealnych rozwiązań
• Spring czy EJB
• JSF czy JSP czy Velocity
• JPA czy iBatis
Nie ma idealnych rozwiązań
• Spring czy EJB
• JSF czy JSP czy Velocity
• JPA czy iBatis czy JDBC
Nie ma idealnych rozwiązań
• Spring czy EJB
• JSF czy JSP czy Velocity
• JPA czy iBatis czy JDBC
• MVC czy MVP
Nie ma idealnych rozwiązań
• Spring czy EJB
• JSF czy JSP czy Velocity
• JPA czy iBatis czy JDBC
• MVC czy MVP
• Java czy .NET
Nie ma idealnych rozwiązań
• Spring czy EJB
• JSF czy JSP czy Velocity
• JPA czy iBatis czy JDBC
• MVC czy MVP
• Java czy .NET czy Python
Nie ma idealnych rozwiązań
• Spring czy EJB
• JSF czy JSP czy Velocity
• JPA czy iBatis czy JDBC
• MVC czy MVP
• Java czy .NET czy Python czy PHP
Nie ma idealnych rozwiązań
Nie ma idealnych złoytych środków
SOLIDny programista
• Kod jest podstawowym medium
komunikacji w projekcie
• Kod to miejsce w którym spędzamy
najwięcej czasu
• Zły kod to jak solenie herbaty koledze
z zespołu albo plucie do kanapki – a
przecież nie jesteśmy złośliwi
Wartości
• Jako zespół jesteśmy jednością
– Jak ja pójdę na skróty, to kolega
będzie się męczył
– I jako całość i tak będziemy
nieefektywni
Wartości
• Programy są częściej czytane niż
pisane
• Więcej czasu poświęcamy na
modyfikację istniejącego kodu niż na
tworzenie nowego
Implementation Patterns
• Komunikacja – kod źródłowy powinno
się czytać jak książkę
• Prostota – wprowadzaj złożoność
tylko wtedy, kiedy jest to konieczne
• Elastyczność – elastyczność to
dodatkowa złożoność, więc
wprowadzaj ją tylko tam gdzie to
konieczne
Implementation patterns
• Lokalne konsekwencje – zmiana w
jednym miejscu nie powoduje zmian w
innych
• Minimalne powtórzenia – DRY
Implementation patterns
• Dane i logika razem – ponieważ dane
i logika z reguły zmieniają się w tym
samym czasie
• Symetria – utrzymuj podobny poziom
abstrakcji w obrębie metody / klasy
Implementation patterns
„Czysty kod jest prosty i bezpośredni.
Czysty kod czyta się jak dobrze
napisaną prozę. Czysty kod nigdy nie
zaciemnia zamiarów projektanta; jest
pełen trafnych abstrakcji i prostych
ścieżek sterowania.”
Grady Booch – to jeden z tych panów od UMLa
Po co to wszystko?
Complexity and confusion
Complexity and confusion
Affordance
Affordance
a quality of an object, which
allows an individual to perform
an action. For example, a knob
affords twisting, and perhaps
pushing, while a cord affords
pulling
public class Sql {
public Sql(String table, Column[] columns)
public String create()
public String insert(Object[] fields)
public String selectAll()
public String fieldByKey(
String keyColumn, String keyValue)
private String ColumnList(Column[] columns)
private String valuesList(
Object[] fields, final Column[] columns)
}
abstract public class Sql {
public Sql(String table, Column[] columns)
abstract public String generate();
}
public class CreateSql extends Sql {
public CreateSql(String table, Column[] columns)
@Override public String generate()
}
public class SelectSql extends Sql {
public SelectSql(String table, Column[] columns)
@Override public String generate()
}
public class InsertSql extends Sql {
public InsertSql(String table, Column[] columns)
@Override public String generate()
private String valuesList(Object[] fields, final Column[] columns)
}
public class FindKeyBySql extends Sql {
public FindKeyBySql(String table, Column[] columns, String keyColumn, String keyValue)
@Override public String generate()
}
public class ColumnList {
public ColumnList(Column[] columns)
public String generate()
}
Po co to wszystko?
Budujemy nawyki
By żyło się lepiej
Szukamy doświadczenia, pytamy
Samodzielnie poszukujemy drogi
Stosujemy framework na siłę
Porzucamy framework i robimy po staremu
By w sytuacjach trudnych…
… brniemy nie wiadomo gdzie …
… mimo że cel był wyraźny
Jak żyć?
Jak żyć?
Jak żyć?
Jak żyć?
Jak żyć?
Jak żyć?
2010
Jak żyć?
2010
Jak żyć?
2010
2009
Jak żyć?
2010
2009
Jak żyć?
2010
2009
Jak żyć?
2010
2009
2009
Jak żyć?
2010
2009
2009
Jak żyć?
2010
2009
2009
2008
Jak żyć?
2010
2009
2009
2008
Jak żyć?
2010
2009
2009
2008
2007
Jak żyć?
Jak żyć?
2002
Jak żyć?
2002
Jak żyć?
2002
1996 / 2000
Jak żyć?
2002
1996 / 2000
Jak żyć?
2002
1996 / 2000
2002
Jak żyć?
2002
1996 / 2000
2002
Jak żyć?
2002
1996 / 2000
2002
1994
Jak żyć?
Jak żyć?
Shu-Ha-Ri
jmarchwicki@ydp.eu
twitter: @kubem
Stoisko 25
Shu-Ha-Ri

Mais conteúdo relacionado

Destaque

Wykorzystanie Social Media W Kreowaniu Wizerunku
Wykorzystanie  Social  Media W Kreowaniu WizerunkuWykorzystanie  Social  Media W Kreowaniu Wizerunku
Wykorzystanie Social Media W Kreowaniu Wizerunku
Anna Kusak
 

Destaque (20)

Copywriting dla startupów - jak pisać o projektach technologicznych?
Copywriting dla startupów - jak pisać o projektach technologicznych?Copywriting dla startupów - jak pisać o projektach technologicznych?
Copywriting dla startupów - jak pisać o projektach technologicznych?
 
Strategia a intuicja- niezwykłe pomysły na nowe media
Strategia a intuicja- niezwykłe pomysły na nowe media Strategia a intuicja- niezwykłe pomysły na nowe media
Strategia a intuicja- niezwykłe pomysły na nowe media
 
Kryzysy w social media do ogarnięcia
Kryzysy w social media do ogarnięcia Kryzysy w social media do ogarnięcia
Kryzysy w social media do ogarnięcia
 
Kryzys w social media - prezentacja na Social Media Standard Biznes 2012
Kryzys w social media - prezentacja na Social Media Standard Biznes 2012Kryzys w social media - prezentacja na Social Media Standard Biznes 2012
Kryzys w social media - prezentacja na Social Media Standard Biznes 2012
 
PR naukowy w sieci
PR naukowy w sieci PR naukowy w sieci
PR naukowy w sieci
 
Buzz Media - Social Media - WOMM
Buzz Media - Social Media - WOMMBuzz Media - Social Media - WOMM
Buzz Media - Social Media - WOMM
 
Wykorzystanie Social Media W Kreowaniu Wizerunku
Wykorzystanie  Social  Media W Kreowaniu WizerunkuWykorzystanie  Social  Media W Kreowaniu Wizerunku
Wykorzystanie Social Media W Kreowaniu Wizerunku
 
Nowoczesne narzędzia w relacjach z klientami
Nowoczesne narzędzia w relacjach z klientami Nowoczesne narzędzia w relacjach z klientami
Nowoczesne narzędzia w relacjach z klientami
 
Badanie zainteresowań w oparciu o Facebooka
Badanie zainteresowań w oparciu o FacebookaBadanie zainteresowań w oparciu o Facebooka
Badanie zainteresowań w oparciu o Facebooka
 
Komunikacja nieformalna a media społecznościowe
Komunikacja nieformalna a media społecznościoweKomunikacja nieformalna a media społecznościowe
Komunikacja nieformalna a media społecznościowe
 
Kompetencje social media managera
Kompetencje social media manageraKompetencje social media managera
Kompetencje social media managera
 
Dwa plemiona czy więcej?
Dwa plemiona czy więcej?Dwa plemiona czy więcej?
Dwa plemiona czy więcej?
 
”Pan wie o czym ja mówię” czyli wróżki i restauracje w social media marketing...
”Pan wie o czym ja mówię” czyli wróżki i restauracje w social media marketing...”Pan wie o czym ja mówię” czyli wróżki i restauracje w social media marketing...
”Pan wie o czym ja mówię” czyli wróżki i restauracje w social media marketing...
 
Badanie postrzegania marki w sieci
Badanie postrzegania marki w sieciBadanie postrzegania marki w sieci
Badanie postrzegania marki w sieci
 
Rzecz o pieprzeniu - Lead Nurtering, czyli jak z subskrybenta zrobić Klienta ...
Rzecz o pieprzeniu - Lead Nurtering, czyli jak z subskrybenta zrobić Klienta ...Rzecz o pieprzeniu - Lead Nurtering, czyli jak z subskrybenta zrobić Klienta ...
Rzecz o pieprzeniu - Lead Nurtering, czyli jak z subskrybenta zrobić Klienta ...
 
20 pieprzonych minut. Co social media zrobiły z informacją.
20 pieprzonych minut. Co social media zrobiły z informacją.20 pieprzonych minut. Co social media zrobiły z informacją.
20 pieprzonych minut. Co social media zrobiły z informacją.
 
Marka w internecie nie potrzebuje strony www
Marka w internecie nie potrzebuje strony wwwMarka w internecie nie potrzebuje strony www
Marka w internecie nie potrzebuje strony www
 
10 narzędzi dla marketerów, które wykorzystasz w codziennej pracy
10 narzędzi dla marketerów, które wykorzystasz w codziennej pracy 10 narzędzi dla marketerów, które wykorzystasz w codziennej pracy
10 narzędzi dla marketerów, które wykorzystasz w codziennej pracy
 
click community o social media marketingu
click community o social media marketinguclick community o social media marketingu
click community o social media marketingu
 
Social media manual 2010
Social media manual 2010Social media manual 2010
Social media manual 2010
 

Semelhante a [PL] Jak programować aby nie zwariować

Design principles 4 hackers - tech3camp (28142014)
Design principles 4 hackers - tech3camp (28142014)Design principles 4 hackers - tech3camp (28142014)
Design principles 4 hackers - tech3camp (28142014)
Jakub Marchwicki
 

Semelhante a [PL] Jak programować aby nie zwariować (20)

4Developers 2018: Unit testing - introduction (Marek Kawczyński)
4Developers 2018: Unit testing - introduction (Marek Kawczyński)4Developers 2018: Unit testing - introduction (Marek Kawczyński)
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
 
[PL] Jak programować aby nie zwariować?
[PL] Jak programować aby nie zwariować?[PL] Jak programować aby nie zwariować?
[PL] Jak programować aby nie zwariować?
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Getting Things Programmed
Getting Things ProgrammedGetting Things Programmed
Getting Things Programmed
 
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów Sparkowych
 
university day 1
university day 1university day 1
university day 1
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JS
 
Porażka nie wchodzi w grę, czyli o niezawodności
Porażka nie wchodzi w grę, czyli o niezawodnościPorażka nie wchodzi w grę, czyli o niezawodności
Porażka nie wchodzi w grę, czyli o niezawodności
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
 
PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]
 
Behat
BehatBehat
Behat
 
Design principles 4 hackers - tech3camp (28142014)
Design principles 4 hackers - tech3camp (28142014)Design principles 4 hackers - tech3camp (28142014)
Design principles 4 hackers - tech3camp (28142014)
 
Testowanie. Wprowadzenie do testowania oprogramowania.
Testowanie. Wprowadzenie do testowania oprogramowania. Testowanie. Wprowadzenie do testowania oprogramowania.
Testowanie. Wprowadzenie do testowania oprogramowania.
 
Mobile services
Mobile servicesMobile services
Mobile services
 
Tworzenie i utrzymywanie czystego kodu
Tworzenie i utrzymywanie czystego koduTworzenie i utrzymywanie czystego kodu
Tworzenie i utrzymywanie czystego kodu
 
Refaktoryzacja
RefaktoryzacjaRefaktoryzacja
Refaktoryzacja
 
Confitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ AllegroConfitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ Allegro
 
Architektura to nie bzdura
Architektura to nie bzduraArchitektura to nie bzdura
Architektura to nie bzdura
 

Mais de Jakub Marchwicki (6)

Test with Spock like the first officer
Test with Spock like the first officerTest with Spock like the first officer
Test with Spock like the first officer
 
JEE.next()
JEE.next()JEE.next()
JEE.next()
 
GeeCON 2013 - EJB application guided by tests
GeeCON 2013 - EJB application guided by testsGeeCON 2013 - EJB application guided by tests
GeeCON 2013 - EJB application guided by tests
 
GeeCON 2012 hurdle run through ejb testing
GeeCON 2012 hurdle run through ejb testingGeeCON 2012 hurdle run through ejb testing
GeeCON 2012 hurdle run through ejb testing
 
[PL] Metadane - dane o danych
[PL] Metadane - dane o danych[PL] Metadane - dane o danych
[PL] Metadane - dane o danych
 
[PL] O klasycznej, programistycznej elegancji
[PL] O klasycznej, programistycznej elegancji[PL] O klasycznej, programistycznej elegancji
[PL] O klasycznej, programistycznej elegancji
 

[PL] Jak programować aby nie zwariować

  • 1.
  • 2. Jak programować aby nie zwariować? Jakub Marchwicki 20.05.2013
  • 4. Co to za gość?
  • 5. Co ja tu robię?
  • 6. Co ja tu robię?
  • 7. Co ja tu robię?
  • 8. Co ja tu robię?ból
  • 9. Co ja tu robię?ból liczba slajdów
  • 10. Co ja tu robię?ból liczba slajdów OK Ryzyko utraty zdrowia 35 slajdów
  • 11. Co ja tu robię?ból liczba slajdów OK Ryzyko utraty zdrowia 148 slajdów
  • 12.
  • 14. Kiedy software jest dobry? Oprogramowanie musi działać Musi być na czas Musi być rozbudowywalne Modyfikowalne Musi mieć odpowiednią jakość Punkt wyjścia
  • 16. I po co to wszystko? Bo software to nasze hobby
  • 17. I po co to wszystko? Bo software to nasze hobby fach
  • 18. I po co to wszystko? Bo software to nasze hobby fach zawód
  • 19. I po co to wszystko? Bo software to nasze hobby fach zawód przyjemność
  • 20. I po co to wszystko? bo płacą nam za pisanie dokumentacji pisanie kodu to przyjemność
  • 21. Więc czym jest jakość Dla kogoś Dla siebie Dla kogo pracuje?
  • 22. Więc czym jest jakość Dla kogoś Dla siebie Dla kogo pracuje?
  • 23. „Jakość (jak piękno) jest sądem wartościującym, wyrażonym przez użytkownika. Jeśli nie ma takiego użytkownika – nie ma takiego sądu” Platon Więc czym jest jakość
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31. Więc czym jest jakość Dla kogoś Dla siebie Dla kogo pracuje?
  • 32. „Jakość to sposób myślenia, który powoduje, że stosuje się i bez przerwy poszukuje najlepszych rozwiązań” William Edwards Deming Więc czym jest jakość
  • 33. Jak programować aby nie zwariować?
  • 36. • Uczymy się… bez wnikania w kontekst  Nazywaj zmienne w taki a taki sposób  Stosuj komentarze w takich a nie innych przypadkach  Dziel funkcje na części zgodnie z takimi a takimi zasadami • Z czasem zobaczymy że z czystym kodem lepiej się pracuje… tak po ludzku
  • 37. Nasz mózg lepiej reaguje na czysty kod • Utrzymujemy koncentrację • Nie gubimy wątków, swobodniej podążamy tokiem myślenia • Cognitive load – możemy pomieścić poszczególne kawałki kodu w głowie więc potrafimy się miedzy nimi swobodnie przemieszczać
  • 38. • Nazwy • Funkcje • Komentarz • Formowanie kodu • Obiekty i struktury danych • Obsługa błędów Poziom I
  • 39. • Nazwy • Funkcje • Komentarz • Formatowanie kodu • Obiekty i struktury danych • Obsługa błędów Poziom I
  • 40. int d1; //dni od rozpoczęcia int d2; //dni do zakończenia int d3; //dni wolnych int daysSinceStart; int daysTillEnd; int daysOf; public List<int[]> getThem() { List<int[]> list1 = new ArrayList<int[]>(); for (int[] x : theList) if (x[0] == 4) list1.add(x); return list1; } public List<int[]> getDates() { List<int[]> dateList = new ArrayList<int[]>(); for (int[] week : theWeeksArray) if (week[0] == BEGIN_DATE) dateList.add(x); return dateList; }
  • 41. for (int i=0; i<10; i++){ k += ((l[i]*1.5) / 3 ); } float milleageRate; const int NUMER_OF_EMPLOYEE = 3; float sum = 0; for ( int i=0; i<numberOfTrips; i++ ){ float totalCompensation = tripLength[i] * milleageRate; float deduction = totalCompensation / NUMER_OF_EMPLOYEE; sum += deduction; }
  • 42. public class CsmrDt { public void crtshpcrt() {/*...*/}; public void remcrt() {/*...*/}; private final int ssntm = 10; /*...*/ } public class CustomerDataset { public void createShoppingCart() {/*...*/}; public void removeCart() {/*...*/}; private final int sessionTimeout = 10; /*...*/ }
  • 43. • Nazwy powinny sugerować co zwracają • Nazwy muszą mówić o całym zakresie funkcjonalności Metody String findLastNameOfCustomerWithId(long customerId){...} Map<Long, Customer> customers; Customer getCustomer(Long id){ Customer customer = customers.get(id); if(customer == null){ customer = createNewCustomer(id); } return customer; }
  • 44. • Nazwy • Funkcje • Komentarz • Formatowanie kodu • Obiekty i struktury danych • Obsługa błędów Poziom I
  • 45. • Zasada pierwsza: funkcje powinny być małe • Zasada druga: funkcje powinny być jeszcze mniejsze Funkcje
  • 46. Functions should do one thing. Should do it well Should do it only! Funkcje
  • 47.
  • 48.
  • 49. writeField(outputStream, name); outputStream.writeField(name); createSquare(width, height); calculateRectangularPrismVolume(double height, double width, double depth); calculateRectangularPrismVolume(Area rectangle, double depth);
  • 50. Funkcje DRY – Don’t repeat yourself • Duplikacja zmniejsza czytelność • Zwiększa koszty utrzymania, refactoringu i poprawiania błędów • Prowadzi do rozbieżności funkcjonalnej modułów wykonujących to samo • Zmniejsza reusability kodu
  • 51. • Nazwy • Funkcje • Komentarz • Formatowanie kodu • Obiekty i struktury danych • Obsługa błędów Poziom I
  • 53. Komentarze „Nie komentuj złego kodu – popraw go” Brian W. Kernighan i P.J. Plaugher
  • 54. //Sprawdzenie czy klient ma możliwość korzystania ze zniżki if (customer.isStudent() || (customer.age < 18) || (customer.age > 65)) if (customer.isEligibleForDiscount())
  • 55. „If you decide to write a comment, then spend the time necessary to make sure it is the best comment you can write” Robert C. Martin Komentarze
  • 56. • Nazwy • Funkcje • Komentarz • Formatowanie kodu • Obiekty i struktury danych • Obsługa błędów Poziom I
  • 57. Formatowanie • Konwencje formatowania w zespole. Ustal i się ich trzymaj
  • 58. • Nazwy • Funkcje • Komentarz • Formatowanie kodu • Obiekty i struktury danych • Obsługa błędów Poziom I
  • 59. • Prawo Demeter – zasada minimalnej wiedzy • Moduł powinien nie wiedzieć nic o wnętrzu obiektów, którymi manipuluje Prawo Demeter
  • 60. • Prawo Demeter głosi, że metoda f klasy C powinna wywoływać tylko metody z: • Klasy C, • Obiektu utworzonego przez f, • Obiektu przekazanego jako argument f, • Obiektu umieszczonego w zmiennej instancyjnej klasy C. Prawo Demeter
  • 61. • Możesz bawić się ze sobą • Możesz bawić się własnymi zabawkami (ale nie możesz ich rozbierać) • Możesz bawić się zabawkami które dostałeś • Możesz bawić się zabawkami które zrobiłeś samodzielnie Prawo Demeter
  • 62. final String outputDir = context.getOptions().getScratchDir().getAbsolutePath(); Options options = context.getOptions(); File scratchDir = options.getScratchDir(); final String outputDir = scratchDir.getAbsolutePath();
  • 63. • Nazwy • Funkcje • Komentarz • Formatowanie kodu • Obiekty i struktury danych • Obsługa błędów Poziom I
  • 65. • Wykorzystuj zgłaszanie wyjątków lub zwracanie obiektu specjalnego przypadku Zwracanie null List<Item> items = getItems(); if (items != null) { for (Item i : items) { totalCost += i.getCost(); } } List<Item> items = getItems(); for(Item i : items) { totalCost += i.getCost(); }
  • 66. public interface Animal { public void makeSound(); } public class Dog implements Animal { public void makeSound() { System.out.println("woof!"); } } public class NullAnimal implements Animal { public void makeSound() { } }
  • 67. • Przekazywanie null jest gorsze od jego zwracania Przekazywanie null public class MetricsCalculator { public double rectanglePerimeterCalculate( double x, double y) { return 2 * (y + x); } /* ... */ }
  • 68. • Defensive programming Przekazywanie null public class MetricsCalculator { public double rectanglePerimeterCalculate( double x, double y) { if (x == null || y == null) { throw InvalidArgumentException("Niewłaściwy argument."); } return 2 * (y + x); } } public class MetricsCalculator { public double rectanglePerimeterCalculate( double x, double y) { assert x != null : "x nie może być null"; assert y != null : "y nie może być null"; return 2 * (y + x); } }
  • 71. Poziom II - SOLIDny programista • The Single Responsibility Principle – klasa powinna mieć tylko jeden powód do zmiany • The Open Closed Principle – klasę można łatwo rozszerzać, nie modyfikując jej • The Liskov Substitution Principle – klasy pochodne muszą być przeźroczystymi zamiennikami klasy nadrzędnej
  • 72. • The Interface Segregation Principle – dla różnych klientów twórz osobne interfejsy • The Dependency Inversion Principle – bądź zależny od abstrakcji a nie od konkretnych implementacji SOLIDny programista
  • 73. To znaczy jaki? Kod obiektowy
  • 74. • Odpowiedzialność – tylko jedna  obiekty maja własną osobowość, unikaj schizofrenicznych obiektów • Enkapsulacja – to co się zmienia jest hermetyzowane • Preferencja kompozycji ponad dziedziczenie
  • 75. • Dokładanie ponad modyfikacje – Gdy dodajemy nową funkcjonalność raczej dokładamy nowe byty niż modyfikujemy istniejące. • Lokalne zmiany – Zmiana ma konsekwencje lokalne, a nie globalne. Zasięg rażenia zmian jest jak najmniejszy. • Nieinwazyjność zmian – Dodanie nowych rzeczy (odpowiedzialności, funkcjonalności, zachowań) do istniejących bytów jest przezroczyste ich dla klientów.
  • 76. public class Sql { public Sql(String table, Column[] columns) public String create() public String insert(Object[] fields) public String selectAll() public String fieldByKey( String keyColumn, String keyValue) private String ColumnList(Column[] columns) private String valuesList( Object[] fields, final Column[] columns) }
  • 77. abstract public class Sql { public Sql(String table, Column[] columns) abstract public String generate(); } public class CreateSql extends Sql { public CreateSql(String table, Column[] columns) @Override public String generate() } public class SelectSql extends Sql { public SelectSql(String table, Column[] columns) @Override public String generate() } public class InsertSql extends Sql { public InsertSql(String table, Column[] columns) @Override public String generate() private String valuesList(Object[] fields, final Column[] columns) } public class FindKeyBySql extends Sql { public FindKeyBySql(String table, Column[] columns, String keyColumn, String keyValue) @Override public String generate() } public class ColumnList { public ColumnList(Column[] columns) public String generate() }
  • 78. Odpowiedzialność. Enkapsulacja. Kompozycja • To co leży u podstaw możemy stosować na każdym poziomie • Projektując klasy • Projektując moduły, komponenty • Projektując systemy
  • 79. • Każdy wzorzec opisujemy w trzech kontekstach:  Odpowiedzialność  Enkapsulacja / hermetyzacja  Kompozycja Wzorce projektowe
  • 80. • Rozdziela i przesłania implementację zachowań, czynności. • Hermetyzujemy zmienny sposób tworzenia obiektów • Nowe funkcjonalności uzyskujemy poprzez dodawanie komend, poprzez kompozycję. Wzorce projektowe: komenda
  • 82. • Każdy element systemu:  Ma swoją odpowiedzialność  Hermetyzuje pewne zachowania  Składa się z kilku współpracujących elementów Moduły
  • 83. • Każdy framework opisujemy w trzech zdaniach:  Odpowiedzialność  Enkapsulacja  Preferowanie kompozycji Frameworki
  • 84. • Spring czy EJB Nie ma idealnych rozwiązań
  • 85. • Spring czy EJB • JSF czy JSP Nie ma idealnych rozwiązań
  • 86. • Spring czy EJB • JSF czy JSP czy Velocity Nie ma idealnych rozwiązań
  • 87. • Spring czy EJB • JSF czy JSP czy Velocity • JPA czy iBatis Nie ma idealnych rozwiązań
  • 88. • Spring czy EJB • JSF czy JSP czy Velocity • JPA czy iBatis czy JDBC Nie ma idealnych rozwiązań
  • 89. • Spring czy EJB • JSF czy JSP czy Velocity • JPA czy iBatis czy JDBC • MVC czy MVP Nie ma idealnych rozwiązań
  • 90. • Spring czy EJB • JSF czy JSP czy Velocity • JPA czy iBatis czy JDBC • MVC czy MVP • Java czy .NET Nie ma idealnych rozwiązań
  • 91. • Spring czy EJB • JSF czy JSP czy Velocity • JPA czy iBatis czy JDBC • MVC czy MVP • Java czy .NET czy Python Nie ma idealnych rozwiązań
  • 92. • Spring czy EJB • JSF czy JSP czy Velocity • JPA czy iBatis czy JDBC • MVC czy MVP • Java czy .NET czy Python czy PHP Nie ma idealnych rozwiązań
  • 93. Nie ma idealnych złoytych środków
  • 95.
  • 96. • Kod jest podstawowym medium komunikacji w projekcie • Kod to miejsce w którym spędzamy najwięcej czasu • Zły kod to jak solenie herbaty koledze z zespołu albo plucie do kanapki – a przecież nie jesteśmy złośliwi Wartości
  • 97. • Jako zespół jesteśmy jednością – Jak ja pójdę na skróty, to kolega będzie się męczył – I jako całość i tak będziemy nieefektywni Wartości
  • 98.
  • 99. • Programy są częściej czytane niż pisane • Więcej czasu poświęcamy na modyfikację istniejącego kodu niż na tworzenie nowego Implementation Patterns
  • 100.
  • 101. • Komunikacja – kod źródłowy powinno się czytać jak książkę • Prostota – wprowadzaj złożoność tylko wtedy, kiedy jest to konieczne • Elastyczność – elastyczność to dodatkowa złożoność, więc wprowadzaj ją tylko tam gdzie to konieczne Implementation patterns
  • 102. • Lokalne konsekwencje – zmiana w jednym miejscu nie powoduje zmian w innych • Minimalne powtórzenia – DRY Implementation patterns
  • 103. • Dane i logika razem – ponieważ dane i logika z reguły zmieniają się w tym samym czasie • Symetria – utrzymuj podobny poziom abstrakcji w obrębie metody / klasy Implementation patterns
  • 104. „Czysty kod jest prosty i bezpośredni. Czysty kod czyta się jak dobrze napisaną prozę. Czysty kod nigdy nie zaciemnia zamiarów projektanta; jest pełen trafnych abstrakcji i prostych ścieżek sterowania.” Grady Booch – to jeden z tych panów od UMLa
  • 105. Po co to wszystko?
  • 109. Affordance a quality of an object, which allows an individual to perform an action. For example, a knob affords twisting, and perhaps pushing, while a cord affords pulling
  • 110. public class Sql { public Sql(String table, Column[] columns) public String create() public String insert(Object[] fields) public String selectAll() public String fieldByKey( String keyColumn, String keyValue) private String ColumnList(Column[] columns) private String valuesList( Object[] fields, final Column[] columns) }
  • 111. abstract public class Sql { public Sql(String table, Column[] columns) abstract public String generate(); } public class CreateSql extends Sql { public CreateSql(String table, Column[] columns) @Override public String generate() } public class SelectSql extends Sql { public SelectSql(String table, Column[] columns) @Override public String generate() } public class InsertSql extends Sql { public InsertSql(String table, Column[] columns) @Override public String generate() private String valuesList(Object[] fields, final Column[] columns) } public class FindKeyBySql extends Sql { public FindKeyBySql(String table, Column[] columns, String keyColumn, String keyValue) @Override public String generate() } public class ColumnList { public ColumnList(Column[] columns) public String generate() }
  • 112. Po co to wszystko?
  • 114. By żyło się lepiej
  • 118. Porzucamy framework i robimy po staremu
  • 119. By w sytuacjach trudnych…
  • 120. … brniemy nie wiadomo gdzie …
  • 121. … mimo że cel był wyraźny
  • 144. Jak żyć? 2002 1996 / 2000 2002 1994