Parallel Keynote: 8 Lines of Code

1,311 views
1,005 views

Published on

Video and slides synchronized, mp3 and slide download available at URL http://bit.ly/14ExI0I.

Greg Young discusses eight lines of very common code finding in them massive numbers of dependencies and difficulties, looking for ways to get rid of them. Filmed at qconlondon.com.

Greg Young is an independent consultant and entrepreneur. He is always involved with many concurrent projects, currently these include building out a distributed event store and mighty moose (a continuous test runner). For periods of years Greg has been known to stop living anywhere and just travel. Twitter: @gregyoung

Published in: Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,311
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Parallel Keynote: 8 Lines of Code

  1. 1. 8  Lines  of  Code  Greg  Young  
  2. 2. InfoQ.com: News & Community Site• 750,000 unique visitors/month• Published in 4 languages (English, Chinese, Japanese and BrazilianPortuguese)• Post content from our QCon conferences• News 15-20 / week• Articles 3-4 / week• Presentations (videos) 12-15 / week• Interviews 2-3 / week• Books 1 / monthWatch the video with slidesynchronization on InfoQ.com!http://www.infoq.com/presentations/8-lines-code-refactoring
  3. 3. Presented at QCon Londonwww.qconlondon.comPurpose of QCon- to empower software development by facilitating the spread ofknowledge and innovationStrategy- practitioner-driven conference designed for YOU: influencers ofchange and innovation in your teams- speakers and topics driving the evolution and innovation- connecting and catalyzing the influencers and innovatorsHighlights- attended by more than 12,000 delegates since 2007- held in 9 cities worldwide
  4. 4. Simplicity  
  5. 5. I  am  stupid  to  work  otherwise.  Fancy  code  befuddles  me.  
  6. 6.  public  class  DeactivateInventoryItem    {          private  readonly  ItemRepository  repository;            public  DeactivateInventoryItem(ItemRepository  repository)          {                  this.repository  =  repository;          }            public  void  Deactivate(Guid  id,  string  reason)          {                  var  item  =  repository.GetById(id);                  item.Deactivate(reason);                  repository.Save(item);          }    }  
  7. 7.  [Transactional]    [RequiresPermission(“admin”)]    [Logged]    [EatsExceptions]    [DoesBadThingsWhenYouArentWatching]    public  class  DeactivateInventoryItem    {          private  readonly  ItemRepository  repository;            public  DeactivateInventoryItem(ItemRepository  repository)          {                  this.repository  =  repository;          }            public  void  Deactivate(Guid  id,  string  reason)          {                  var  item  =  repository.GetById(id);                  item.Deactivate(reason);          }    }  
  8. 8. Simplicity?  
  9. 9. <bean  id="moreComplexObject"  class="example.ComplexObject">    <!-­‐-­‐  results  in  a  setAdminEmails(java.uNl.ProperNes)  call  -­‐-­‐>    <property  name="adminEmails">        <props>            <prop  key="administrator">administrator@example.org</prop>            <prop  key="support">support@example.org</prop>            <prop  key="development">development@example.org</prop>        </props>    </property>    <!-­‐-­‐  results  in  a  setSomeList(java.uNl.List)  call  -­‐-­‐>    <property  name="someList">        <list>            <value>a  list  element  followed  by  a  reference</value>            <ref  bean="myDataSource"  />        </list>    </property>    <!-­‐-­‐  results  in  a  setSomeMap(java.uNl.Map)  call  -­‐-­‐>    <property  name="someMap">        <map>            <entry  key="an  entry"  value="just  some  string"/>            <entry  key  ="a  ref"  value-­‐ref="myDataSource"/>        </map>  
  10. 10.  [Transactional]    [RequiresPermission(“admin”)]    [Logged]    [EatsExceptions]    [DoesBadThingsWhenYouArentWatching]    public  class  DeactivateInventoryItem    {          private  readonly  ItemRepository  repository;            public  DeactivateInventoryItem(ItemRepository  repository)          {                  this.repository  =  repository;          }            public  void  Deactivate(Guid  id,  string  reason)          {                  var  item  =  repository.GetById(id);                  item.Deactivate(reason);          }    }  
  11. 11.  [Transactional]    [RequiresPermission(“admin”)]    [Logged]    [EatsExceptions]    [DoesBadThingsWhenYouArentWatching]    public  class  DeactivateInventoryItem    {          private  readonly  ItemRepository  repository;            public  DeactivateInventoryItem(ItemRepository  repository)          {                  this.repository  =  repository;          }            public  virtual  void  Deactivate(Guid  id,  string  reason)          {                  var  item  =  repository.GetById(id);                  item.Deactivate(reason);          }    }  
  12. 12.  public  object  Foo()    {            return  this;    }  
  13. 13. If  you  find  you  need  an  extension  to  your  ide  to  understand  what’s  going  on.  Its  probably  not  simple.  
  14. 14. What’s  the  root  of  the  problem?  
  15. 15.          public  void  Deactivate(Guid  id,  string  reason)          {                  var  item  =  repository.GetById(id);                  item.Deactivate();          }                public  void  Reactivate(Guid  id,  DateTime  effective,                                                          string  reason)          {                  var  item  =  repository.GetById(id);                  item.Deactivate();          }                public  void  CheckIn(Guid  id,  int  count)          {                  var  item  =  repository.GetById(id);                  item.Deactivate();          }      
  16. 16. No  common  interface!  
  17. 17.          public  void  Log(PointCut  calledOn)          {                  logger.Log(calledOn.Name  +  “:”  +  calledOn.Parameters);                }          
  18. 18.          public  void  Handle(DeactivateCommand  c)          {                  var  item  =  repository.GetById(c.id);                  item.Deactivate();          }                public  void  Handle(ReactivateCommand  c)          {                  var  item  =  repository.GetById(c.id);                  item.Reactivate();          }                public  void  Handle(CheckInCommand  c)          {                  var  item  =  repository.GetById(c.id);                  item.CheckIn(c.quantity);          }        
  19. 19.    interface  Handles<T>  where  T:Command    {            void  Handle(T  command);                  }        
  20. 20.  class  LoggingHandler<T>    :  Handles<T>  where  T:Command    {            private  readonly  Handles<T>  next;              public  LoggingHandler(Handles<T>  next)            {                    this.next  =  next;            }              public  void  Handle(T  command)            {                      myLoggingFramework.Log(command);                    next.Handle(command);            }    }            var  handler  =  new  LoggingHandler<DeactivateCommand>(                                              new  DeactivateCommandHandler(...)                                      );    
  21. 21.  public  class  DeactivateInventoryItem  :Handles<DeactivateCommand>    {            private  readonly  ItemRepository  repository;              public  DeactivateInventoryItem(ItemRepository  repository)                  {                          this.repository  =  repository;                  }                    public  void  Handle(DeactivateCommand  command)                  {                          var  item  =  repository.GetById(command.id);                          item.Deactivate(cmd.Reason);                          }          }  
  22. 22.  public  class  DeactivateInventoryItem  :Handles<DeactivateCommand>    {            private  readonly  ItemRepository  repository;              public  DeactivateInventoryItem(ItemRepository  repository)            {                          this.repository  =  repository;            }              public  void  Handle(DeactivateCommand  command)            {                          var  item  =  repository.GetById(command.id);                          item.Deactivate(cmd.Reason);                    }    }  
  23. 23.  class  Handlers    {        public  static  void  Handle(ItemRepository  repository,                                                            DeactivateCommand  c)        {                var  item  =  repository.GetById(c.id);                item.Deactivate();        }          public  static  void  Handle(ItemRepository  repository,                                                              ReactivateCommand  c)        {                var  item  =  repository.GetById(c.id);                item.Deactivate();        }          public  static  void  Handle(ItemRepository  repository,                                                              CheckInCommand  c)        {                var  item  =  repository.GetById(c.id);                item.Deactivate();        }  
  24. 24. Back  to  the  same  problem!  
  25. 25.  public  static  int  Add(int  a,  int  b)    {            return  a  +  b;    }    
  26. 26.  public  static  int  Add(int  a,  int  b)    {            return  a  +  b;    }                                                var  add5  =  x  =>  Add(5,  x);    
  27. 27.  public  static  void  Deactivate(ItemRepository  repository,                                                        DeactivateCommand  c)    {            var  item  =  repository.GetById(c.id);            item.Deactivate();    }                    
  28. 28.  public  static  void  Deactivate(ItemRepository  repository,                                                        DeactivateCommand  c)    {            var  item  =  repository.GetById(c.id);            item.Deactivate();    }                            var  nodepends  =  x  =>  Deactivate(new  ItemRepository(),  x);    
  29. 29.                void  BootStrap()    {          handlers.Add(x  =>  Deactivate(new  ItemRepository(),  x));          handlers.Add(x  =>  Reactivate(new  ItemRepository(),  x));          handlers.Add(x  =>  CheckIn(new  ItemRepository(),                                                                new  BarService(),                                                                x));    }  
  30. 30.                void  BootStrap()    {          handlers.Add(x  =>  Deactivate(()  =>  new  ItemRepository(),  x));          handlers.Add(x  =>  Reactivate(()  =>  new  ItemRepository(),  x));          handlers.Add(x  =>  CheckIn(()  =>  new  ItemRepository(),                                                                new  BarService(),                                                                x));    }  
  31. 31.                public  static  void  Log<T>(T  command,  Action<T>  next)          where  T:Command          {                  myLoggingFramework.Log(command);                  next(command);          }  
  32. 32.  class  LoggingHandler<T>    :  Handles<T>  where  T:Command    {            private  readonly  Handles<T>  next;              public  LoggingHandler(Handles<T>  next)            {                    this.next  =  next;            }              public  void  Handle(T  command)            {                      myLoggingFramework.Log(command);                    next.Handle(command);            }    }            var  handler  =  new  LoggingHandler<DeactivateCommand>(                                              new  DeactivateCommandHandler(...)                                      );    
  33. 33. <bean  id="moreComplexObject"  class="example.ComplexObject">    <!-­‐-­‐  results  in  a  setAdminEmails(java.uNl.ProperNes)  call  -­‐-­‐>    <property  name="adminEmails">        <props>            <prop  key="administrator">administrator@example.org</prop>            <prop  key="support">support@example.org</prop>            <prop  key="development">development@example.org</prop>        </props>    </property>    <!-­‐-­‐  results  in  a  setSomeList(java.uNl.List)  call  -­‐-­‐>    <property  name="someList">        <list>            <value>a  list  element  followed  by  a  reference</value>            <ref  bean="myDataSource"  />        </list>    </property>    <!-­‐-­‐  results  in  a  setSomeMap(java.uNl.Map)  call  -­‐-­‐>    <property  name="someMap">        <map>            <entry  key="an  entry"  value="just  some  string"/>            <entry  key  ="a  ref"  value-­‐ref="myDataSource"/>        </map>  
  34. 34.                public  static  void  Log<T>(T  command,  Action<T>  next)          where  T:Command          {                  myLoggingFramework.Log(command);                  next(command);          }  
  35. 35. Understand  the  problem  a  tool  or  idea  solves  well  
  36. 36. If  you  need  to  add  stuff  to  your  IDE  you  are  probably  on  the  wrong  path.  
  37. 37. You  own  all  code  in  your  project.          Your  boss  doesn’t  care  if  the  bug  happened  in  someone  else’s  library!  

×