View
360
Download
1
Category
Tags:
Preview:
DESCRIPTION
ThoughtWorks Café Ágil BH segunda edição
Citation preview
.net code some ideas to improve yours
Carlos Lopes @carlosaml
ThoughtWorks
code
your code MATTERS
so how can you write be@er code?
and so on
.net
C#
stuff like that
ok
IEnumerable<int> FilterAndSort(IEnumerable<int> numbers) { var evens = new List<int>(); foreach (var i in numbers) { if (i % 2 == 0) { evens.Add(i); } } evens.Sort(); return evens; }
IEnumerable<int> FilterAndSortRevisited(IEnumerable<int> numbers) { var evens = numbers.Where(i => i % 2 == 0).ToList(); evens.Sort(); return evens; }
IEnumerable<int> FilterAndSortStrikingBack(IEnumerable<int> numbers) { return numbers .Where(i => i % 2 == 0) .OrderBy(i => i); }
IEnumerable<int> FilterAndSortEvenBe@er(IEnumerable<int> numbers) { return from n in numbers where n % 2 == 0 orderby n select n; }
IEnumerable<int> FilterAndSortYetAgain(IEnumerable<int> numbers) { return from n in numbers where n.IsEven() orderby n select n; }
wait
IEnumerable<int> FilterAndSortYetAgain(IEnumerable<int> numbers) { return from n in numbers where n.IsEven() orderby n select n; }
public staWc class MyExtensions { public staWc bool IsEven(this int number) { return number % 2 == 0; } }
we’ll come back to this
IEnumerable<int> FilterAndSort(IEnumerable<int> numbers) { var evens = new List<int>(); foreach (var i in numbers) { if (i % 2 == 0) { evens.Add(i); } } evens.Sort(); return evens; }
IEnumerable<int> FilterAndSortYetAgain(IEnumerable<int> numbers) { return from n in numbers where n.IsEven() orderby n select n; }
so what?
“Any fool can write code that a computer can understand.
Good programmers write code that humans can understand.”
Mar;n Fowler
Robert C. Mar;n
fast, slow, slower rhythm
Kerievsky’s 5.0 syndrome
release 1.0 is quickly delivered
release 2.0 is delivered
but the junky code slows you down
then you go slower and slower
mysterious bugs
demoWvaWon
etc
and around release 4.0 …
complete rewrite!
5.0 !!!
-‐-‐-‐-‐-‐ -‐-‐-‐-‐-‐ -‐-‐-‐-‐-‐
less code
less bugs
“If you love wri;ng code -‐-‐ really, truly love to write code -‐-‐ you'll love it enough to write as liEle of it as
possible.”
Jeff Atwood
“Code is bad. It rots. It requires periodic maintenance. It has bugs that need to be found. New features mean
old code has to be adapted.”
Rich Skrenta
coming back
funcWonal programming
“Typically the main func;on is defined in terms of other func;ons, which in turn are defined in terms of s;ll more func;ons, un;l at the boEom level the func;ons are language primi;ves.”
John Hughes – “Why Func;onal Programming MaEers”
F#, ok
but
C# ?!?!
C# is an imperaWve language, dude
agreed
but
how about mixing paradigms?
again, …
less code
less bugs
-‐-‐-‐-‐-‐ -‐-‐-‐-‐-‐ -‐-‐-‐-‐-‐
expressiveness
say what
IEnumerable<int> FilterAndSortYetAgain(IEnumerable<int> numbers) { return from n in numbers where n.IsEven() orderby n select n; }
not how
IEnumerable<int> FilterAndSort(IEnumerable<int> numbers) { var evens = new List<int>(); foreach (var i in numbers) { if (i % 2 == 0) { evens.Add(i); } } evens.Sort(); return evens; }
ok
what else?
funcWons are kind of a big deal
principle of least surprise
immutability
no side-‐effects
lazy evaluaWon
higher-‐order funcWons
etc
but how?
extension methods
IEnumerable<int> FilterAndSortYetAgain(IEnumerable<int> numbers) { return from n in numbers where n.IsEven() orderby n select n; }
public staWc class MyExtensions { public staWc bool IsEven(this int number) { return number % 2 == 0; } }
public staWc class MyExtensions { public staWc bool IsEven(this int number) { return number % 2 == 0; } }
LINQ
IEnumerable<int> FilterAndSortStrikingBack(IEnumerable<int> numbers) { return numbers .Where(i => i % 2 == 0) .OrderBy(i => i); }
a nice way to query stuff
series of extension methods
Select() Skip() Take()
OrderBy() GroupBy() Where()
…
+
syntacWc sugar
IEnumerable<int> FilterAndSortStrikingBack(IEnumerable<int> numbers) { return numbers .Where(i => i % 2 == 0) .OrderBy(i => i); }
IEnumerable<int> FilterAndSortEvenBe@er(IEnumerable<int> numbers) { return from n in numbers where n % 2 == 0 orderby n select n; }
laziness
iterators
IEnumerable<int> Fibonacci() { yield return 0; yield return 1; var previous = 0; var current = 1; while (true) { var next = previous + current; yield return next; previous = current; current = next; } }
IEnumerable<int> Fibonacci() { yield return 0; yield return 1; var previous = 0; var current = 1; while (true) { var next = previous + current; yield return next; previous = current; current = next; } }
IEnumerable<int> Fibonacci() { yield return 0; yield return 1; var previous = 0; var current = 1; while (true) { var next = previous + current; yield return next; previous = current; current = next; } }
watch out:
performance side effects
…
lambdas
IEnumerable<int> FilterAndSortStrikingBack(IEnumerable<int> numbers) { return numbers .Where(i => i % 2 == 0) .OrderBy(i => i); }
syntacWc sugar
anonymous methods
IEnumerable<int> FilterAndSortStrikingBackAgain (IEnumerable<int> numbers) { return numbers.Where(delegate(int number) { return number%2 == 0; }); }
delegates
funcWon pointers
pass funcWons around
-‐-‐-‐-‐-‐ -‐-‐-‐-‐-‐ -‐-‐-‐-‐-‐
one more thing
don’t forget OO
you might be tempted
order.Items.Select(item => item.Price).Max();
(from item in order.Items select item.Price).Max();
duplicaWon
encapsulaWon
all right
that’s about it for today I guess
quesWons?
thank you!
Recommended