Clean android code

1,239 views
1,077 views

Published on

Clean Android Code

Fabio Collini - GDG-Firenze

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,239
On SlideShare
0
From Embeds
0
Number of Embeds
543
Actions
Shares
0
Downloads
11
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Clean android code

  1. 1. Clean Android Code Fabio Collini GDG Firenze - 13 Febbraio 2014
  2. 2. @fabioCollini linkedin.com/in/fabiocollini Folder Organizer Freapp nana bianca cosenonjaviste.it
  3. 3. Agenda Definizione di Clean Code Formattazione del codice Clean code vs optimization Best practices Java Gestione delle risorse Android Test
  4. 4. "The only way to make the deadline -- the only way to go fast -- is to keep the code as clean as possible at all times." Clean code - Robert C. Martin
  5. 5. Definizione di Clean Code Leggibile Manutenibile Espandibile Espressivo Corretto Testabile ...
  6. 6. Formattazione del codice
  7. 7. Eclipse
  8. 8. Android Studio / IntelliJ
  9. 9. Clean code Vs optimization
  10. 10. android.view.View itmrvtFas n Piaelg; /.. /. pbi vi stsotaepc(ola iRo){ ulc od eIRoNmsaeboen sot i (sot { f iRo) mrvtFas| I_OTNMSAE Piaelg = SRO_AEPC; }es { le mrvtFas& ~SRO_AEPC; Piaelg = I_OTNMSAE } } pbi boeniRoNmsae){ ulc ola sotaepc( rtr (Piaelg&SRO_AEPC)! 0 eun mrvtFasI_OTNMSAE = ; }
  11. 11. Ottimizzazione del codice la classe View è istanziata molte volte all'interno di ogni activity di ogni app ha senso ottimizzare l'occupazione di memoria ma nel codice di una app?
  12. 12. Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet. Michael A. Jackson
  13. 13. Enum storicamente su Android erano sconsigliate con il JIT compiler la situazione è migliorata
  14. 14. Per evitare creazione di oggetti gli int sono molto usati Tutte le risorse sono int nella classe R txVe.eTx(0) etiwstet10; Cue b:adodcnetrsRsucsNtonEcpin asd y nri.otn.e.eore$oFudxeto: Srn rsuc I #x4 tig eore D 06 a adodcnetrsRsucsgtetRsucsjv:3) t nri.otn.e.eore.eTx(eore.aa29 a adodwde.etiwstetTxVe.aa34) t nri.igtTxVe.eTx(etiwjv:84 txVe.eTx(nee.otig10) etiwstetItgrtSrn(0);
  15. 15. SimpleCursorTreeAdapter Context Cursor int String[] int[] int String[] int[]
  16. 16. SimpleCursorTreeAdapter nwSmlCroTeAatrti,gopusr e ipeusrredpe(hs ruCro, adodRlyu.ipeepnal_itie_, nri..aotsml_xadbels_tm2 nwSrn[{Clm1,"oun", e tig]"oun" Clm2} nwit]adodRi.et,adodRi.et} e n[{nri..dtx1 nri..dtx2, adodRlyu.ipels_tm1 nri..aotsml_itie_, nwSrn[{Clm3,"oun", e tig]"oun" Clm4} nwit]adodRi.et,adodRi.et} { e n[{nri..dtx1 nri..dtx2) /.. /. } ;
  17. 17. Usando classi/enum Context Cursor Layout Column[] ViewId[] Layout Column[] ViewId[] Context Cursor LayoutColumnMapping LayoutColumnMapping
  18. 18. on't epeat ourself
  19. 19. The first time you do something, you just do it. The second time you do something similar, you wince at the duplication, but you do the duplicate thing anyway. The third time you do something similar, you refactor. Martin Fowler
  20. 20. rite verything wice
  21. 21. Coesione e disaccoppiamento
  22. 22. Activity classe base da usare per creare una interfaccia grafica nei casi semplici contengono tutto possono diventare molto grandi e difficili da gestire
  23. 23. Fragment interfacce responsive ciclo di vita complicato utili ma non semplici da usare
  24. 24. Custom View classi che estendono una View possono essere usate in un layout usate per creare componenti nuovi utili anche per raggruppare codice
  25. 25. ButterKnife injection delle view in una classe basato su annotation processing semplice da usare rende il codice più leggibile
  26. 26. Flow e Mortar framework sviluppati da Square basati su Dagger sostitutivi ai fragment, semplificano il ciclo di vita
  27. 27. Risorse in un progetto Android
  28. 28. <eore> rsucs <tl nm=lyuSye> sye ae"aottl" <tmnm=adodlyu_it"mthprn<ie> ie ae"nri:aotwdh>ac_aet/tm <tmnm=adodlyu_egt>ac_aet/tm ie ae"nri:aothih"mthprn<ie> <tmnm=adodoinain>etcl/tm ie ae"nri:retto"vria<ie> <tmnm=adodgaiy>etr/tm ie ae"nri:rvt"cne<ie> <sye /tl> <tl nm=txVeClr> sye ae"etiwoo" <tmnm=adodtxSz"10p/tm ie ae"nri:etie>5s<ie> <tmnm=adodtxClr>555<ie> ie ae"nri:etoo"#111/tm <tmnm=adodlyu_it"wa_otn<ie> ie ae"nri:aotwdh>rpcnet/tm <tmnm=adodlyu_egt>rpcnet/tm ie ae"nri:aothih"wa_otn<ie> <sye /tl> <rsucs /eore>
  29. 29. <eore> rsucs <tl nm=lyuSye prn=lyuSyeae> sye ae"aottl" aet"aottlBs" <tmnm=adodoinain>oiotl/tm ie ae"nri:retto"hrzna<ie> <sye /tl> <rsucs /eore>
  30. 30. <eore> rsucs <oo nm=txClr>555<clr clr ae"etoo"#111/oo> <rsucs /eore> <eore> rsucs <ie nm=txSz"10p/ie> dmn ae"etie>5s<dmn <rsucs /eore> <eore> rsucs <ie nm=txSz"20p/ie> dmn ae"etie>5s<dmn <rsucs /eore>
  31. 31. Include di layout equivalente di un extract method utile quando una piccola parte del layout cambia in base alla configurazione
  32. 32. Tipi di risorse disponibili Layout Drawable Stili String Animazioni Color Color state list Boolean Dimension Id Integer Array
  33. 33. Il codice Java dovrebbe essere indipendente dalle configurazioni
  34. 34. Test Coperto da test Vs Testabile L'architettura dell'app è fondamentale per avere codice testabile
  35. 35. Dagger A fast dependency injector for Android and Java
  36. 36. Dagger Object: possono essere singleton Module: classi Java che creano Object ObjectGraph: creato runtime a partire da più moduli
  37. 37. Scope pbi OjcGahpu(bet. mdls { ulc betrp lsOjc.. oue) } Permette di creare oggetti legati a scope: Application Activity Fragment
  38. 38. Pro di Dagger alto disaccoppiamento delle classi validazione compile time delle dipendenze moduli di test con stub e mock
  39. 39. EventBus permette di usare una architettura basata su eventi usando il metodo p s vengono invocati i metodi ot oEet n v n degli oggetti che si sono registrati con rgse eitr simile a Otto ma non basato su annotation gestisce anche i thread in background
  40. 40. Uso di EventBus Gerarchia di eventi: listener su classi base Gli eventi possono essere Parcelable Ciclo di vita Activity/cambio di orientation
  41. 41. Test su Android JUnit Roboelectric Robotium Espresso ...
  42. 42. Test Driven Development pbi vi tsCluao( { ulc od etacltr) asrEul(,cluao.u(,2) setqas4 acltrsm2 ); }
  43. 43. FEST Android pbi vi tsU( { ulc od eti) asrTa(aot.siil( sethtlyu)iVsbe) .setcl) iVria( .aCidon() hshlCut4 .aSoDvdr(HWDVDR_IDE; hshwiiesSO_IIESMDL) }
  44. 44. Quello che servirebbe... pbi vi tsU( { ulc od eti) asrEul(aot mcu) setqaslyu, okp; }
  45. 45. Test della ui utili per creare il caso di test aggiungendo uno wait è possibile interagire con il device Spoon permette di eseguire i test su più device e salvare screenshot
  46. 46. Java 8 in uscita a Marzo lambda expression e molte altre novità cambierà il modo di scrivere codice
  47. 47. Riferimenti Robert C. Martin - Clean code Martin Fowler - Refactoring: Improving the Design of Existing Code Simpler Android apps with Flow and Mortar github.com/JakeWharton/butterknife github.com/square/dagger github.com/greenrobot/EventBus github.com/square/fest-android
  48. 48. Thanks for your attention! Questions? @fabioCollini linkedin.com/in/fabiocollini

×