.net code: some ideas to improve yours

Post on 10-May-2015

360 views 1 download

Tags:

description

ThoughtWorks Café Ágil BH segunda edição

Transcript of .net code: some ideas to improve yours

.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!