1. WHY LEARN NEW
PROGRAMMING LANGUAGES?
What I’ve learned from Ruby and Scheme that
applies to my daily work in C# and JavaScript
Trondheim XP Meetup
Jonas Follesø, Scientist/Manager BEKK Trondheim
08/02/2012
8. ABSTRACTIONS THROUGH FUNCTIONS 8
(define (sum-int a b)
(if (> a b)
0
(+ a (sum-int (+ a 1) b))))
(define (sum-cubes a b)
(if (> a b)
0
(+ (cube a) (sum-cubes (+ a 1) b))))
9. ABSTRACTIONS THROUGH FUNCTIONS 9
(define (sum-int a b)
(if (> a b)
0
(+ a (sum-int (+ a 1) b))))
(define (sum-cubes a b)
(if (> a b)
0
(+ (cube a) (sum-cubes (+ a 1) b))))
11. ABSTRACTIONS THROUGH FUNCTIONS 11
(define (sum term a next b)
(if (> a b)
0
(+ (term a) (sum term (next a) next b))))
(define (inc n) (+ n 1))
(define (identity n) n)
(define (sum-int a b) (sum identity a inc b))
(define (sum-cubes a b) (sum cube a inc b))
(sum-int 0 10) ; outputs 55
(sum-cubes 0 10) ; outputs 3025
12. ABSTRACTIONS THROUGH FUNCTIONS 12
(define (sum term a next b)
(if (> a b)
0
(+ (term a) (sum term (next a) next b))))
(define (inc n) (+ n 1))
(define (identity n) n)
(define (sum-int a b) (sum identity a inc b))
(define (sum-cubes a b) (sum cube a inc b))
(sum-int 0 10) ; outputs 55
(sum-cubes 0 10) ; outputs 3025
13. ABSTRACTIONS THROUGH FUNCTIONS - JAVASCRIPT 13
$("li").click(function() {
$(this).css({'color':'yellow'});
});
$("li").filter(function(index) {
return index % 3 == 2;
}).css({'color':'red'});
$.get("/some-content", function(data) {
// update page with data...
});
14. ABSTRACTIONS THROUGH FUNCTIONS – C# 14
SumEvenCubes(1, 10); // outputs 1800
public int SumEvenCubes() {
var num = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
return num
.Where(IsEven)
.Select(Cube)
.Aggregate(Sum);
}
public bool IsEven(int n) { return n % 2 == 0; }
public int Cube(int n) { return n*n*n; }
public int Sum(int a, int b) { return a + b; }
17. OBJECTS FROM CLOSURES IN JAVASCRIPT 17
var make_account = function (balance) {
var withdraw = function (amount) {
if (balance >= amount) balance -= amount;
else throw "Insufficient funds";
return balance;
};
var deposit = function (amount) {
balance += amount;
return balance;
};
return {
withdraw: withdraw,
deposit: deposit
};
};
var account1 = make_account(100);
account1.withdraw(50);
account1.deposit(25); // outputs 75
18. READABILITY 18
Extreme emphasis
on expressiveness
19. READABILITY 19
“[…] we need to focus on humans, on how
humans care about doing programming or
operating the application of the machines.
We are the masters. They are the slaves…”
20. EXAMPLES OF RUBY IDIOMS 20
abort unless str.include? "OK"
x = x * 2 until x > 100
3.times { puts "olleh" }
10.days_ago
2.minutes + 30.seconds
1.upto(100) do |i|
puts i
end
21. EXAMPLE OF RSPEC TEST 21
describe Bowling do
it "should score 0 for gutter game" do
bowling = Bowling.new
20.times { bowling.hit(0) }
bowling.score.should == 0
end
end
22. C# UNIT TEST INFLUENCED BY RSPEC 22
public class Bowling_specs {
public void Should_score_0_for_gutter_game() {
var bowling = new Bowling();
20.Times(() => bowling.Hit(0));
bowling.Score.Should().Be(0);
}
}
public static class IntExtensions {
public static void Times(this int times, Action action) {
for (int i = 0; i <= times; ++i)
action();
}
}
23. C# FLUENT ASSERTIONS 23
string actual = "ABCDEFGHI";
actual.Should().StartWith("AB")
.And.EndWith("HI")
.And.Contain("EF")
.And.HaveLength(9);
IEnumerable collection = new[] { 1, 2, 3 };
collection.Should().HaveCount(4, "we put three items in collection"))
collection.Should().Contain(i => i > 0);
24. READABILITY 24
Internal DSLs and
Fluent Interfaces
27. C# LINQ EXAMPLE 27
static void Main(string[] args)
{
var people = new[] {
new Person { Age=28, Name = "Jonas Follesø"},
new Person { Age=25, Name = "Per Persen"},
new Person { Age=55, Name = "Ole Hansen"},
new Person { Age=40, Name = "Arne Asbjørnsen"},
};
var old = from p in people
where p.Age > 25
orderby p.Name ascending
select p;
foreach(var p in old) Console.WriteLine(p.Name);
}
---
Arne Asbjørnsen
Jonas Follesø
Ole Hansen
28. C# STORYQ EXAMPLE 28
[Test]
public void Gutter_game()
{
new Story("Score calculation")
.InOrderTo("Know my performance")
.AsA("Player")
.IWant("The system to calculate my total score")
.WithScenario("Gutter game")
.Given(ANewBowlingGame)
.When(AllOfMyBallsAreLandingInTheGutter)
.Then(MyTotalScoreShouldBe, 0)
.WithScenario("All strikes")
.Given(ANewBowlingGame)
.When(AllOfMyBallsAreStrikes)
.Then(MyTotalScoreShouldBe, 300)
.ExecuteWithReport(MethodBase.GetCurrentMethod());
}
29. C# OBJECT BUILDER PATTERN 29
[Test]
public void Should_generate_shipping_statement_for_order()
{
Order order = Build
.AnOrder()
.ForCustomer(Build.ACustomer())
.WithLine("Some product", quantity: 1)
.WithLine("Some other product", quantity: 2);
var orderProcessing = new OrderProcessing();
orderProcessing.ProcessOrder(order);
}
32. C# DYNAMIC AND EXPANDO OBJECT 32
static void Main(string[] args)
{
dynamic person = new ExpandoObject();
person.Name = "Jonas Follesø";
person.Age = 28;
Console.WriteLine("{0} ({1})", person.Name, person.Age);
}
Jonas Follesø (28)
33. C# MONKEY PATCHING 33
public class DynamicRequest : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder,
out object result)
{
string key = binder.Name;
result = HttpContext.Current.Request[key] ?? "";
return true;
}
}
@using MvcApplication1.Controllers
@{
Page.Request = new DynamicRequest();
}
<h4>Hello @Page.Request.Name</h4>
<h4>Hello @HttpContext.Current.Request["Name"]</h4>
34. C# MICRO ORMS 34
• Afrer C# 4.0 with support for dynamic typing a whole new
category of micro ORMs has emerged:
• Massive
• Simple.Data
• Peta Pico
• Dapper
35. C# MICRO ORMS 35
IEnumerable<User> u = db.Users.FindAllByName("Bob").Cast<User>();
db.Users.FindByNameAndPassword(name, password)
// SELECT * FROM Users WHERE Name = @p1 and Password = @p2
db.Users.FindAllByJoinDate("2010-01-01".to("2010-12-31"))
// SELECT * FROM [Users] WHERE [Users].[JoinDate] <= @p1
36. SAPIR–WHORF HYPOTHESIS 36
The principle of linguistic relativity holds that
the structure of a language affects the ways in
which its speakers are able to conceptualize their
world, i.e. their world view.
http://en.wikipedia.org/wiki/Linguistic_relativity