Slide 1

Slide 1 text

DealingWith DuplicatedCode Duplicated Duplicated BulgariaWebSummit April 2014 Duplicated

Slide 2

Slide 2 text

Evaldo Junior @InFog9 evaldojunior.com #brazil #germany #php #linux #opensource

Slide 3

Slide 3 text

BambergGermany We'reHiring!

Slide 4

Slide 4 text

DéjàVu i. jBBZ2i .kBB: ,BBBBBBUi iFBBBBB BBZMMBBBBBZMBBBB88EBP ,BGNE0GZMMBBMG8EZqZBr ;B00NEqE0ZNGNEN0q0N8MZ7. BMZNEqENENEqEqZNZNEEOBBBBME0ZMMEGF5U15J7L7L7vLS25Uq0ZMBMBMBMBBBBBBBBBBBBBMBZPuLi, iB80ZNEN0qEqENEN0qZNENZE8OBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMBBBMMMMOMOM8M8MMBMBBBBBBBBBEU;. iBZZqENENEqEqZNZN0NEqENENE0ZNZ0G0GEG0Z0GEZEGEZ0ZEG0G0ZNZ0Z0Z0Z0ZNE0EqENENZ0ZNZEZEOGMMBBBBBGU, ;BONEq0N0NZNENENENENEqEN0qZNENEqEqZNEqENENZNEqEqENZqENEqZNEq0NEqZq0NENEq0NENZNENEqZ0Z0GZOOBBBBG7. B8GNEqENENENENENENEqZqZN0qZNENENZNENENEN0NEN0NZNENZNZNZNZqENZqZqZNEqEN0qENENENZNEqZqEqENZ0ZZMBBBM; XBZEN0q0qZqZNZNENEqENEN0NENZNEqENZNENEqEqEqEqZNENENZqEN0NENEqZNENENENENENEqENZNEqZqENENEq0NZNZZMBBB2 BBGZN0NENGEO8G0ZNENEqENENZNEqZqENEq0NZNZqEN0NENEqENEqZNEqZqZN0qZqEqENENENEq0NENZNENZqENENENEN8BBBBBB1 BBM8Z8OBBBBBBM0EqEqEqENZN0NENENENENENEN0NENEqENENEqEqENEN0q0qENENZNEN0NENENEqENZNENEqEqZN0NOMv5BBBBBBL 2BBBBBMU: ;BOEEqEq0q0qEq0NEqENZqENENEqZNEq0qENENENZqENEN0qENZqZN0NENZNZNEq0NZqEN0NEq0qENGM8 .YBBBBO rvi YBO0ENEqENEN0N0N0NZqZNEqEqEqENENEqENZqENEq0qENENENEqENENZqENEqENZqZNEqENEN0N00BU 7BBBB: BBGNENEqZqEN0NENZqEqENZNENEN0NEN0qENEN0NENENENENEqZqENZN0q0NENENENZNEqEqEN0qGB7 XBBBi .BB8NEq0qZNEN0NZNZqEqZNENEqENEqENENEqENENEqENEqZNZqENENEqEN0NEqENENEqZNZN0N00Bi ;BBBY ;BBBEGNEEGNEN0NEN0N0NZNENENENEq0N0NEqENZq0NZNENENZqENENENZN0qENENEqZNZNEqENGBU .BBBj FBBBM88FGNENENZqENENENENENEq0NEqENENENEqENEN0NEqEN0NENENEqEqZqEqZNZNZqEqENBq BBBY rMBBrUGEN0NZNEqEN0NENEN0qENENEqEqENENENEN0qZNEq0NEN0NEq0N0qZNEqENENEN0NZOB BBBY :EYB8NZNENENZNZN0N0NZqENZ0ZNENENENZNEN0NENEqENENZNENEqENEqEN0NEN0NEN0q8B; BBBv BOEq0q0N0NENENENENZ0OOMZ8Z80ZEZ0Z0ENENENENENEqEN0NEqENENENEqZNEqENEEBM .BBBr qBNEqENEqENEqZNENGMBBBBBBBBBBBBBBBBBO8EZ0ZqENZNENEqEqENENEq0qENENENZZBr :BBBi MOZNENENZNE0ENENGBB: ,:7YS52LSqMBBBBBBOG0EqENENENENEqE0ENEN0NENENGMB vBBB: SB8NEq0qGZBMGNEqZMB .:7XBB8NZNEqENENENEN8O80ZqZN0NEqGBB 2BBB: ;BO0ZNENGMBq2BGN00B7 kBM0ZqEN0N0NEN8BMBBG80EN0N008BG XBBB ,BBEEqZEMBB7 BOE0OB 8BMEENENEqENGB7 :MBBBOO0ENE08BBj qBB BBEEqEEBBS NB0EOB FBBZZN0NENEEB .2MBBBBMZG08MBB qB NBZZNEEBBi 7BGNB0 ;BBGZ00NZN8B. :jMBBBBZG8B. S 7BGZNE0BB. .BZZB0 OBGZN0qEEBL :UBBMOBU .BOGNZEMB, BM0Bq 2B8ZNENZMB iBBMB BBG0ZZBBj BMGB8 vBZENE0MB: BBB1 OB8EOMBBi XBEBP YB0E08BB :BMB kBMGBBB7 FBMB: JBZ0OBB, BBBi SBM8BBr :BBBN YBMZBBX BMB2 i:rYBBMMBJ OBBBBBB, MBMMBB, BBBE BBBBBBBBBr 5BBBZj : ,5BBBBBY 7BBBBBL YSNM8BMB5 iBBBBBBBBBB1 1BBBB2 7BBBBBBBO;

Slide 5

Slide 5 text

Wikipedia Duplicate code is a computer programming term for a sequence of source code that occurs more than once, either within a program or across different programs owned or maintained by the same entity.

Slide 6

Slide 6 text

CodeSmells #1

Slide 7

Slide 7 text

DRY Don't Repeat Yourself

Slide 8

Slide 8 text

WET We Enjoy Typing Write Everything Twice

Slide 9

Slide 9 text

Duplication is not only “DuplicatedCode”

Slide 10

Slide 10 text

Why do we duplicate?

Slide 11

Slide 11 text

Why? Copy/Paste is easy ctrl+c / ctrl+v

Slide 12

Slide 12 text

Why? In a hurry to deliver You know, it's for yesterday!

Slide 13

Slide 13 text

Why? Lack of codebase knowledge - Hm, I didn't know our codebase had this already.

Slide 14

Slide 14 text

Duplication's Problems

Slide 15

Slide 15 text

Problems Increase codebase's size Five thousand lines' controllers.

Slide 16

Slide 16 text

Problems Fix the same bug more than once - Ok, now it works in that page, but not in this one.

Slide 17

Slide 17 text

Problems Adding not standard new features - Why are the dates not formated using my preference?

Slide 18

Slide 18 text

Is duplication always a bad thing?

Slide 19

Slide 19 text

Example of duplication

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Hey! We need to support USA users!

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

Support user defined date format

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

One possible solution

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Should I actively search for duplications?

Slide 28

Slide 28 text

PHPCPD

Slide 29

Slide 29 text

PHPCPD

Slide 30

Slide 30 text

I found some duplications! What should I do now?

Slide 31

Slide 31 text

Apply Some Patterns

Slide 32

Slide 32 text

Different methods

Slide 33

Slide 33 text

Different methods

Slide 34

Slide 34 text

Extract Method

Slide 35

Slide 35 text

Extract Method

Slide 36

Slide 36 text

Different classes

Slide 37

Slide 37 text

Extract Class

Slide 38

Slide 38 text

Different projects

Slide 39

Slide 39 text

Extract Package

Slide 40

Slide 40 text

Same attribute in different classes

Slide 41

Slide 41 text

Pull Up Field

Slide 42

Slide 42 text

Thank you! благодаря MEGF5U15J7L7L7vLS25Uq0ZMBMBMBMBBBBBBBBBBBBBMBZPuLi, BBBBBBBBBBBBBBBBBBBBBBBBBBMBBBMMMMOMOM8M8MMBMBBBBBBBBBEU;. G0GEG0Z0GEZEGEZ0ZEG0G0ZNZ0Z0Z0Z0ZNE0EqENENZ0ZNZEZEOGMMBBBBBGU, qEqZNEqENENZNEqEqENZqENEqZNEq0NEqZq0NENEq0NENZNENEqZ0Z0GZOOBBBBG7. ENZNENENEN0NEN0NZNENZNZNZNZqENZqZqZNEqEN0qENENENZNEqZqEqENZ0ZZMBBBM; qENZNENEqEqEqEqZNENENZqEN0NENEqZNENENENENENEqENZNEqZqENENEq0NZNZZMBBB2 ZqENEq0NZNZqEN0NENEqENEqZNEqZqZN0qZqEqENENENEq0NENZNENZqENENENEN8BBBBBB1 NENENENENEN0NENEqENENEqEqENEN0q0qENENZNEN0NENENEqENZNENEqEqZN0NOMv5BBBBBBL EqENZqENENEqZNEq0qENENENZqENEN0qENZqZN0NENZNZNEq0NZqEN0NEq0qENGM8 .YBBBBO N0NZqZNEqEqEqENENEqENZqENEq0qENENENEqENENZqENEqENZqZNEqENEN0N00BU 7BBBB: ENZqEqENZNENEN0NEN0qENEN0NENENENENEqZqENZN0q0NENENENZNEqEqEN0qGB7 XBBBi NZNZqEqZNENEqENEqENENEqENENEqENEqZNZqENENEqEN0NEqENENEqZNZN0N00Bi ;BBBY 0NEN0N0NZNENENENEq0N0NEqENZq0NZNENENZqENENENZN0qENENEqZNZNEqENGBU .BBBj NENZqENENENENENEq0NEqENENENEqENEN0NEqEN0NENENEqEqZqEqZNZNZqEqENBq BBBY 0NZNEqEN0NENEN0qENENEqEqENENENEN0qZNEq0NEN0NEq0N0qZNEqENENEN0NZOB BBBY NENENZNZN0N0NZqENZ0ZNENENENZNEN0NENEqENENZNENEqENEqEN0NEN0NEN0q8B; BBBv 0q0N0NENENENENZ0OOMZ8Z80ZEZ0Z0ENENENENENEqEN0NEqENENENEqZNEqENEEBM .BBBr qENEqENEqZNENGMBBBBBBBBBBBBBBBBBO8EZ0ZqENZNENEqEqENENEq0qENENENZZBr :BBBi ENENZNE0ENENGBB: ,:7YS52LSqMBBBBBBOG0EqENENENENEqE0ENEN0NENENGMB vBBB: q0qGZBMGNEqZMB .:7XBB8NZNEqENENENEN8O80ZqZN0NEqGBB 2BBB: ENGMBq2BGN00B7 kBM0ZqEN0N0NEN8BMBBG80EN0N008BG XBBBi EMBB7 BOE0OB 8BMEENENEqENGB7 :MBBBOO0ENE08BBj qBBB; BBS NB0EOB FBBZZN0NENEEB .2MBBBBMZG08MBB qBBBv Bi 7BGNB0 ;BBGZ00NZN8B. :jMBBBBZG8B. SBBBq . .BZZB0 OBGZN0qEEBL :UBBMOBU ;BBBB7 BM0Bq 2B8ZNENZMB iBBMB 2BBBB1i BMGB8 vBZENE0MB: BBB1 YBBBBBBq: XBEBP YB0E08BB :BMB :5BBBBB FBMB: JBZ0OBB, BBBi .ru7 :BBBN YBMZBBX BMB2 OBBBBBB, MBMMBB, BBBE @InFog9 evaldojunior.com speakerdeck.com/infog github.com/InFog i. jBBZ2i .kBB: ,BBBBBBUi iFBBBBB BBZMMBBBBBZMBBBB88EBP ,BGNE0GZMMBBMG8EZqZBr ;B00NEqE0ZNGNEN0q0N8MZ7. BMZNEqENENEqEqZNZNEEOBBBBME0ZMMEGF5U15J7L iB80ZNEN0qEqENEN0qZNENZE8OBBBBBBBBBBBBBBBB iBZZqENENEqEqZNZN0NEqENENE0ZNZ0G0GEG0Z0GEZ ;BONEq0N0NZNENENENENEqEN0qZNENEqEqZNEqENEN B8GNEqENENENENENENEqZqZN0qZNENENZNENENEN0 XBZEN0q0qZqZNZNENEqENEN0NENZNEqENZNENEqEq BBGZN0NENGEO8G0ZNENEqENENZNEqZqENEq0NZNZ BBM8Z8OBBBBBBM0EqEqEqENZN0NENENENENENEN 2BBBBBMU: ;BOEEqEq0q0qEq0NEqENZqENENE rvi YBO0ENEqENEN0N0N0NZqZNEqEq BBGNENEqZqEN0NENZqEqENZNE .BB8NEq0qZNEN0NZNZqEqZNEN ;BBBEGNEEGNEN0NEN0N0NZNE FBBBM88FGNENENZqENENEN rMBBrUGEN0NZNEqEN0NE :EYB8NZNENENZNZN0N BOEq0q0N0NENENE qBNEqENEqENEqZN MOZNENENZNE0ENE SB8NEq0qGZBMGNEq ;BO0ZNENGMBq2BGN0 ,BBEEqZEMBB7 BOE0 BBEEqEEBBS NB0E NBZZNEEBBi 7BGN 7BGZNE0BB. .BZZ .BOGNZEMB, BM0 BBG0ZZBBj BMG OB8EOMBBi XBE kBMGBBB7 FBM SBM8BBr :BBB i:rYBBMMBJ OBBBBBB