Clean android code - Droidcon Italiy 2014

57
Droidcon Italy - Torino - 6/7 Febbraio 2014 Clean Android Code Fabio Collini

description

The benefits of Clean Code are obvious: stable programs, better maintainability, finding bugs faster and easier upgrading of software. A lot of advices have been already written about Java clean code (first of all in Robert C. Martin book), what about Android? Are the same advices valid? Or the way we write code must be different because it's a mobile platform? Are there any best practices about resources and the other Android stuff? In this talk we'll see some practical examples of how take advantage of Java and Android framework to write clean code and keep a project manageable.

Transcript of Clean android code - Droidcon Italiy 2014

Page 1: Clean android code - Droidcon Italiy 2014

Droidcon Italy - Torino - 6/7 Febbraio 2014

Clean Android CodeFabio Collini

Page 3: Clean android code - Droidcon Italiy 2014

Agenda

Definizione di Clean CodeFormattazione del codiceClean code vs optimizationBest practices JavaGestione delle risorse AndroidTest

Page 4: Clean android code - Droidcon Italiy 2014

"The only way to make the deadline -- the onlyway to go fast -- is to keep the code as clean as

possible at all times."Clean code - Robert C. Martin

Page 5: Clean android code - Droidcon Italiy 2014

Definizione di Clean CodeLeggibileManutenibileEspandibileEspressivoCorrettoTestabile...

Page 6: Clean android code - Droidcon Italiy 2014
Page 7: Clean android code - Droidcon Italiy 2014

Formattazione del codice

Page 8: Clean android code - Droidcon Italiy 2014

Eclipse

Page 9: Clean android code - Droidcon Italiy 2014

Android Studio / IntelliJ

Page 10: Clean android code - Droidcon Italiy 2014

Clean codeVs

optimization

Page 11: Clean android code - Droidcon Italiy 2014

android.view.Viewint mPrivateFlags;

//...

public void setIsRootNamespace(boolean isRoot) { if (isRoot) { mPrivateFlags |= IS_ROOT_NAMESPACE; } else { mPrivateFlags &= ~IS_ROOT_NAMESPACE; }}

public boolean isRootNamespace() { return (mPrivateFlags&IS_ROOT_NAMESPACE) != 0;}

Page 12: Clean android code - Droidcon Italiy 2014

Ottimizzazione del codice

la classe View è istanziata molte volte all'interno di ogniactivity di ogni appha senso ottimizzare l'occupazione di memoriama nel codice di una app?

Page 13: Clean android code - Droidcon Italiy 2014

Rules of Optimization:Rule 1: Don't do it.

Rule 2 (for experts only): Don't do it yet.Michael A. Jackson

Page 14: Clean android code - Droidcon Italiy 2014

Enum

storicamente su Android erano sconsigliatecon il JIT compiler la situazione è migliorata

Page 15: Clean android code - Droidcon Italiy 2014

Per evitare creazione di oggetti gli int sono molto usatiTutte le risorse sono int nella classe R

textView.setText(100);

Caused by: android.content.res.Resources$NotFoundException:String resource ID #0x64 at android.content.res.Resources.getText(Resources.java:239) at android.widget.TextView.setText(TextView.java:3844)

textView.setText(Integer.toString(100));

Page 16: Clean android code - Droidcon Italiy 2014

SimpleCursorTreeAdapterContextCursorintString[]int[]intString[]int[]

Page 17: Clean android code - Droidcon Italiy 2014

SimpleCursorTreeAdapter

new SimpleCursorTreeAdapter(this, groupCursor, android.R.layout.simple_expandable_list_item_2, new String[]{"Column1", "Column2"}, new int[]{android.R.id.text1, android.R.id.text2}, android.R.layout.simple_list_item_1, new String[]{"Column3", "Column4"}, new int[]{android.R.id.text1, android.R.id.text2}) { //...};

Page 18: Clean android code - Droidcon Italiy 2014

Usando classi/enumContextCursorLayoutColumn[]ViewId[]LayoutColumn[]ViewId[]

ContextCursorLayoutColumnMappingLayoutColumnMapping

Page 19: Clean android code - Droidcon Italiy 2014

D on'tR epeatY ourself

Page 20: Clean android code - Droidcon Italiy 2014

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 theduplicate thing anyway. The third time you do

something similar, you refactor.Martin Fowler

Page 21: Clean android code - Droidcon Italiy 2014

WriteE verythingT wice

Page 22: Clean android code - Droidcon Italiy 2014

Coesionee

disaccoppiamento

Page 23: Clean android code - Droidcon Italiy 2014

Activity

classe base da usare per creare una interfaccia graficanei casi semplici contengono tuttopossono diventare molto grandi e difficili da gestire

Page 24: Clean android code - Droidcon Italiy 2014

Fragment

interfacce responsiveciclo di vita complicatoutili ma non semplici da usare

Page 25: Clean android code - Droidcon Italiy 2014

Custom View

classi che estendono una Viewpossono essere usate in un layoutusate per creare componenti nuoviutili anche per raggruppare codice

Page 26: Clean android code - Droidcon Italiy 2014

ButterKnife

injection delle view in una classebasato su annotation processingsemplice da usarerende il codice più leggibile

Page 27: Clean android code - Droidcon Italiy 2014

Flow e Mortar

framework sviluppati da Squarebasati su Daggersostitutivi ai fragment, semplificano il ciclo di vita

Page 28: Clean android code - Droidcon Italiy 2014

Risorse in un progetto Android

Page 29: Clean android code - Droidcon Italiy 2014
Page 30: Clean android code - Droidcon Italiy 2014
Page 31: Clean android code - Droidcon Italiy 2014
Page 32: Clean android code - Droidcon Italiy 2014
Page 33: Clean android code - Droidcon Italiy 2014

<resources> <style name="layoutStyle"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">match_parent</item> <item name="android:orientation">vertical</item> <item name="android:gravity">center</item> </style>

<style name="textViewColor"> <item name="android:textSize">150sp</item> <item name="android:textColor">#515151</item> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> </style></resources>

Page 34: Clean android code - Droidcon Italiy 2014
Page 35: Clean android code - Droidcon Italiy 2014

<resources> <style name="layoutStyle" parent="layoutStyleBase"> <item name="android:orientation">horizontal</item> </style></resources>

Page 36: Clean android code - Droidcon Italiy 2014

<resources> <color name="textColor">#515151</color></resources>

<resources> <dimen name="textSize">150sp</dimen></resources>

<resources> <dimen name="textSize">250sp</dimen></resources>

Page 37: Clean android code - Droidcon Italiy 2014

Include di layout

equivalente di un extract methodutile quando una piccola parte del layout cambia in basealla configurazione

Page 38: Clean android code - Droidcon Italiy 2014

Tipi di risorse disponibili

LayoutDrawableStiliStringAnimazioniColor

Color state listBooleanDimensionIdIntegerArray

Page 39: Clean android code - Droidcon Italiy 2014

Il codice Java dovrebbe essereindipendente dalle configurazioni

Page 40: Clean android code - Droidcon Italiy 2014

Test

Coperto da test Vs TestabileL'architettura dell'app è fondamentale per avere codicetestabile

Page 41: Clean android code - Droidcon Italiy 2014

DaggerA fast dependency injector for Android and Java

Page 42: Clean android code - Droidcon Italiy 2014

Dagger

Object: possono essere singletonModule: classi Java che creano ObjectObjectGraph: creato runtime a partireda più moduli

Page 43: Clean android code - Droidcon Italiy 2014

Scopepublic ObjectGraph plus(Object... modules) {

}

Permette di creare oggetti legati a scope:Application

ActivityFragment

Page 44: Clean android code - Droidcon Italiy 2014
Page 45: Clean android code - Droidcon Italiy 2014
Page 46: Clean android code - Droidcon Italiy 2014
Page 47: Clean android code - Droidcon Italiy 2014

Pro di Dagger

alto disaccoppiamento delle classivalidazione compile time delle dipendenzemoduli di test con stub e mock

Page 48: Clean android code - Droidcon Italiy 2014

EventBus

permette di usare una architettura basata su eventiusando il metodo post vengono invocati i metodionEvent degli oggetti che si sono registrati conregistersimile a Otto ma non basato su annotationgestisce anche i thread in background

Page 49: Clean android code - Droidcon Italiy 2014

Uso di EventBus

Gerarchia di eventi: listener su classi baseGli eventi possono essere ParcelableCiclo di vita Activity/cambio di orientation

Page 50: Clean android code - Droidcon Italiy 2014

Test su Android

JUnitRoboelectricRobotiumEspresso...

Page 51: Clean android code - Droidcon Italiy 2014

Test Driven Development

public void testCalculator() { assertEquals(4, calculator.sum(2, 2)); }

Page 52: Clean android code - Droidcon Italiy 2014

FEST Android

public void testUi() { assertThat(layout).isVisible() .isVertical() .hasChildCount(4) .hasShowDividers(SHOW_DIVIDERS_MIDDLE);}

Page 53: Clean android code - Droidcon Italiy 2014

Quello che servirebbe...

public void testUi() { assertEquals(layout, mockup);}

Page 54: Clean android code - Droidcon Italiy 2014

Test della ui

utili per creare il caso di testaggiungendo uno wait è possibile interagire con il deviceSpoon permette di eseguire i test su più device e salvarescreenshot

Page 55: Clean android code - Droidcon Italiy 2014

Java 8

in uscita a Marzolambda expression e molte altre novitàcambierà il modo di scrivere codice

Page 57: Clean android code - Droidcon Italiy 2014

Thanks for your attention!

Questions?

@fabioCollini

linkedin.com/in/fabiocollini