Tim Steffens : Scala

JavaScala

(mutable!)

public class User {
    private String name;
    private List<Order> orders;

    public User() {
        orders = new ArrayList<Order>();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Order> getOrders() {
        return orders;
    }

    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }
}

public class Order {
    private int id;
    private List<Product> products;

    public Order() {
        products = new ArrayList<Product>();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }
}

public class Product {
    private int id;
    private String category;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }
}

(immutable!)

case class User (name: String, orders: List[Order] = Nil)
 
case class Order (id: Int, products: List[Product] = Nil)

case class Product (id: Int, category: String)

Initialisierung:

val user = User(name = "Tim",  orders= List(
	Order(id = 1, products = List(
		Product(id = 1, category="Tools")))))

Ändern (nur über Kopie!)

user.copy(name = "Timo")
  

Scala Pros & Cons

ProCon

(plus) Gut für's Unternehmen: weckt Interesse für ein breiteres Spektrum an Entwicklern

(plus) Nicht-Scala Entwickler werden gezwungen die Komfort-Zone zu verlassen - riesiger Lerneffekt, neue Perspektive

(plus) Spaß (smile)

(plus) Immutability (Collections, Objekte)

(plus) Sehr ausgereifter funktionaler Ansatz (map-reduce, mehr als zwei Parameter bei Funktions-Referenzen etc.)

(plus) Fehler durch mutability & Seiteneffekte werden vermieden, höhere Verständlichkeit

(plus) Man kann durch unterbinden von null-Zuweisungen NullpointerExceptions effektiv verhindern

(plus) (implizites) statisches Typsystem (compile-time checks)

(plus) wenig Boilerplate, sprechende Syntax (concise)

(info) Java-Code und Libs können natürlich uneingeschränkt verwendet werden (Vermischung möglich)

(plus) Non-Blocking I/O geschenkt (mit play)

(plus) Concurrency durch Aktoren (weniger Fehleranfällig als Standard-Threading in Java)

(plus) Scala console (repl) zum "ausprobieren" von code

(plus) Properties based Testing mit ScalaTest

(plus) Coole Sprachfeatures:

  • Case Klassen
  • Pattern Matching
  • einfaches Schreiben von DSLs
  • (sealed) Traits
  • for-comprehension
  • map & co auf Listen (nicht Streams!)
  • Etiher
  • Map-Syntax
  • Named parameters
  • Default Parameters
  • tuples
  • Currying

(minus) IDE Integration teilweise nicht optimal (allerdings: neuste SBT-Version und neueste IDEA Version funktionieren super zusammen)

(minus) Entwicklung erstmal etwas langsamer, da noch knowhow aufgebaut werden muss

(minus) etwas komplizierter als Java

(minus) ScalaTest & Specs2: compilefehler sind öfter mal schwer verständlich, Fehlermeldungen sind nicht so schön wie bei Spock

Scala Code

Übungen & Workshops

Basics: https://github.com/DarkToast/scala-workshop
Übersicht coole Features: tbd
Übungen: https://github.com/DarkToast/scala-dojo

Scala Days 2016