net code: some ideas to improve yours

109
.net code some ideas to improve yours Carlos Lopes @carlosaml ThoughtWorks

Upload: carlos-lopes

Post on 10-May-2015

360 views

Category:

Documents


1 download

DESCRIPTION

ThoughtWorks Café Ágil BH segunda edição

TRANSCRIPT

Page 1: net code: some ideas to improve yours

.net  code  some  ideas  to  improve  yours  

Carlos  Lopes  @carlosaml  

ThoughtWorks  

Page 2: net code: some ideas to improve yours

code  

Page 3: net code: some ideas to improve yours

your  code  MATTERS  

Page 4: net code: some ideas to improve yours

so  how  can  you  write  be@er  code?  

Page 5: net code: some ideas to improve yours

and  so  on  

Page 6: net code: some ideas to improve yours

.net  

Page 7: net code: some ideas to improve yours

C#  

Page 8: net code: some ideas to improve yours

stuff  like  that  

Page 9: net code: some ideas to improve yours

ok  

Page 10: net code: some ideas to improve yours

               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;                  }  

Page 11: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortRevisited(IEnumerable<int>  numbers)  {        var  evens  =  numbers.Where(i  =>  i  %  2  ==  0).ToList();          evens.Sort();          return  evens;  }  

Page 12: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortStrikingBack(IEnumerable<int>  numbers)  {          return  numbers                    .Where(i  =>  i  %  2  ==  0)                    .OrderBy(i  =>  i);  }  

Page 13: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortEvenBe@er(IEnumerable<int>  numbers)  {          return  from  n  in  numbers                      where  n  %  2  ==  0                      orderby  n                      select  n;  }  

Page 14: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortYetAgain(IEnumerable<int>  numbers)  {              return  from  n  in  numbers                          where  n.IsEven()                          orderby  n                          select  n;  }  

Page 15: net code: some ideas to improve yours

wait  

Page 16: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortYetAgain(IEnumerable<int>  numbers)  {              return  from  n  in  numbers                          where  n.IsEven()                          orderby  n                          select  n;  }  

Page 17: net code: some ideas to improve yours

 public  staWc  class  MyExtensions    {                  public  staWc  bool  IsEven(this  int  number)                  {                          return  number  %  2  ==  0;                  }    }  

Page 18: net code: some ideas to improve yours

we’ll  come  back  to  this  

Page 19: net code: some ideas to improve yours

               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;                  }  

Page 20: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortYetAgain(IEnumerable<int>  numbers)  {              return  from  n  in  numbers                          where  n.IsEven()                          orderby  n                          select  n;  }  

Page 21: net code: some ideas to improve yours

so  what?  

Page 22: net code: some ideas to improve yours

“Any  fool  can  write  code  that  a  computer  can  understand.  

Good  programmers  write  code  that  humans  can  understand.”  

Mar;n  Fowler  

Page 23: net code: some ideas to improve yours
Page 24: net code: some ideas to improve yours

Robert  C.  Mar;n  

Page 25: net code: some ideas to improve yours

fast,  slow,  slower  rhythm  

Page 26: net code: some ideas to improve yours

Kerievsky’s  5.0  syndrome  

Page 27: net code: some ideas to improve yours

release  1.0  is  quickly  delivered  

Page 28: net code: some ideas to improve yours

release  2.0  is  delivered  

Page 29: net code: some ideas to improve yours

but  the  junky  code  slows  you  down  

Page 30: net code: some ideas to improve yours

then  you  go  slower  and  slower  

Page 31: net code: some ideas to improve yours

mysterious  bugs  

Page 32: net code: some ideas to improve yours

demoWvaWon  

Page 33: net code: some ideas to improve yours

etc  

Page 34: net code: some ideas to improve yours

and  around  release  4.0  …  

Page 35: net code: some ideas to improve yours

complete  rewrite!  

Page 36: net code: some ideas to improve yours

5.0  !!!  

Page 37: net code: some ideas to improve yours

-­‐-­‐-­‐-­‐-­‐  -­‐-­‐-­‐-­‐-­‐  -­‐-­‐-­‐-­‐-­‐  

Page 38: net code: some ideas to improve yours

less  code  

Page 39: net code: some ideas to improve yours

less  bugs  

Page 40: net code: some ideas to improve yours

“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  

Page 41: net code: some ideas to improve yours

“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  

Page 42: net code: some ideas to improve yours

coming  back  

Page 43: net code: some ideas to improve yours

funcWonal  programming  

Page 44: net code: some ideas to improve yours

“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”  

Page 45: net code: some ideas to improve yours

F#,  ok  

Page 46: net code: some ideas to improve yours

but  

Page 47: net code: some ideas to improve yours

C#  ?!?!  

Page 48: net code: some ideas to improve yours

C#  is  an  imperaWve  language,  dude  

Page 49: net code: some ideas to improve yours

agreed  

Page 50: net code: some ideas to improve yours

but  

Page 51: net code: some ideas to improve yours

how  about  mixing  paradigms?  

Page 52: net code: some ideas to improve yours

again,  …  

Page 53: net code: some ideas to improve yours

less  code  

Page 54: net code: some ideas to improve yours

less  bugs  

Page 55: net code: some ideas to improve yours

-­‐-­‐-­‐-­‐-­‐  -­‐-­‐-­‐-­‐-­‐  -­‐-­‐-­‐-­‐-­‐  

Page 56: net code: some ideas to improve yours

expressiveness  

Page 57: net code: some ideas to improve yours

say  what  

Page 58: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortYetAgain(IEnumerable<int>  numbers)  {              return  from  n  in  numbers                          where  n.IsEven()                          orderby  n                          select  n;  }  

Page 59: net code: some ideas to improve yours

not  how  

Page 60: net code: some ideas to improve yours

               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;                  }  

Page 61: net code: some ideas to improve yours

ok  

Page 62: net code: some ideas to improve yours

what  else?  

Page 63: net code: some ideas to improve yours

funcWons  are  kind  of  a  big  deal  

Page 64: net code: some ideas to improve yours

principle  of  least  surprise  

Page 65: net code: some ideas to improve yours

immutability  

Page 66: net code: some ideas to improve yours

no  side-­‐effects  

Page 67: net code: some ideas to improve yours

lazy  evaluaWon  

Page 68: net code: some ideas to improve yours

higher-­‐order  funcWons  

Page 69: net code: some ideas to improve yours

etc  

Page 70: net code: some ideas to improve yours

but  how?  

Page 71: net code: some ideas to improve yours

extension  methods  

Page 72: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortYetAgain(IEnumerable<int>  numbers)  {              return  from  n  in  numbers                          where  n.IsEven()                          orderby  n                          select  n;  }  

Page 73: net code: some ideas to improve yours

 public  staWc  class  MyExtensions    {                  public  staWc  bool  IsEven(this  int  number)                  {                          return  number  %  2  ==  0;                  }    }  

Page 74: net code: some ideas to improve yours

 public  staWc  class  MyExtensions    {                  public  staWc  bool  IsEven(this  int  number)                  {                          return  number  %  2  ==  0;                  }    }  

Page 75: net code: some ideas to improve yours

LINQ  

Page 76: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortStrikingBack(IEnumerable<int>  numbers)  {          return  numbers                    .Where(i  =>  i  %  2  ==  0)                    .OrderBy(i  =>  i);  }  

Page 77: net code: some ideas to improve yours

a  nice  way  to  query  stuff  

Page 78: net code: some ideas to improve yours

series  of  extension  methods  

Page 79: net code: some ideas to improve yours

Select()  Skip()  Take()  

OrderBy()  GroupBy()  Where()  

 …  

Page 80: net code: some ideas to improve yours

+  

Page 81: net code: some ideas to improve yours

syntacWc  sugar  

Page 82: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortStrikingBack(IEnumerable<int>  numbers)  {          return  numbers                    .Where(i  =>  i  %  2  ==  0)                    .OrderBy(i  =>  i);  }  

Page 83: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortEvenBe@er(IEnumerable<int>  numbers)  {          return  from  n  in  numbers                      where  n  %  2  ==  0                      orderby  n                      select  n;  }  

Page 84: net code: some ideas to improve yours

laziness  

Page 85: net code: some ideas to improve yours

iterators  

Page 86: net code: some ideas to improve yours

               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;                          }                  }  

Page 87: net code: some ideas to improve yours

               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;                          }                  }  

Page 88: net code: some ideas to improve yours

               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;                          }                  }  

Page 89: net code: some ideas to improve yours

watch  out:    

performance  side  effects  

…  

Page 90: net code: some ideas to improve yours

lambdas  

Page 91: net code: some ideas to improve yours

IEnumerable<int>  FilterAndSortStrikingBack(IEnumerable<int>  numbers)  {          return  numbers                    .Where(i  =>  i  %  2  ==  0)                    .OrderBy(i  =>  i);  }  

Page 92: net code: some ideas to improve yours

syntacWc  sugar  

Page 93: net code: some ideas to improve yours

anonymous  methods  

Page 94: net code: some ideas to improve yours

               IEnumerable<int>  FilterAndSortStrikingBackAgain                                    (IEnumerable<int>  numbers)                  {                          return  numbers.Where(delegate(int  number)  {  return  number%2  ==  0;  });                  }  

Page 95: net code: some ideas to improve yours

delegates  

Page 96: net code: some ideas to improve yours

funcWon  pointers  

Page 97: net code: some ideas to improve yours

pass  funcWons  around  

Page 98: net code: some ideas to improve yours

-­‐-­‐-­‐-­‐-­‐  -­‐-­‐-­‐-­‐-­‐  -­‐-­‐-­‐-­‐-­‐  

Page 99: net code: some ideas to improve yours

one  more  thing  

Page 100: net code: some ideas to improve yours

don’t  forget  OO  

Page 101: net code: some ideas to improve yours

you  might  be  tempted  

Page 102: net code: some ideas to improve yours

order.Items.Select(item  =>  item.Price).Max();  

Page 103: net code: some ideas to improve yours

(from  item  in  order.Items  select  item.Price).Max();  

Page 104: net code: some ideas to improve yours

duplicaWon  

Page 105: net code: some ideas to improve yours

encapsulaWon  

Page 106: net code: some ideas to improve yours

all  right  

Page 107: net code: some ideas to improve yours

that’s  about  it  for  today  I  guess  

Page 108: net code: some ideas to improve yours

quesWons?  

Page 109: net code: some ideas to improve yours

thank  you!