Clean android code

57
GDG Firenze - 13 Febbraio 2014 Clean Android Code Fabio Collini

description

Clean Android Code Fabio Collini - GDG-Firenze

Transcript of Clean android code

Page 1: Clean android code

GDG Firenze - 13 Febbraio 2014

Clean Android CodeFabio Collini

Page 3: Clean android code

Agenda

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

Page 4: Clean android code

"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

Definizione di Clean CodeLeggibileManutenibileEspandibileEspressivoCorrettoTestabile...

Page 6: Clean android code
Page 7: Clean android code

Formattazione del codice

Page 8: Clean android code

Eclipse

Page 9: Clean android code

Android Studio / IntelliJ

Page 10: Clean android code

Clean codeVs

optimization

Page 11: Clean android code

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

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

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

Enum

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

Page 15: Clean android code

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

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

Page 17: Clean android code

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

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

ContextCursorLayoutColumnMappingLayoutColumnMapping

Page 19: Clean android code

on'tepeatourself

Page 20: Clean android code

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

riteverythingwice

Page 22: Clean android code

Coesionee

disaccoppiamento

Page 23: Clean android code

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

Fragment

interfacce responsiveciclo di vita complicatoutili ma non semplici da usare

Page 25: Clean android code

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

ButterKnife

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

Page 27: Clean android code

Flow e Mortar

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

Page 28: Clean android code

Risorse in un progetto Android

Page 29: Clean android code
Page 30: Clean android code
Page 31: Clean android code
Page 32: Clean android code
Page 33: Clean android code

<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
Page 35: Clean android code

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

Page 36: Clean android code

<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

Include di layout

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

Page 38: Clean android code

Tipi di risorse disponibili

LayoutDrawableStiliStringAnimazioniColor

Color state listBooleanDimensionIdIntegerArray

Page 39: Clean android code

Il codice Java dovrebbe essereindipendente dalle configurazioni

Page 40: Clean android code

Test

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

Page 41: Clean android code

DaggerA fast dependency injector for Android and Java

Page 42: Clean android code

Dagger

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

Page 43: Clean android code

Scopepublic ObjectGraph plus(Object... modules) {

}

Permette di creare oggetti legati a scope:Application

ActivityFragment

Page 44: Clean android code
Page 45: Clean android code
Page 46: Clean android code
Page 47: Clean android code

Pro di Dagger

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

Page 48: Clean android code

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

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

Test su Android

JUnitRoboelectricRobotiumEspresso...

Page 51: Clean android code

Test Driven Development

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

Page 52: Clean android code

FEST Android

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

Page 53: Clean android code

Quello che servirebbe...

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

Page 54: Clean android code

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

Java 8

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

Page 57: Clean android code

Thanks for your attention!

Questions?

@fabioCollini

linkedin.com/in/fabiocollini