REFACTORING VOM RUBY
QUELLCODE
Wojciech Pietrzak / @astropanic

AKRA GmbH
MAIL::RFC822::ADDRESS: REGULAR EXPRESSION
(:?)[t)(:?(:^)>,:.[]003](:?(:rn?]+
?(:rn?]*?(:?[(<@;"0-01+?(:?)[t)
|Z(=")>,:.[])...
DER QUELLCODE IST EIN KÜHLSCHRANK
EIN KLEINES SEITENPROJEKT
SOFTWARE, ENTERPRISE LEVEL
GRÜNE WIESE
DEV MEETING, ABSTIMMUNG ÜBER LIBRARIES UND TOOLS
PROJEKT AUFETZEN
CODE REVIEW
QA - QUALITY ASSURANCE
DAS PROJEKT IST "FAST" FERTIG
DAS PROJEKT IST FERTIG
ALLES WAS SCHIEFGEHEN KANN, WIRD SCHIEFGEHEN
GUTER QUELLCODE
Ist leicht verständlich
Ist durchgetestet
Code duplizierung ist minimal
Ist möglichst klein
Ist möglichst ...
QUELLCODE VERSTÄNDIGKEIT
Ue.l.a(:d
sralmp&i)
ue_d =[
sris
]
Ue.idi_ace d |sr|
srfn_nbths o ues
ue_d < uesmp&i)
sris < sr.a...
QUELLCODE PERFORMANCE
dfcutonn
e ondw()
rtr i nzr?#bs cs
eun f .eo
ae ae
pt n
us
cutonn1
ondw(-)
#gtigcoe t bs cs
etn lsr ...
EINE TICKENDE ZEITBOMBE
dfse_au_rceshs)
e tmvlebakt(ah
hs.net{)d |,kv|
ahijc(} o m(,)
i vkn_f(tig & v= /.)[.)]
f .ido?Srn)...
CODE SMELLS
LONG METHOD
casUesotolr<Apiainotolr
ls srCnrle
plctoCnrle
dfcet
e rae
@sr=Ue.e(aas:sr)
ue
srnwprm[ue]
rsodt d |omt
epn_o o...
FIX / NICHT NACHMACHEN
casUesotolr<Apiainotolr
ls srCnrle
plctoCnrle
dfcet
e rae
@sr=Ue.raeprm[ue]
ue
srcet(aas:sr)
ed
n
e...
SERVICE OBJECT
casUeCetoSrie
ls srrainevc
dfiiilz(srkas=Ue,mie_ls =UeMie)
e ntaieue_ls
sr alrkas
sralr
@srkas =ue_ls
ue_ls...
NIL CHECKS
cretue.red.atnm
urn_srfinsls.ae
udfndmto `red'frnlNlls
neie ehd fins o i:iCas
i cretue
f urn_sr
cretue.red.atnm...
NULL OBJECT
casNlUe
ls ulsr
dfmto_isn(ag,&lc)
e ehdmsig*rs bok
sl
ef
ed
n
ed
n
cretue =NlUe.e
urn_sr
ulsrnw
cretue.o.a.a.a...
FLAY
Findet Code Duplizierung
Ignoriert coding Standards
Unterstützt auch .erb Dateien
FLOG
Misst Assignments, Branches und Conditions
Versteht Ruby, bestraft Metaprogramming
Auswertung grupiert nach Methoden ...
CHURN
Misst wie oft sich der Code verändert hat
wo befinden sich die Entwickler die meiste Zeit auf?
CHURN VS COMPLEXITY (TURBULENCE)
c /m
d tp
gtcoehts/gtu.o/ilbqgtah.i
i ln tp:/ihbcmgtah/ilbqgt
c gtah
d ilbq
gmisaltruec
e...
RAILS BEST PRACTICES
risbs_rcie al_etpatcs g
vmcni/al_etpatcsyl
i ofgrisbs_rcie.m

Rails best practices community
EXUBERANT CTAGS
cas-vrin
tg -eso
EueatCas58 Cprgt()19-09Dre Heet
xbrn tg ., oyih C 9620 arn ibr
Cmie:Ar2 21,2:40
opld p 6 ...
THE SILVER SEARCHER
ge - vm. 01sue 00ssse 9%cu023ttl
rp R i
.9 sr .1 ytm 8 p .0 oa
akvm
c i
02sue 00ssse 8%cu023ttl
.0 sr ...
GIT PICKAXE
gtlg- pmisetr
i o S o_npco

Zeigt die Commits, welche "pom_inspector" im Quellcode
entfernt oder eingeführt ha...
QCACHEGRIND + RUBY PROF
be isalqahgid
rw ntl ccern
be lnap
rw ikps
rqie'uypo'
eur rb-rf
rsl =RbPo.rfl d
eut
uyrfpoie o
#ul...
CODE QUALITÄT SICHERN
Lesbare Tests pflegen
Auf Code smells reagieren
Design Patterns benutzen
Seine Tools wirklich kennen...
THE END
DANKE
Refactoring vom ruby Quellcode  Developer Conference 2013
Refactoring vom ruby Quellcode  Developer Conference 2013
Upcoming SlideShare
Loading in...5
×

Refactoring vom ruby Quellcode Developer Conference 2013

522

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
522
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Refactoring vom ruby Quellcode Developer Conference 2013

  1. 1. REFACTORING VOM RUBY QUELLCODE Wojciech Pietrzak / @astropanic AKRA GmbH
  2. 2. MAIL::RFC822::ADDRESS: REGULAR EXPRESSION (:?)[t)(:?(:^)>,:.[]003](:?(:rn?]+ ?(:rn?]*?(:?[(<@;"0-01+?(:?)[t) |Z(=")>,:.[])|(:^"r||?(:rn?])"?(:r |?[[(<@;"])"?[].(:?)[t)*(:? )[t))?(:?)[t)(:^)>,:.[]003](:?(:r n?]*(:.?(:rn?]*?[(<@;"0-01+?(:? )[t)|Z(=")>,:.[])|(:^"r||?(:rn?]) n?]+|?[[(<@;"])"?[].(:?)[t) *(:?)[t))*(:?)[t)(:^)>,:.[]003](: "?(:rn?]*)@?(:rn?]*?[(<@;"0-01+? (:?)[t)|Z(=")>,:.[])|[[].*]?(: ?(:rn?]+|?[[(<@;"])(^[]r|)(:? )[t))?(:?)[t)(:'[(<@;"0-01+?(: rn?]*(:.?(:rn?]*?da^)>,:.[]003](:? (:rn?]+|?[[(<@;"])(^[]r|)(:? ?)[t)|Z(=")>,:.[])|[[].*]?(:r n?]*)|?[(<@;"0-01+?(:?)[t)|Z(=" )[t))*(:^)>,:.[]003](:?(:rn?]+|?[[ (<@;"])"?[].(:?)[t)*(:?)[t)) )>,:.[])|(:^"r||?(:rn?])"?(:rn?]* *<?(:rn?]*?@?[(<@;"0-01+?(:?)[t) (:?)[t)(:(:^)>,:.[]003](:?(:rn?] +|?[[(<@;"])(^[]r|)(:?)[t))? |Z(=")>,:.[])|[[].*]?(:rn?]*(: .?(:rn?]*?[(<@;"0-01+?(:?)[t)|Z( (:?)[t)(:^)>,:.[]003](:?(:rn?]+| ?[[(<@;"])(^[]r|)(:?)[t))*?,(: =")>,:.[])|[[].*]?(:rn?]*)(:@? (:rn?]*?[(<@;"0-01+?(:?)[t)|Z(= ?)[t)(:^)>,:.[]003](:?(:rn?]+|?[ [(<@;"])(^[]r|)(:?)[t))?(:? ")>,:.[])|[[].*]?(:rn?]*(:.?(:r n?]*?[(<@;"0-01+?(:?)[t)|Z(=")> )[t)(:^)>,:.[]003](:?(:rn?]+|?[[(< @;"])(^[]r|)(:?)[t))**(:?)[t ,:.[])|[[].*]?(:rn?]*)):?(:rn? ]*??[(<@;"0-01+?(:?)[t)|Z(=")>,: ))(:^)>,:.[]003](:?(:rn?]+|?[[(<@; "])"?[].(:?)[t)*(:?)[t))?(: .[])|(:^"r||?(:rn?])"?(:rn?]*(:.? (:rn?]*?[(<@;"0-01+?(:? ?)[t)(:^)>,:.[]003](:?(:
  3. 3. DER QUELLCODE IST EIN KÜHLSCHRANK
  4. 4. EIN KLEINES SEITENPROJEKT
  5. 5. SOFTWARE, ENTERPRISE LEVEL
  6. 6. GRÜNE WIESE
  7. 7. DEV MEETING, ABSTIMMUNG ÜBER LIBRARIES UND TOOLS
  8. 8. PROJEKT AUFETZEN
  9. 9. CODE REVIEW
  10. 10. QA - QUALITY ASSURANCE
  11. 11. DAS PROJEKT IST "FAST" FERTIG
  12. 12. DAS PROJEKT IST FERTIG
  13. 13. ALLES WAS SCHIEFGEHEN KANN, WIRD SCHIEFGEHEN
  14. 14. GUTER QUELLCODE Ist leicht verständlich Ist durchgetestet Code duplizierung ist minimal Ist möglichst klein Ist möglichst performant
  15. 15. QUELLCODE VERSTÄNDIGKEIT Ue.l.a(:d sralmp&i) ue_d =[ sris ] Ue.idi_ace d |sr| srfn_nbths o ues ue_d < uesmp&i) sris < sr.a(:d ed n ue_d sris Ue.lc(i) srpuk:d
  16. 16. QUELLCODE PERFORMANCE dfcutonn e ondw() rtr i nzr?#bs cs eun f .eo ae ae pt n us cutonn1 ondw(-) #gtigcoe t bs cs etn lsr o ae ae ed n 5 4 3 2 1 dfcutonn e ondw() ag =[ rs ] ag.uhn rsps() #bs cs ae ae wieag.n?d hl rsay o ag=ag.hf r rssit pt ag us r ag.uhag1 i ag>1 #gtigcoe t bs cs rsps(r-) f r etn lsr o ae ae ed n ed n 5 4 3 2 1
  17. 17. EINE TICKENDE ZEITBOMBE dfse_au_rceshs) e tmvlebakt(ah hs.net{)d |,kv| ahijc(} o m(,) i vkn_f(tig & v= /.)[.)] f .ido?Srn) & ~ (*(*/ mk ={1= $} [] $ > 2 esfvkn_f(ah li .ido?Hs) mk =se_au_rcesv [] tmvlebakt() es le mk =v [] ed n m ed n ed n
  18. 18. CODE SMELLS
  19. 19. LONG METHOD casUesotolr<Apiainotolr ls srCnrle plctoCnrle dfcet e rae @sr=Ue.e(aas:sr) ue srnwprm[ue] rsodt d |omt epn_o o fra| i @srsv f ue.ae UeMie.eie_ecm_mi(ue) sralrdlvrwloeeal@sr ed n ed n ed n ed n
  20. 20. FIX / NICHT NACHMACHEN casUesotolr<Apiainotolr ls srCnrle plctoCnrle dfcet e rae @sr=Ue.raeprm[ue] ue srcet(aas:sr) ed n ed n casUe <AtvRcr:Bs ls sr cieeod:ae atrcet :eie_inpeal fe_rae dlvrsgu_mi dfdlvrsgu_mi e eie_inpeal i sl.ai? f efvld UeMie.eie_inpealsl) sralrdlvrsgu_mi(ef ed n ed n ed n
  21. 21. SERVICE OBJECT casUeCetoSrie ls srrainevc dfiiilz(srkas=Ue,mie_ls =UeMie) e ntaieue_ls sr alrkas sralr @srkas =ue_ls ue_ls srkas @alrkas=mie_ls mie_ls alrkas ed n dfcet(aas e raeprm) ue =@srkascet(aas sr ue_ls.raeprm) @alrkasdlvrsgu_mi(sr mie_ls.eie_inpealue) ue sr ed n ed n casUesotolr<Apiainotolr ls srCnrle plctoCnrle dfcet e rae @sr=UeCetoSrienwcet(aas:sr) ue srrainevc.e.raeprm[ue] ed n ed n casUe <AtvRcr:Bs ls sr cieeod:ae ed n
  22. 22. NIL CHECKS cretue.red.atnm urn_srfinsls.ae udfndmto `red'frnlNlls neie ehd fins o i:iCas i cretue f urn_sr cretue.red.atnm urn_srfinsls.ae ed n udfndmto `at frnlNlls neie ehd ls' o i:iCas i cretue & cretue.red f urn_sr & urn_srfins cretue.red.atnm urn_srfinsls.ae ed n udfndmto `ae frnlNlls neie ehd nm' o i:iCas i cretue & cretue.red & cretue.red.at f urn_sr & urn_srfins & urn_srfinsls cretue.red.atnm urn_srfinsls.ae ed n
  23. 23. NULL OBJECT casNlUe ls ulsr dfmto_isn(ag,&lc) e ehdmsig*rs bok sl ef ed n ed n cretue =NlUe.e urn_sr ulsrnw cretue.o.a.a.ac_ehdnm_ihlon_rs123 urn_srfobrbzfnymto_aewt_oogag(,,) casNlFin ls ulred dfnm e ae " " ed n ed n casNlUe ls ulsr dfmto_isn(ag,&lc) e ehdmsig*rs bok sl ef ed n dffins e red [ulrednw NlFin.e] ed n ed n cretue.red.atnm urn_srfinsls.ae
  24. 24. FLAY Findet Code Duplizierung Ignoriert coding Standards Unterstützt auch .erb Dateien
  25. 25. FLOG Misst Assignments, Branches und Conditions Versteht Ruby, bestraft Metaprogramming Auswertung grupiert nach Methoden oder Klassen fo apmdl/srr lg p/oesue.b fo - apcnrles lg g p/otolr
  26. 26. CHURN Misst wie oft sich der Code verändert hat wo befinden sich die Entwickler die meiste Zeit auf?
  27. 27. CHURN VS COMPLEXITY (TURBULENCE) c /m d tp gtcoehts/gtu.o/ilbqgtah.i i ln tp:/ihbcmgtah/ilbqgt c gtah d ilbq gmisaltruec e ntl ublne bl ue
  28. 28. RAILS BEST PRACTICES risbs_rcie al_etpatcs g vmcni/al_etpatcsyl i ofgrisbs_rcie.m Rails best practices community
  29. 29. EXUBERANT CTAGS cas-vrin tg -eso EueatCas58 Cprgt()19-09Dre Heet xbrn tg ., oyih C 9620 arn ibr Cmie:Ar2 21,2:40 opld p 6 03 31:7 Adess <heetuessucfrent,ht:/tg.oreog.e drse: dibr@sr.oreog.e> tp/cassucfrent Otoa cmie faue:+idad,+ee pinl opld etrs wlcrs rgx <dibr@sr.oreog.e> /heetuessucfrent Funktioniert mit Vim, Emacs und Sublime Text Versteht viele Sprachen, auch Ruby Macht das navigieren zwischen Projekt/ Gems angenehm
  30. 30. THE SILVER SEARCHER ge - vm. 01sue 00ssse 9%cu023ttl rp R i .9 sr .1 ytm 8 p .0 oa akvm c i 02sue 00ssse 8%cu023ttl .0 sr .2 ytm 9 p .4 oa a - vm. g r i 00sue 00ssse 18 cu007ttl .1 sr .1 ytm 0% p .1 oa Schneller als ack und grep Berücksichtigt die .gitignore Datei Bedienung ähnlich wie die schon bekannten Tools
  31. 31. GIT PICKAXE gtlg- pmisetr i o S o_npco Zeigt die Commits, welche "pom_inspector" im Quellcode entfernt oder eingeführt haben gtlg- pmisetr i o G o_npco Seit v1.7.4 versteht Git auch Regex
  32. 32. QCACHEGRIND + RUBY PROF be isalqahgid rw ntl ccern be lnap rw ikps rqie'uypo' eur rb-rf rsl =RbPo.rfl d eut uyrfpoie o #ul cd ge hr.. gy oe os ee. ed n Fl.pn"tprsl.u" ''d |ie ieoe /m/eutot, w o fl| RbPo:ClTePitrnwrsls.rn(ie uyrf:alrerne.e(eut)pitfl) ed n qahgid/m/eut.u ccern tprslsot
  33. 33. CODE QUALITÄT SICHERN Lesbare Tests pflegen Auf Code smells reagieren Design Patterns benutzen Seine Tools wirklich kennen Code reviews durchführen PingPong Pairprogramming
  34. 34. THE END DANKE
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×