Refactoring vom ruby Quellcode  Developer Conference 2013
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Refactoring vom ruby Quellcode Developer Conference 2013

  • 613 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
613
On Slideshare
585
From Embeds
28
Number of Embeds
1

Actions

Shares
Downloads
8
Comments
0
Likes
1

Embeds 28

https://twitter.com 28

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. REFACTORING VOM RUBY QUELLCODE Wojciech Pietrzak / @astropanic AKRA GmbH
  • 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. DER QUELLCODE IST EIN KÜHLSCHRANK
  • 4. EIN KLEINES SEITENPROJEKT
  • 5. SOFTWARE, ENTERPRISE LEVEL
  • 6. GRÜNE WIESE
  • 7. DEV MEETING, ABSTIMMUNG ÜBER LIBRARIES UND TOOLS
  • 8. PROJEKT AUFETZEN
  • 9. CODE REVIEW
  • 10. QA - QUALITY ASSURANCE
  • 11. DAS PROJEKT IST "FAST" FERTIG
  • 12. DAS PROJEKT IST FERTIG
  • 13. ALLES WAS SCHIEFGEHEN KANN, WIRD SCHIEFGEHEN
  • 14. GUTER QUELLCODE Ist leicht verständlich Ist durchgetestet Code duplizierung ist minimal Ist möglichst klein Ist möglichst performant
  • 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. 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. 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. CODE SMELLS
  • 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. 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. 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. 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. 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. FLAY Findet Code Duplizierung Ignoriert coding Standards Unterstützt auch .erb Dateien
  • 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. CHURN Misst wie oft sich der Code verändert hat wo befinden sich die Entwickler die meiste Zeit auf?
  • 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. RAILS BEST PRACTICES risbs_rcie al_etpatcs g vmcni/al_etpatcsyl i ofgrisbs_rcie.m Rails best practices community
  • 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. 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. 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. 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. 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. THE END DANKE