SlideShare a Scribd company logo
1 of 57
Download to read offline
Clean Android Code
Fabio Collini

GDG Firenze - 13 Febbraio 2014
@fabioCollini
linkedin.com/in/fabiocollini
Folder Organizer
Freapp
nana bianca
cosenonjaviste.it
Agenda
Definizione di Clean Code
Formattazione del codice
Clean code vs optimization
Best practices Java
Gestione delle risorse Android
Test
"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
Definizione di Clean Code
Leggibile
Manutenibile
Espandibile
Espressivo
Corretto
Testabile
...
Clean android code
Formattazione del codice
Eclipse
Android Studio / IntelliJ
Clean code
Vs
optimization
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 = ;
}
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?
Rules of Optimization:
Rule 1: Don't do it.
Rule 2 (for experts only): Don't do it yet.
Michael A. Jackson
Enum
storicamente su Android erano sconsigliate
con il JIT compiler la situazione è migliorata
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);
SimpleCursorTreeAdapter
Context
Cursor
int
String[]
int[]
int
String[]
int[]
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)
/..
/.
}
;
Usando classi/enum
Context
Cursor
Layout
Column[]
ViewId[]
Layout
Column[]
ViewId[]

Context
Cursor
LayoutColumnMapping
LayoutColumnMapping
on't
epeat
ourself
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
rite
verything
wice
Coesione
e
disaccoppiamento
Activity
classe base da usare per creare una interfaccia grafica
nei casi semplici contengono tutto
possono diventare molto grandi e difficili da gestire
Fragment
interfacce responsive
ciclo di vita complicato
utili ma non semplici da usare
Custom View
classi che estendono una View
possono essere usate in un layout
usate per creare componenti nuovi
utili anche per raggruppare codice
ButterKnife
injection delle view in una classe
basato su annotation processing
semplice da usare
rende il codice più leggibile
Flow e Mortar
framework sviluppati da Square
basati su Dagger
sostitutivi ai fragment, semplificano il ciclo di vita
Risorse in un progetto Android
Clean android code
Clean android code
Clean android code
Clean android code
<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>
Clean android code
<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>
<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>
Include di layout
equivalente di un extract method
utile quando una piccola parte del layout cambia in base
alla configurazione
Tipi di risorse disponibili
Layout
Drawable
Stili
String
Animazioni
Color

Color state list
Boolean
Dimension
Id
Integer
Array
Il codice Java dovrebbe essere
indipendente dalle configurazioni
Test
Coperto da test Vs Testabile
L'architettura dell'app è fondamentale per avere codice
testabile
Dagger

A fast dependency injector for Android and Java
Dagger
Object: possono essere singleton
Module: classi Java che creano Object
ObjectGraph: creato runtime a partire
da più moduli
Scope
pbi OjcGahpu(bet. mdls {
ulc betrp lsOjc.. oue)
}

Permette di creare oggetti legati a scope:
Application
Activity
Fragment
Clean android code
Clean android code
Clean android code
Pro di Dagger
alto disaccoppiamento delle classi
validazione compile time delle dipendenze
moduli di test con stub e mock
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
Uso di EventBus
Gerarchia di eventi: listener su classi base
Gli eventi possono essere Parcelable
Ciclo di vita Activity/cambio di orientation
Test su Android
JUnit
Roboelectric
Robotium
Espresso
...
Test Driven Development
pbi vi tsCluao( {
ulc od etacltr)
asrEul(,cluao.u(,2)
setqas4 acltrsm2 );
}
FEST Android
pbi vi tsU( {
ulc od eti)
asrTa(aot.siil(
sethtlyu)iVsbe)
.setcl)
iVria(
.aCidon()
hshlCut4
.aSoDvdr(HWDVDR_IDE;
hshwiiesSO_IIESMDL)
}
Quello che servirebbe...
pbi vi tsU( {
ulc od eti)
asrEul(aot mcu)
setqaslyu, okp;
}
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
Java 8
in uscita a Marzo
lambda expression e molte altre novità
cambierà il modo di scrivere codice
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
Thanks for your attention!
Questions?

@fabioCollini
linkedin.com/in/fabiocollini

More Related Content

Similar to Clean android code

Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Fabio Collini
 
Rich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsRich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsGiorgio Di Nardo
 
ASP.NET MVC 3: se non ora, quando?
ASP.NET MVC 3: se non ora, quando?ASP.NET MVC 3: se non ora, quando?
ASP.NET MVC 3: se non ora, quando?Giorgio Di Nardo
 
Struttin' on, novità in casa Struts
Struttin' on, novità in casa StrutsStruttin' on, novità in casa Struts
Struttin' on, novità in casa StrutsMarcello Teodori
 
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...Alessandro Alpi
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsAndrea Dottor
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide SitoDavide Sito
 
Sviluppare su OSGi con Camel e GWT
Sviluppare su OSGi con Camel e GWTSviluppare su OSGi con Camel e GWT
Sviluppare su OSGi con Camel e GWTCristiano Costantini
 
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPNetbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPGiorgio Cefaro
 
A static Analyzer for Finding Dynamic Programming Errors
A static Analyzer for Finding Dynamic Programming ErrorsA static Analyzer for Finding Dynamic Programming Errors
A static Analyzer for Finding Dynamic Programming ErrorsLino Possamai
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTfirenze-gtug
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group MilanoMassimo Groppelli
 

Similar to Clean android code (20)

Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014
 
Rich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsRich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.js
 
Java lezione1
Java lezione1Java lezione1
Java lezione1
 
Unit testing 101
Unit testing 101Unit testing 101
Unit testing 101
 
ASP.NET MVC 3: se non ora, quando?
ASP.NET MVC 3: se non ora, quando?ASP.NET MVC 3: se non ora, quando?
ASP.NET MVC 3: se non ora, quando?
 
Struttin' on, novità in casa Struts
Struttin' on, novità in casa StrutsStruttin' on, novità in casa Struts
Struttin' on, novità in casa Struts
 
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.js
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
 
Spring Intro
Spring IntroSpring Intro
Spring Intro
 
Sviluppare su OSGi con Camel e GWT
Sviluppare su OSGi con Camel e GWTSviluppare su OSGi con Camel e GWT
Sviluppare su OSGi con Camel e GWT
 
Java introduzione
Java introduzioneJava introduzione
Java introduzione
 
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPNetbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
 
Many Designs Elements
Many Designs ElementsMany Designs Elements
Many Designs Elements
 
A static Analyzer for Finding Dynamic Programming Errors
A static Analyzer for Finding Dynamic Programming ErrorsA static Analyzer for Finding Dynamic Programming Errors
A static Analyzer for Finding Dynamic Programming Errors
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
 
App Engine + Python
App Engine + PythonApp Engine + Python
App Engine + Python
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWT
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group Milano
 

More from firenze-gtug

Html5 apps - GWT oriented
Html5 apps - GWT orientedHtml5 apps - GWT oriented
Html5 apps - GWT orientedfirenze-gtug
 
Android ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi IntelAndroid ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi Intelfirenze-gtug
 
Gwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca TosiGwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca Tosifirenze-gtug
 
Youtube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'AmbrosioYoutube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'Ambrosiofirenze-gtug
 
Intro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'AmbrosioIntro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosiofirenze-gtug
 
Arduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'AmbrosioArduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'Ambrosiofirenze-gtug
 
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo BugianiIntroduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugianifirenze-gtug
 
RFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano ColucciniRFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano Coluccinifirenze-gtug
 
GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)firenze-gtug
 
Presentazione Google App Engine
Presentazione Google App EnginePresentazione Google App Engine
Presentazione Google App Enginefirenze-gtug
 
Maven from dummies
Maven from dummiesMaven from dummies
Maven from dummiesfirenze-gtug
 
Dev fest android application case study
Dev fest android application   case studyDev fest android application   case study
Dev fest android application case studyfirenze-gtug
 
google drive and the google drive sdk
google drive and the google drive sdkgoogle drive and the google drive sdk
google drive and the google drive sdkfirenze-gtug
 
You tube api overview
You tube api overviewYou tube api overview
You tube api overviewfirenze-gtug
 
Gwt development with errai and forge
Gwt development with errai and forgeGwt development with errai and forge
Gwt development with errai and forgefirenze-gtug
 
Google tv gdg_devfest_firenze2012
Google tv gdg_devfest_firenze2012Google tv gdg_devfest_firenze2012
Google tv gdg_devfest_firenze2012firenze-gtug
 
Dev fest2012 opening
Dev fest2012   openingDev fest2012   opening
Dev fest2012 openingfirenze-gtug
 
Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5firenze-gtug
 

More from firenze-gtug (20)

Html5 apps - GWT oriented
Html5 apps - GWT orientedHtml5 apps - GWT oriented
Html5 apps - GWT oriented
 
Android ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi IntelAndroid ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi Intel
 
Gwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca TosiGwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca Tosi
 
Youtube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'AmbrosioYoutube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'Ambrosio
 
Intro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'AmbrosioIntro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosio
 
Arduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'AmbrosioArduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'Ambrosio
 
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo BugianiIntroduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
 
RFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano ColucciniRFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano Coluccini
 
GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)
 
Presentazione Google App Engine
Presentazione Google App EnginePresentazione Google App Engine
Presentazione Google App Engine
 
Maven from dummies
Maven from dummiesMaven from dummies
Maven from dummies
 
Apps fuel oct2012
Apps fuel oct2012Apps fuel oct2012
Apps fuel oct2012
 
Dev fest android application case study
Dev fest android application   case studyDev fest android application   case study
Dev fest android application case study
 
google drive and the google drive sdk
google drive and the google drive sdkgoogle drive and the google drive sdk
google drive and the google drive sdk
 
You tube api overview
You tube api overviewYou tube api overview
You tube api overview
 
AdWordsScripts v1
AdWordsScripts v1AdWordsScripts v1
AdWordsScripts v1
 
Gwt development with errai and forge
Gwt development with errai and forgeGwt development with errai and forge
Gwt development with errai and forge
 
Google tv gdg_devfest_firenze2012
Google tv gdg_devfest_firenze2012Google tv gdg_devfest_firenze2012
Google tv gdg_devfest_firenze2012
 
Dev fest2012 opening
Dev fest2012   openingDev fest2012   opening
Dev fest2012 opening
 
Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5
 

Clean android code