SlideShare a Scribd company logo
Clean Android Code
Fabio Collini

Droidcon Italy - Torino - 6/7 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 - Droidcon Italiy 2014
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
D on't
R epeat
Y 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
Write
E verything
T 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 - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014
<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 - Droidcon Italiy 2014
<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 - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014
Clean android code - Droidcon Italiy 2014
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

PDF
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
PDF
Introduzione a node.js
PDF
Ajax - Presente e futuro delle applicazioni web
PDF
Introduzione al linguaggio Java
ODP
Many Designs Elements
PPTX
Portlet JSR168/286
PPT
Java lezione 18
PDF
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
Introduzione a node.js
Ajax - Presente e futuro delle applicazioni web
Introduzione al linguaggio Java
Many Designs Elements
Portlet JSR168/286
Java lezione 18

Viewers also liked (10)

KEY
Android Widget @ whymca 2011
KEY
Librerie su Android: come non reinventare la ruota @ whymca 2012
PPTX
Model-View-ViewModel and RxJava
PDF
Testable Android Apps DroidCon Italy 2015
PDF
Android Wear CodeLab - GDG Firenze
PDF
Testable Android Apps using data binding and MVVM
PDF
Introduction to Retrofit and RxJava
PDF
Android Data Binding in action using MVVM pattern - droidconUK
PDF
Data Binding in Action using MVVM pattern
PDF
MVVM with DataBinding on android
Android Widget @ whymca 2011
Librerie su Android: come non reinventare la ruota @ whymca 2012
Model-View-ViewModel and RxJava
Testable Android Apps DroidCon Italy 2015
Android Wear CodeLab - GDG Firenze
Testable Android Apps using data binding and MVVM
Introduction to Retrofit and RxJava
Android Data Binding in action using MVVM pattern - droidconUK
Data Binding in Action using MVVM pattern
MVVM with DataBinding on android
Ad

Similar to Clean android code - Droidcon Italiy 2014 (20)

PDF
Clean android code
ODP
70k linee di codice, tangle architetturali e le sfide del refactoring
PPTX
Sviluppo apps multipiattaforma con visual studio e xamarin
PDF
Android - Programmazione Avanzata
PDF
Introduzione ad Android
PDF
Xamarin & Cognitive Services Slides
PDF
Programmazione mobile: ANDROID
PDF
Introduzione alla programmazione Android - Android@tulug
PDF
Android Code Camp for Beginners - Ecosistema Android (IT)
KEY
Whymca Dive into Android [ITA]
PPTX
Introduction to C#
PPTX
Writing apps for android with .net
ODP
MOBILE APPS con ANDROID - Lo Stretto Digitale
PPTX
Costruire applicazioni-cross-platform-con-xamarin-visual-studio-2013
PPT
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
PDF
Introduzione al sistema operativo mobile Android
PDF
Corso Object Oriented Analysis and Design
PPTX
Alessandro Forte - Piattaforma Android
PPTX
Androidsdk appinventor
PDF
Programmiamo iPhone e iPad (e non solo!) con MonoTouch
Clean android code
70k linee di codice, tangle architetturali e le sfide del refactoring
Sviluppo apps multipiattaforma con visual studio e xamarin
Android - Programmazione Avanzata
Introduzione ad Android
Xamarin & Cognitive Services Slides
Programmazione mobile: ANDROID
Introduzione alla programmazione Android - Android@tulug
Android Code Camp for Beginners - Ecosistema Android (IT)
Whymca Dive into Android [ITA]
Introduction to C#
Writing apps for android with .net
MOBILE APPS con ANDROID - Lo Stretto Digitale
Costruire applicazioni-cross-platform-con-xamarin-visual-studio-2013
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Introduzione al sistema operativo mobile Android
Corso Object Oriented Analysis and Design
Alessandro Forte - Piattaforma Android
Androidsdk appinventor
Programmiamo iPhone e iPad (e non solo!) con MonoTouch
Ad

More from Fabio Collini (17)

PDF
Architectures in the compose world
PDF
Using hilt in a modularized project
PDF
Managing parallelism using coroutines
PDF
Kotlin Delegates in practice - Kotlin community conf
PDF
Kotlin delegates in practice - Kotlin Everywhere Stockholm
PDF
Using Dagger in a Clean Architecture project
PDF
Solid principles in practice the clean architecture - Droidcon Italy
PDF
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
PDF
SOLID principles in practice: the Clean Architecture
PDF
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
PDF
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
PDF
Recap Google I/O 2018
PDF
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
PDF
From java to kotlin beyond alt+shift+cmd+k
PDF
Testing Android apps based on Dagger and RxJava Droidcon UK
PDF
Intro to Retrofit 2 and RxJava2
PDF
Testing Android apps based on Dagger and RxJava
Architectures in the compose world
Using hilt in a modularized project
Managing parallelism using coroutines
Kotlin Delegates in practice - Kotlin community conf
Kotlin delegates in practice - Kotlin Everywhere Stockholm
Using Dagger in a Clean Architecture project
Solid principles in practice the clean architecture - Droidcon Italy
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
SOLID principles in practice: the Clean Architecture
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Recap Google I/O 2018
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k
Testing Android apps based on Dagger and RxJava Droidcon UK
Intro to Retrofit 2 and RxJava2
Testing Android apps based on Dagger and RxJava

Clean android code - Droidcon Italiy 2014