15. 15
En typisk Java-klass
public class Customer {
private String firstName;
private String lastName;
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getLastName() {
Return lastName;
}
/.../
}
16. 16
Motsvarande Ruby-klass
class Customer
attr_accessor :firstName, :lastName
end
17. 17
”Statisk typning ger brus”
final HashMap<String, String> capitals =
new HashMap<String,String>();
capitals.put(”Japan”, ”Tokyo”);
capitals.put(”Sweden”, ”Stockholm”);
capitals.put(”UK”, ”London”);
18. 18
Dynamisk typning
Variabler och fält har ingen typ
Exempel (Ruby):
product_number = ”VG-1296H”
product_number = 14
@parent = File.new(”C:”)
@parent = Dad.new(”Homer”, ”Simpson”)
19. 19
Dynamiska språk - metaprogrammering
Exempel från Ruby on Rails:
class Customer < ActiveRecord::Base
end
new_one = Customer.new
new_one.first_name = ”Homer”
new_one.last_name = ”Simpson”
20. 20
Öppna klasser
Också från Ruby on Rails:
due_date = 5.days_from_now
Hur är detta möjligt!?
class Fixnum
def days_from_now
/.../
end
end
22. 22
”Kan du bara lägga till en feature i den här koden...”
#:: ::-| ::-| .-. :||-:: 0-| .-| ::||-| .:|-. :||
open(Q,$0);while(<Q>){if(/^#(.*)$/){for(split('-',$1)){$q=0;for(split){s/|
/:.:/xg;s/:/../g;$Q=$_?length:$_;$q+=$q?$Q:$Q*20;}print chr($q);}}}print"n";
#.: ::||-| .||-| :|||-| ::||-| ||-:: :|||-| .:|
23. 23
Håller det i längden?
class Customer < ActiveRecord::Base
end
new_one = Customer.new
new_one. ?
24. 24
Groovy + Grails
class Customer {
String firstName
String lastName
Integer age
}
newOne = new Customer();
25. 25
Skillnader mot Ruby on Rails
Groovy är mycket mer likt Java
Groovy kan vara statiskt typat
Grails är mer explicit
Grails har betydligt bättre prestanda
27. 27
Fördelar med statisk typning
• Fel fångas i kompilatorn, inte i produktion...
• Lättare att orientera sig i okänd kod
• Lättare att bygga utvecklingsverktyg
• Bättre prestanda
32. 32
Exhibit 1
class Customer(var firstName: String, var lastName:
String, val birthDate: Date) {
override def toString() = firstName + ” ” + lastName
}
33. 33
Exhibit 1 – i Java
public class Customer {
private String firstName;
private String lastName:
private final Date birthDate;
public Customer(String firstName, String lastName,
Date birthDate) {
/.../
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
FORTSÄTTNING FÖLJER...
34. 34
Exhibit 1 – i Java (del 2)
public String getFirstName() {
return firstName;
}
public Date getBirthDate() {
return birthDate;
}
public String toString() {
Return firstName + ” ” + lastName;
}
/* getter och setter för lastName får inte plats */
}
35. 35
Exhibit 2
val books = List(”Coq Rouge”, ”Ulysses”, ”Papillon”,
”Pippi Långstrump”)
books.foreach(println)
val booksStartingWithP = books.filter(_.startsWith(”P”))
36. 36
Exhibit 2 – i Java
List<String> books = Arrays.asList(”Coq
Rouge”, ”Ulysses”, ”Papillon”, ”Pippi Långstrump”)
for (String book : books) {
System.out.println(book);
}
List<String> booksStartingWithP = new
ArrayList<String>();
for (String book : books) {
if (book.startsWith(”P”)) {
booksStartingWithP.add(book);
}
}
38. Scala – en hybrid
Scala är objektorienterat
och
funktionellt
39. 39
Varför är detta bra?
delat data
Funktioner förändrar inte tillstånd
Därför säkert att parallellisera dem
40. 40
Funktioner är värden
var stringMatches = (s: String) => s.startsWith(”P”)
if (stringMatches(”Palle”)) println(”matches”)
books.filter(stringMatches)
// anonym funktion
books.filter(_.startsWith(”P”))
41. Funktionell stil uppmuntras
val är det vanliga – var undantag
List, Set och Map normalt oföränderliga
Nästan allting returnerar ett värde!
42. 42
(Nästan) allting returnerar ett värde
val descriptionOfRational =
rational match {
case Rational(x, 1) => x.toString
case Rational(1, 2) => "one half"
case _ => rational.toString
}
println(if (age < 18) ”child” else ”adult”)
43. 43
Stolen with pride...
Actors – tämligen objektorienterat
API för parallella system
Skamlös stöld från Erlang
Bygger på meddelanden mellan virtuella processer