sobota, 12 stycznia 2013

Code Retreat Warszawa 2013

Swoj drugi w zyciu code retreat minął pomyślnie. Bylo ciekawie i owocnie. W odróżnieniu od pierwszego code retreat ktory skupiał sie na czystej Javie i TDD tym razem rozwijalismy aplikacje w Androidzie.
Od czasu kiedy uczylem się Androida i pisalem pierwsze aplikacje na tą platforme minęło kilka lat. Nic dziwnego ze w tym czasie wiele sie zmieniło w kwestii narządzi deweloperskich. Pomysł pokazania w jaki sposob Groovy moze zaistniec na tym polu przynajmniej dla mnie była trafiona.
Chłopaki z Polidea zrobili kawal dobrej roboty integrujac Roboelectric ze Spockframework z czego powstalo RoboSpock. Co więcej, przed spotkaniem przygotowali nawet startowy projekt. O ile Spockframework mialem okazje używać przy testowaniu aplikacji w Grails, zachwycony łatwością pisania testow, o tyle Roboelectric i buildy w Gradle byly dla mnie czyms zupelnie nowym.

Na poczatku mieliśmy trochę kłopotów z uruchomieniem projektu w IDE (Eclipse, Idea) ale wkrótce wiekszosci udało się to naprawić. W czasie sesji panowała zupełna dowolność. To para wybierała sobie temat - m.in. ćwiczenie TDD, nauka skrótów klawiszowych, kodowanie na kartce, ustalenie utrudnień (max 2 pola na klasę, max 4 linijki na metodę), testowanie widoków (Android View). W przerwie można było pograć w Quoridor.

Mnie udało się  w pierwszej sesji poćwiczyć TDD na zwykłym projekcie Javowym, potem powalczyłem z postawieniem projektu w Idei, następnie parę testów TDD w projekcie Androidowym.

Organizatorzy postawili nam również obiad, nie byle jaki ale składający się z pierwszego, drugiego dania i deseru :) Szacun dla nich.

Po obiedzie jeszcze parę sesji ale ogólny pęd do kodowania został trochę uśpiony (być może z powodu dobrego posiłku). W tej części poznałem bliżej roboguice i nauczyłem paru nowych skrótów klawiszowych w Idei. Dla szybszej nauki skrótów może być przydatny plugin Key Promoter  
(mousefeed to plugin dla Eclipse)
Niektóre przydatne skróty:

ctrl + j - wrzuć template kodu np. psvm rozwija domyślnie na public static void main (String[]args)...

ctrl + alt + N  - na metodzie zamienia wszystkie wywołania tego kodu ciałem metody i usuwa metodę
ctrl + alt + M - ekstrakt metody
ctrl + alt + V - ekstrakt zmiennej
ctrl + alt + F - ekstrakt pola
ctrl + alt + C - ekstrakt stałej
ctrl + alt + P - ekstrakt do paramertu metody

f2 - przenosi do najbliższego błędu kompilacji
alt + enter - autogenerate (metody lub przypisanie do zmiennej)
alt ~ - diff repo
ctrl + shift + 1 - podlinkowanie linii do 'ulubionych' pod pierwsza pozycja, analogicznie dla 2, 3..
ctrl +1 - skok do linku z ulubionych pod pierwszą pozycją
shift + f11 - wyświetlenie listy ulubionych
ctrl + q - wyświetla javadoc dla metody
ctrl + shift + f10 -  run projektu
shift + f9 - debug projektu
ctrl +  shift +strzałka góra/dół - przenoszenie linii kodu lub całej metody w dórę/dół pliku

Na koniec jedni się rozeszli a inni zostali jeszcze by kontynuować dyskusje przy browarze u Znajomych Znajomych ;)

A oto jak się skupiałem podczas jednej z sesji :D

środa, 2 stycznia 2013

Grails - klasa domenowa tylko do odczytu

Grails domyślnie nie wspiera oznaczenia klasy domenowej jako tylko do odczyty, tzn. tak żeby dynamiczne metody 'find' (find, get, list..) działały OK ale zapis, edycja encji nie była możliwa. Opcja taka jest szczególnie przydatna przy pracy z legacy bazami danych. Możemy jednak małym nakładem pracy zapewnić podobną funkcjonalność samemu. Udało mi się znaleźć przynajmniej 2 sposoby:

1. listenery beforeXXX w klasie domenowej np.:

class Demo {

    static constraints = {
    }
    String name

    transient beforeUpdate = {
        throw new RuntimeException('update not allowed')
    }
}

2. zwracanie kodu błędu z kontrolera dla niedozwolonych metod, np.:


    def delete(Long id) {
        response.sendError(405)
    }

Natomiast jeśli chcemy tylko wyłączyć z edycji w widoku wygenerowanym ze scaffoldingu jakieś pole klasy domenowe dostępna jest opcja w constrains:

class Demo {

    static constraints = {
         name(editable: false)
    }
    String name
}