Łatwe debugowanie i przeglądanie logów (LogEntries)
Problemy w kodzie
Zduplikowany kod
Ogromne klasy (God Class)
Ogromne metody
Bałagan w nazwach klas, metod, zmiennych
Spaghetti code
Problemy w kodzie
Nadużywanie callback'ów
Długie listy parametrów metod
Mixin'y w Ruby (sprzątanie pokoju)
Ignorowanie Law of Demeter (single dot)
Komentarze w kodzie (?)
JAK możemy sobie pomóc?
Truizmy?!
Opisowe i spójne nazewnictwo
Object Oriented Programming
Design Patterns
Znajomość podstawowych bibliotek (Array, Hash, String...)
Ekstrakcja nowych klas i metod (magiczny DRY)
Polimorfizm zamiast warunków w kodzie
Użycie strategi
JAK możemy sobie pomóc?
Użycie FormObjects (wiele modeli)
Użycie ServiceObjects
Użycie ValueObjects (Money, Temperature)
Użycie dekoratorów
Użycie fabryk obiektów (Factory)
Użycie prezenterów, adapterów (Api, widoki)
Zastąpienie callback'ów metodami
JAK możemy sobie pomóc?
SOLID
Single responsibility principle - Nigdy nie powinien istnieć więcej niż jeden powód do modyfikacji klasy
Open/closed principle - Przy zmianie wymagań nie powinien być zmieniany stary działający kod, ale dodawany nowy, który rozszerza zachowania.
Liskov substitution principle- Korzystanie z funkcji klasy bazowej musi być możliwe również w przypadku podstawienia instancji klas pochodnych.
JAK możemy sobie pomóc?
SOLID
Interface segregation principle - Klasy nie powinny zależeć od interfejsów, których nie używają.
Dependency inversion principle - Wysokopoziomowe moduły nie powinny zależeć od modułów niskopoziomowych - zależności między nimi powinny wynikać z abstrakcji / interfejsu.
wydajność
PROBLEMY
Legendarny brak wydajności ;)
Sam Ruby jest "wolny"
Duże zapotrzebowanie na RAM
Magia ActiveRecord sprzyja "dziwnym" rozwiązaniom
Nie wszystkie serwery webowe dla Rails są wydajne
co możemy zrobić?
Zastosowanie jRuby, Rubinius zamiast MRI
Caching, fragment caching
Pozbycie się wolnych zapytań do DB
Przesunięcie ciężaru w stronę bazy danych (views, materialized views)
Zastanowić się czy np. wyświetlanie 5000 rekordów na raz ma sens ;)
Ograniczenie użycia gemów
Użycie osobnego serwera do wyszukiwania pełnotekstowego (Solr, ElasticSearch, Algolia)