Prezentacja
Statystyki
Głównym zadaniem tego tekstu jest ociekanie zajebistością gdyż w trakcie wczorajszego Iventu "Scala Day Workshop" wysiłkiem wielu osób (dedykowane podziękowania za chwilę) udało się zorganizować doskonały całodniowy warsztat Scali:
A zajebistość bierze się m.in. z :
RAZ : Przez cały dzień obok warsztatu działało profesjonalne przedszkole. Dzięki czemu w końcu ludzie, którym zawsze obowiązki rodzinne uniemożliwiały udział w tego typu wydarzeniach mogli dołączyć do nauki Scali! Tutaj szczególne podziekowania dla Marka Defecińskiego z JUGa i Lidii Wierzbickiej z GFT, którzy wspólnie zajęli się tematem
DWA : Warsztaty były poprowadzone przez polskiego Java Championa Jacka Laskowskiego. Było tam wszystko czego mogłyby oczekiwać osoby zaczynające swoją przygodę ze Scalą.
TRZY : Bardzo ważna rzecz! Przyszli chyba wszyscy zapisani! I to w słoneczną sobotę! Bardzo często zapomina się docenić ten element - ludzie, którzy chcą się uczyć!!! Jest nadzieja w ludzkości!!! A przecież mogli po prostu miło i bezproduktywnie spędzać czas, wrzucać fotki z tego procesu i prosić o lajki na fejsie, bez sensu, prosić o lajki, kto robi takie rzeczy... A właśnie! Pamiętajcie aby zalajkować i szerować ten artykuł i inne z JUGa!
CZTERY : Doskonała pogoda, przestronny balkon i pizza.
To było świetne smalltaki, netłorking i smaczne jedzenie w otoczeniu wiosennej bryzy. Gdy zamknęło się oczy i wyobraziło, że dźwięki samochodów gdzieś tam w oddali to szum fal - było prawie jak na plaży we Władysławowie...
Miejsca użyczyła oraz za sponsorowała przedszkole firma GFT
Co do konkretów to :
Mam dobrą wiadomość - będzie jeszcze więcej Scali,ooooooooojjjj będzie jej dużo dużo dużo więcej. Ale powinno być ciekawie i mam nadzieję opinie będę spójnie szły na tak.
Dobre komentarze są miłe, przyjemne i stanowią opium dla ego ale czasem nie są zbytnio rozwijające. Jak na razie najlepszy komentarz jaki miałem w życiu to był ten o tym, że pisanie długich kawałków kodu jest nudne dla publiki i teraz na prezentację przygotowuję sobie szablony.
W opiniach pojawiło się kilka ciekawych komentarzy z interesującymi obserwacjami :
Nie chcę mi się pisać wszystkiego linia po linii dlatego też skupię się na najważniejszych fragmentach koderskiego wywodu.
Do teog na tym blogu nie mamy chyba jeszcze żadnego formatera kodu także wrzucę linijki w zwykłe "pre"
Zauważyłem, że większość dyskusji o wyjątkach w świecie Javowym zakłada checked albo unchecked bez dopuszczenia trzeciej drogi (chyba, że ktoś walnie suchara z kodami błędu). Większość ludzi bardziej przychyla się do unchecked exceptions bo mniej jest z nimi prądu.
Ciekawszym wyzwaniem jest pokazanie wad wyjątków unchecked poprzez nawiązanie do pierwszego flejm WARa GOTO considered harmful considered harmful considered harmful
public static void main(String[] args) {
try {
System.out.println("linia1");
System.out.println("linia2");
System.out.println("linia3");
gotoLine6();
System.out.println("linia4");
System.out.println("linia5");
} catch (GoTo e) {
System.out.println("linia6");
}
}
private static void gotoLine6() {
System.out.println("goooooto line6");
throw new GoTo();
}
i wynik
linia1 linia2 linia3 goooooto line6 linia6
Do dalszych wywodów zainspirowała mnie jedna z prezentacji Erika Meijera gdzie przedstawił on setter i getter - teoretycznie mechanizmy znane i poniżane od wielu lat - z zupełnie innej perspektywy
i podobnie możemy sobie zanalizować błahą wydawało by się metodę
int metoda(int a,int b)
zaczęliśmy od Javy8 bo to bardzo dobry pomost pomiędzy Javą i Scalą.
W każdym razie mamy tę metodkę i co możemy o niej powiedzieć - no patrząc na typy przyjmuje dwa inty i też zwraca inta.
int metoda(int a,int b){
return a+b;
}
Na razie jest spoko :
int metoda(int a,int b){
return a-b;
}
Budujemy napięcie - na razie nie widać problemów
int metoda(int a,int b){
return a*b;
}
I teraz zaczynają się schody
int metoda(int a,int b){
return a/b;
}
Wsio się kompiluje a sam kompilator nic nie podkreśla
newWay.metoda(4, 2); // spoko newWay.metoda2(4, 0); //Exception in thread "main" java.lang.ArithmeticException: / by zero
No i dlaczego?!?! Przecież kompilator pokazuje wyraźnie, że zwraca inta. Czy ArithmeticException jest intem? Jeśli będziecie grali w pokera i powiecie, że wchodzicie za "ArithmeticException" to raczej nikt was nie zrozumie... Jeśli pani w sklepie alkoholowym zapyta ile macie lat - również zdanie "mam ArithmeticException lat" nie będzie miało sensu...
Jak odzyskać kontrolę nad typami i zaufanie kompilatora? Nie chce mi się wkleiać całego wywodu krok po kroku także ten tego :
Optional<Integer> metoda(int a,int b){
if(b!=0)
return Optional.of(a/b);
else
return Optional.empty();
}
Był też przykład domenowy
Repository r=new Repository();
//dane
Optional<Double> data = r.findUser("Roman")
//domain 1
.filter(DomainPolicy::isAllowed)
//domain 2
.map(u->u.getSalary())
.flatMap(FinancialService::calculateTax);
//ui
Optional<String> ui = data.map(t->"<h1>"+t+"</h1>");
System.out.println(ui.orElse("404 not found"));
(...)
static class FinancialService{
static Optional<Double> calculateTax(Integer amount){
if(amount!=0)
return Optional.of(amount*1.23/amount);
else
return Optional.empty();
}
}
static class DomainPolicy{
static boolean isAllowed(User u){
return u.getSalary() > 15;
}
}
Idea jest następująca :
case class User(name:String,salary:Int)
object Repository{
private val data=Map[String,User]("Roman"->User("Roman",20))
def findUSer(n:String)=data.get(n)
}
def calculateTax(amount:Int)=if(amount!=0) Some(amount+1.23/amount) else None
//> calculateTax: (amount: Int)Option[Double]
def domainPolicy(u:User)=u.salary>15 //> domainPolicy: (u: jug.wyjatki.NewWayWork.User)Boolean
Repository
.findUSer("Roman")
.filter(domainPolicy)
.map(_.salary)
.flatMap(calculateTax)
.map(t=>s"<h1>$t</h1>")
.getOrElse("404 not found") //> res3: String = <h1>20.0615</h1>
Ale czy Option podobnie jak checked exception nie brudzi nam API? Czy można jakoś ładnie dostosować dostosować "czysta metodę" do użycia Option tak poprostu - z automatu?
Przykład do własnego sprawdzenia : def lift[A,B](f:A=>B):Option[A]=>Option[B]=a=> a.map(f)
def metoda1(a: Int) = a + 1
val lifted1=lift(metoda1)
lifted1(Some(5))
Plus wersja z wzorcem "Job Security"
def lift[A,B](f:A=>B):Option[A]=>Option[B]=_ map f
A to dopiero początek - więcej ciekawych przykładów w książce :
No i na koniec fajnie by było gdyby więcej osób zaczęło coś przygotowywać. No i była jeszcze jedna opinia, że takie prezentacje około godziny są w sam raz. Ludzie przychodzą zmęczeni po pracy i w sumie trudno im wysiedzieć więcej.