Professional Refactoring
International PHP Conference 2009
Spring Edition




                                    Mayflower...
• Senior Developer / Team Lead at
  Mayflower GmbH
 • Reporting and Rating Apps
 • QA and PHP 5 Migration
   consultings
• ...
Who are you?

 • What are you doing?
 • What‘s your team size?
 • Using MVC?
 • Who‘s using Continous Integration?
   • PH...
Your projects...
• What‘s your average project lifetime?
• Is there PHP code more than 5 years old?
• How many lines of co...
What is Refactoring?


 „Refactoring is a disciplined technique for
 restructuring an existing body of code, altering
 its...
Why especially PHP?

                      (c) www.medrehab.com




        Code Aging!
                                  ...
A PHP Project in 2000 ...
• no coding standards, no PHPDoc
• no MVC, no Design Patterns
• if you were lucky, someone used ...
... because it worked!



                     Mayflower GmbH 2009   8
In the year 2009
• change requests get more and
  more expensive
• the bug rate is always
  increasing
• the development t...
Management point of view

Costs per Change Request



                           rising frequency




                    ...
Start refactoring now!
                    Mayflower GmbH 2009   11
But hey, stop!
                 Mayflower GmbH 2009   12
Don‘t refactor ...
• weeks before a
  important release
• only with a lot of junior
  developers
• parallel with
  develop...
Before starting refactoring

• define a coding standard
 • avoids spaghetti code
 • speeds up maintainability
 • improves p...
During the refactoring...
       • stay calm
       • take a lot of good developers and
         a bunch of juniors
      ...
About Unittests
• Testing is essential during refactoring
• Problems
  • most of old code isn‘t
    „unittestable“
  • API...
(c) BMW AG




             Okay, let‘s start!
                              Mayflower GmbH 2009   17
Back to Martin Fowler


 „Refactoring is a disciplined technique for
 restructuring an existing body of code, altering
 it...
Forms of refactoring

•Renaming
•Extraction
•Changing signature
•Pull up / Pull down

                       Mayflower GmbH...
Renaming

     /**
       * Remove a word from the stop word dictionary
       *
       * @param integer $id
       *
    ...
Renaming

     /**
       * Remove a word from the stop word dictionary
       *
       * @param integer $stopword_id ID o...
Restructuring

      /**
        * Remove a word from the stop word dictionary
        *
        * @param integer $stopwor...
Restructuring
   /**
     * Remove a word from the stop word dictionary
     *
     * @param integer $stopword_id ID of th...
Extraction
   /**
     * Remove a word from the stop word dictionary
     *
     * @param integer $stopword_id ID of the s...
Extraction


   public function remove($stopword_id)
   {
       $delete = sprintf(quot;DELETE FROM %s WHERE id = %d AND l...
Changing signature
   /**
     * Remove a word from the stop word dictionary
     *
     * @param integer $id ID of the st...
Changing signature
   /**
     * Remove a word from the stop word dictionary
     *
     * @param integer $stopword_id ID ...
Pull up / Pull down




            x



                      Mayflower GmbH 2009   28
Pull up / Pull down




            x



                      Mayflower GmbH 2009   29
Pull up / Pull down




           x


       x       x



                      Mayflower GmbH 2009   30
Tips & Tricks
• Always add PHPDoc if it‘s missing
• Never trust automatic refactoring of IDEs
• Don‘t do refactoring for f...
Any questions?   Mayflower GmbH 2009   32
Thank you very much for your attention!



  Thorsten Rinne
  Mayflower GmbH
  Mannhardtstraße 6
  D-80538 München
  +49 (0...
Upcoming SlideShare
Loading in …5
×

Professional Refactoring

3,536 views

Published on

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

No Downloads
Views
Total views
3,536
On SlideShare
0
From Embeds
0
Number of Embeds
490
Actions
Shares
0
Downloads
125
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide

Professional Refactoring

  1. 1. Professional Refactoring International PHP Conference 2009 Spring Edition Mayflower GmbH 2009 1
  2. 2. • Senior Developer / Team Lead at Mayflower GmbH • Reporting and Rating Apps • QA and PHP 5 Migration consultings • PHP since 1999 (3.0.16) • phpMyFAQ since 2001 Mayflower GmbH 2009 2
  3. 3. Who are you? • What are you doing? • What‘s your team size? • Using MVC? • Who‘s using Continous Integration? • PHPUnit? • 80% code coverage? Mayflower GmbH 2009 3
  4. 4. Your projects... • What‘s your average project lifetime? • Is there PHP code more than 5 years old? • How many lines of code? • How many change requests per year? • Has there been a specification? • Were all features in the first release as specified? Mayflower GmbH 2009 4
  5. 5. What is Refactoring? „Refactoring is a disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior.“ -Martin Fowler, www.refactoring.com Mayflower GmbH 2009 5
  6. 6. Why especially PHP? (c) www.medrehab.com Code Aging! Mayflower GmbH 2009 6
  7. 7. A PHP Project in 2000 ... • no coding standards, no PHPDoc • no MVC, no Design Patterns • if you were lucky, someone used a template system • nobody cared about XSS or CSRF a lot of changes in business logics • never got refactored, documentated or even tested ... Mayflower GmbH 2009 7
  8. 8. ... because it worked! Mayflower GmbH 2009 8
  9. 9. In the year 2009 • change requests get more and more expensive • the bug rate is always increasing • the development team motivation is decreasing • requirement changes are almost impossible • new team members need a lot of time to be productive Mayflower GmbH 2009 9
  10. 10. Management point of view Costs per Change Request rising frequency Dead end! Benefit per Change Request Mayflower GmbH 2009 10
  11. 11. Start refactoring now! Mayflower GmbH 2009 11
  12. 12. But hey, stop! Mayflower GmbH 2009 12
  13. 13. Don‘t refactor ... • weeks before a important release • only with a lot of junior developers • parallel with development tasks Mayflower GmbH 2009 13
  14. 14. Before starting refactoring • define a coding standard • avoids spaghetti code • speeds up maintainability • improves productivity • fix your API specs • complete your documentation Mayflower GmbH 2009 14
  15. 15. During the refactoring... • stay calm • take a lot of good developers and a bunch of juniors • write tests, tests, tests • don‘t let developer refactor their own code • don‘t let junior developers refactor alone Mayflower GmbH 2009 15
  16. 16. About Unittests • Testing is essential during refactoring • Problems • most of old code isn‘t „unittestable“ • API breaks during refacotoring • Solution • Selenium tests instead • iterative refactoring Mayflower GmbH 2009 16
  17. 17. (c) BMW AG Okay, let‘s start! Mayflower GmbH 2009 17
  18. 18. Back to Martin Fowler „Refactoring is a disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior.“ -Martin Fowler, www.refactoring.com Mayflower GmbH 2009 18
  19. 19. Forms of refactoring •Renaming •Extraction •Changing signature •Pull up / Pull down Mayflower GmbH 2009 19
  20. 20. Renaming /** * Remove a word from the stop word dictionary * * @param integer $id * * @return void */ public function remove($id) { $sql = sprintf(quot;DELETE FROM $this->tablename WHERE id = %d AND lang = '%s'quot;, $id, $this->language); $this->db->query($sql); } Mayflower GmbH 2009 20
  21. 21. Renaming /** * Remove a word from the stop word dictionary * * @param integer $stopword_id ID of the stop word * * @return void */ public function remove($stopword_id) { $delete = sprintf(quot;DELETE FROM $this->tablename WHERE id = %d AND lang = '%s'quot;, $stopword_id, $this->language); $this->db->query($delete); } Mayflower GmbH 2009 21
  22. 22. Restructuring /** * Remove a word from the stop word dictionary * * @param integer $stopword_id ID of the stop word * * @return void */ public function remove($stopword_id) { $delete = sprintf(quot;DELETE FROM $this->tablename WHERE id = %d AND lang = '%s'quot;, $stopword_id, $this->language); $this->db->query($delete); } Mayflower GmbH 2009 22
  23. 23. Restructuring /** * Remove a word from the stop word dictionary * * @param integer $stopword_id ID of the stop word * * @return void */ public function remove($stopword_id) { $delete = sprintf(quot;DELETE FROM %s WHERE id = %d AND lang = '%s'quot;, $this->tablename, $stopword_id, $this->language); $this->db->query($delete); } Mayflower GmbH 2009 23
  24. 24. Extraction /** * Remove a word from the stop word dictionary * * @param integer $stopword_id ID of the stop word * * @return void */ public function remove($stopword_id) { $delete = sprintf(quot;DELETE FROM %s WHERE id = %d AND lang = '%s'quot;, $this->tablename, $stopword_id, $this->language); $this->db->query($delete); } Mayflower GmbH 2009 24
  25. 25. Extraction public function remove($stopword_id) { $delete = sprintf(quot;DELETE FROM %s WHERE id = %d AND lang = '%s'quot;, $this->tablename, $stopword_id, $this->language); $this->_execute($delete); } private function _execute($query) { return $this->db->query($query) } Mayflower GmbH 2009 25
  26. 26. Changing signature /** * Remove a word from the stop word dictionary * * @param integer $id ID of the stop word * * @return void */ public function remove($stopword_id) { $delete = sprintf(quot;DELETE FROM %s WHERE id = %d AND lang = '%s'quot;, $this->tablename, $stopword_id, $this->language); $this->db->query($delete); } Mayflower GmbH 2009 26
  27. 27. Changing signature /** * Remove a word from the stop word dictionary * * @param integer $stopword_id ID of the stop word * @param boolean $logging Log removal? Default: false * * @return void */ public function remove($stopword_id, $logging = false) { $delete = sprintf(quot;DELETE FROM %s WHERE id = %d AND lang = '%s'quot;, $this->tablename, $stopword_id, $this->language); if ($logging) { $this->_logAction('removal', $stopword_id); } $this->db->query($delete); } Mayflower GmbH 2009 27
  28. 28. Pull up / Pull down x Mayflower GmbH 2009 28
  29. 29. Pull up / Pull down x Mayflower GmbH 2009 29
  30. 30. Pull up / Pull down x x x Mayflower GmbH 2009 30
  31. 31. Tips & Tricks • Always add PHPDoc if it‘s missing • Never trust automatic refactoring of IDEs • Don‘t do refactoring for fun • Write as much unittests as possible Mayflower GmbH 2009 31
  32. 32. Any questions? Mayflower GmbH 2009 32
  33. 33. Thank you very much for your attention! Thorsten Rinne Mayflower GmbH Mannhardtstraße 6 D-80538 München +49 (0) 89 24 20 54 - 31 thorsten.rinne@mayflower.de Mayflower GmbH 2009 33

×