Professional Refactoring

Post on 12-Jan-2015

5.022 views 2 download

description

 

Transcript of Professional Refactoring

Mayflower GmbH 2009

Professional RefactoringInternational PHP Conference 2009Spring Edition

1

Mayflower GmbH 2009

• 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

2

Mayflower GmbH 2009

Who are you?

• What are you doing?• What‘s your team size?• Using MVC?• Who‘s using Continous Integration?

• PHPUnit?• 80% code coverage?

3

Mayflower GmbH 2009

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?

4

Mayflower GmbH 2009

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

5

Mayflower GmbH 2009

Why especially PHP?

Code Aging!6

(c) www.medrehab.com

Mayflower GmbH 2009

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

7

Mayflower GmbH 2009

... because it worked!

8

Mayflower GmbH 2009

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

9

Mayflower GmbH 2009

Management point of view

10

rising frequency

Dead end!

Benefit per Change Request

Costs per Change Request

Mayflower GmbH 2009

Start refactoring now!11

Mayflower GmbH 2009

But hey, stop!

12

Mayflower GmbH 2009

Don‘t refactor ...

13

• weeks before a important release

• only with a lot of junior developers

• parallel with development tasks

Mayflower GmbH 2009

Before starting refactoring

14

• define a coding standard• avoids spaghetti code• speeds up maintainability• improves productivity

• fix your API specs• complete your documentation

Mayflower GmbH 2009

During the refactoring...

15

• 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

About Unittests

16

• 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

Okay, let‘s start!17

(c) BMW AG

Mayflower GmbH 2009

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

18

Mayflower GmbH 2009

Forms of refactoring

19

•Renaming

•Extraction

•Changing signature

•Pull up / Pull down

Mayflower GmbH 2009

Renaming

20

/** * Remove a word from the stop word dictionary * * @param integer $id * * @return void */ public function remove($id) { $sql = sprintf("DELETE FROM $this->tablename WHERE id = %d AND lang = '%s'", $id, $this->language); $this->db->query($sql); }

Mayflower GmbH 2009

Renaming

21

/** * 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("DELETE FROM $this->tablename WHERE id = %d AND lang = '%s'", $stopword_id, $this->language); $this->db->query($delete); }

Mayflower GmbH 2009

Restructuring

22

/** * 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("DELETE FROM $this->tablename WHERE id = %d AND lang = '%s'", $stopword_id, $this->language); $this->db->query($delete); }

Mayflower GmbH 2009

Restructuring

23

/** * 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("DELETE FROM %s WHERE id = %d AND lang = '%s'", $this->tablename, $stopword_id, $this->language); $this->db->query($delete); }

Mayflower GmbH 2009

Extraction

24

/** * 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("DELETE FROM %s WHERE id = %d AND lang = '%s'", $this->tablename, $stopword_id, $this->language); $this->db->query($delete); }

Mayflower GmbH 2009

Extraction

25

public function remove($stopword_id) { $delete = sprintf("DELETE FROM %s WHERE id = %d AND lang = '%s'", $this->tablename, $stopword_id, $this->language); $this->_execute($delete); }

private function _execute($query) { return $this->db->query($query) }

Mayflower GmbH 2009

Changing signature

26

/** * 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("DELETE FROM %s WHERE id = %d AND lang = '%s'", $this->tablename, $stopword_id, $this->language); $this->db->query($delete); }

Mayflower GmbH 2009

Changing signature

27

/** * 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("DELETE FROM %s WHERE id = %d AND lang = '%s'", $this->tablename, $stopword_id, $this->language); if ($logging) { $this->_logAction('removal', $stopword_id); } $this->db->query($delete); }

Mayflower GmbH 2009

Pull up / Pull down

28

x

Mayflower GmbH 2009

Pull up / Pull down

29

x

Mayflower GmbH 2009

Pull up / Pull down

30

xx

x

Mayflower GmbH 2009

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

31

Mayflower GmbH 2009 32

Any questions?

Mayflower GmbH 2009

Thank you very much for your attention!

Thorsten RinneMayflower GmbHMannhardtstraße 6D-80538 München+49 (0) 89 24 20 54 - 31thorsten.rinne@mayflower.de

33