28
Clean Code w Ruby czyli kod musi być CZYSTY! © Rafał "RaVbaker" Piekarski LRUG 3.07.2012

Clean code w Ruby

Embed Size (px)

DESCRIPTION

Czysty kod w Ruby. Prezentacja na LRUG 3.07.2012.

Citation preview

Page 1: Clean code w Ruby

Clean Code w Ruby czyli kod musi być CZYSTY!

© Rafał "RaVbaker" PiekarskiLRUG 3.07.2012

Page 2: Clean code w Ruby

Kim jestem?

• programista od 8 lat

• znam Ruby/Rails od ponad 5 lat - WorkingWithRails

• ostatnio pracowałem w porównywarce Nokaut.pl

• github: ravbaker

• twitter: @ravbaker

Page 3: Clean code w Ruby

Skąd ten cały szum?

Page 4: Clean code w Ruby

Co to jest czysty kod?

• prosty

• elegancki

• wydajny

• czytelny

• bez powtórzeń (DRY)

• łatwy w rozbudowie

• jak dobrze napisana proza

Page 5: Clean code w Ruby

Zgadzacie się?

Page 6: Clean code w Ruby

Dlaczego warto?

Page 7: Clean code w Ruby

Agenda

• zasada skautów

• znaczące nazwy

• funkcje

• komentarze

• formatowanie

• obiekty i struktury danych

• obsługa błędów

• testy jednostkowe

• klasy

• systemy

Page 8: Clean code w Ruby

Zostaw kod czystszym niż go zastałeś.

Page 9: Clean code w Ruby

Znaczące nazwy

Page 10: Clean code w Ruby

• jeśli nazwa wymaga komenarza nie jest dobrą nazwą: d, af_objects, the_list, a2

• unikaj dezinformacji: controller_for_efficient_handling_of_strings vs. controller_for_efficient_storage_of_strings

• tworzenie nazw które można wymówić: time_ymdhis

• rzeczowniki (lub wyrażenia rzeczownikowe) dla klas i czasowniki (lub wyrażenia czasownikowe) dla metod: AddressParser, Manager, Processor delete_page, save, wait_until

• nie dodawać nadmiarowego kontekstu: LSBAccountAddress

Page 11: Clean code w Ruby

• Celem jest aby opowiadały historię systemu

• Podstawową regułą jest aby były małe - mieściły się na jednym (małym) ekranie

• Powinny robić jedną rzecz!

• Zasada zstępująca i nie mieszanie poziomów abstrakcji

• Nie powtarzaj się! (DRY)

Funkcje

Page 12: Clean code w Ruby

• Nazwy opisowe i wyjaśniające co się dzieje z argumentami: include_teardown_page() check_password(user_name, password)

• Idealna liczba argumentów to... "zero"

• Więcej niż 3 argumenty nie powinno być nigdy używane

• Argumenty-flagi są okropne: render(is_suite) lepiej render_for_suite() i render_for_single_test()

• Unikaj efektów ubocznych

Page 13: Clean code w Ruby

Nie komentuj złego kodu - popraw go.Brian w. Kernighan i P. J. Plaugher

Komentarze

Page 14: Clean code w Ruby

Dobre komentarze Złe komentarze

Publiczne API zamknięcia bloków i tagów

wyjaśnienie zamierzeń zakomentowany kod

ostrzeżenia przed konsekwencjami nadmiarowe komentarze

prawdziwe listy TODOkomentarze niepublicznych

metod

znaczniki pozycji:# #### Action #####

Page 15: Clean code w Ruby

• nie używaj komentarza kiedy możesz to wyjaśnić kodem: x = 10 # assigns number 10 to variable x

• komentarze nie naprawią złego kodu

• licz się z tym, że komentarze mogą zawierać kłamstwa

• celem komentarzy jest wyjaśnić kod, który nie wyjaśnia się sam

Page 16: Clean code w Ruby

Bądź konsekwentny!

Formatowanie

Page 17: Clean code w Ruby

Obiekty i struktury danych

Page 18: Clean code w Ruby

Prawo demeter

• C

• obiektu utworzonego przez f()

• obiektu przekazanego jako argument do f()

• obiektu umieszczonego w zmiennej instancyjnej klasy C

głosi, że metoda f() klasy C powinna wywoływać tylko metody z:

Page 19: Clean code w Ruby

ActiveRecord

• to struktura danych!

• do zasad biznesowych powinny być tworzone osobne obiekty!

Page 20: Clean code w Ruby

Obsługa błędów

Page 21: Clean code w Ruby

• wyjątki zamiast kodów powrotu

• osobne klasy wyjątków dla różnych potrzeb

• nie zwracamy nil

• nie przekazujemy nil

Page 22: Clean code w Ruby

Testowanie

Page 23: Clean code w Ruby

• testy i kod produkcyjny pisany razem!

• staraj się aby testy były czytelne

• testy są tak samo ważne jak kod produkcyjny

• pamiętaj, mając testy łatwiej refaktorować

• jedna asercja lub koncept na test *

Page 24: Clean code w Ruby

• Szybkie (Fast)

• Niezależne (Independent)

• Powtarzalne (Repeatable)

• Samokontrolujące się (Self-Validating)

• O czasie (Timely)

zasada F.I.R.S.T.

Page 25: Clean code w Ruby

Klasy

• Powinny być małe!

• SRP - Zasada pojedyńczej odpowiedzialności

• Organizuj zmiany

Page 26: Clean code w Ruby

Systemy

• separowanie (rozcięcie) problemów

• DCI - Data Context Interaction

• DSL - Domain-specific language