SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
Как писать под Android
программы, а не код
Олег Годовых
@0leGG
Bean
Bean
Bean, Java Bean
Java Bean→ Java Monster
Bean
public class StoryTeller {
private int imageId;
private String name;
public StoryTeller(int imageId, String name) {
this.imageId = imageId;
this.name = name;
}
public int getImageId() {
return imageId;
}
public void setImageId(int imageId) {
this.imageId = imageId;
}
public int getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Bean + Lombok
@AllArgsConstructor(suppressConstructorProperties = true)
public class StoryTeller {
@Getter
@Setter
private int imageId;
@Getter
@Setter
private String name;
}
Bean + Lombok
@Data
@AllArgsConstructor(suppressConstructorProperties = true)
public class StoryTeller {
private int imageId;
private String name;
}
Lombok
buildscript {
dependencies {
classpath 'com.jimdo.gradle:gradle-apt-plugin:0.5'
...
}
}
apply plugin: 'apt'
dependencies {
provided "org.projectlombok:lombok:1.12.6"
apt "org.projectlombok:lombok:1.12.6"
...
}
Lombok
• toString()
• equals() и hashCode()
• value-классы
• throws
• log
Annotations
• JSON — Gson, Jackson, Jackson-jr
• XML — SimpleXml
• Database — ORMLite
Java 6
• Код нелаконичен
• Очень много boilerplate
RxJava + Java 6
articleSubscription.add(service.getNewsById(articleId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onErrorReturn(new Func1<Throwable, SingleNewsItem>() {
@Override
public SingleNewsItem call(final Throwable throwable) {
LOGGER.error("Error while fetching the article with id = " + articleId);
Toast.makeText(getActivity(), R.string.error, Toast.LENGTH_LONG).show();
hideProgressBar();
return null;
}
})
.subscribe(new Action1<SingleNewsItem>() {
@Override
public void call(final SingleNewsItem newsItem) {
article = newsItem;
articleView.loadData(article.getContent();
hideProgressBar();
}
}));
RxJava + Java 6 +
RetroLambda
articleSubscription.add(service.getNewsById(articleId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onErrorReturn(throwable -> {
LOGGER.error("Error while fetching the article with id = " + articleId);
Toast.makeText(getActivity(), R.string.error, Toast.LENGTH_LONG).show();
hideProgressBar();
return null;
})
.subscribe(newsItem -> {
article = newsItem;
articleView.loadData(article.getContent());
hideProgressBar();
}));
Java 6 + RetroLambda
buildscript {
dependencies {
classpath 'me.tatarka:gradle-retrolambda:2.2.3'
...
}
}
apply plugin: 'retrolambda'
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
...
}
RxJava
• Реактивное программирование — очень ок
• Экономит время на:
• повторяющихся операциях
• цепочках операций
• группах параллельных операций
• взаимодействиях потоков
Event Bus
• Делаем приложение слабо связным
• Развязываем руки как «производителям»,
так и «потребителям»
• Дешёвый аналог BroadcastListener
Otto — через аннотации
public class BaseFragment extends Fragment {
protected Bus bus = MyApplication.getBus();
@Override
public void onResume() {
super.onResume();
bus.register(this);
}
@Override
public void onPause() {
bus.unregister(this);
super.onPause();
}
@Subscribe
public void onResponse(WelcomeData data) {
loadWelcome(data);
}
}
GreenDroid EventBus —
по конвенции
public class BaseFragment extends Fragment {
protected EventBus bus = EventBus.getDefault();
@Override
public void onResume() {
super.onResume();
bus.register(this);
}
@Override
public void onPause() {
bus.unregister(this);
super.onPause();
}
public void onEvent(WelcomeData data) {
loadWelcome(data);
}
}
Layouts andViews
• findViewById — скучно и многословно.
• ButterKnife — аннотируем поля класса,
устанавливаем автоматически.
• AndroidQuery — всё в одном, более
лаконичные средства для простой работы
соView
Layouts andViews
TextView view = (TextView)findViewById(R.id.text);
view.setText("Hello");
// становится
new AQuery(this).id(R.id.text).text("Hello");
Layouts andViews
class ExampleActivity extends Activity {
private TextView title;
private TextView subtitle;
private TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
title = (TextView)findViewById(R.id.title);
subtitle = (TextView)findViewById(R.id.subtitle);
footer = (TextView)findViewById(R.id.footer);
}
}
Layouts andViews
class ExampleActivity extends Activity {
@InjectView(R.id.title) TextView title;
@InjectView(R.id.subtitle) TextView subtitle;
@InjectView(R.id.footer) TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.inject(this);
}
}
Dependency Injection
• Связывать части приложения будет легче
и удобнее.
• Стандарт де-факто — Dagger
• Части приложения (модули) — будут
связаны за нас.
• Синглтоны — за нас.
• Легко подменять модули.
• Легко делать mock-модули.
JVM-based языки
• Scala, Clojure, тысячи их.
• Главное — генерировать байткод Java 6.
• И не использовать те фишки, которые
Android из Java 6 не взял.
Лучшее — враг
хорошего
• При всех улучшениях и удобствах нужно
контролировать bus factor.
• Все «нестандартные» компоненты могут
со временем сломаться.
• Совместимость между ними не всегда
хороша.
Спасибо за внимание!
Олег Годовых
@0leGG

Contenu connexe

En vedette

Find my shiny metal droid
Find my shiny metal droidFind my shiny metal droid
Find my shiny metal droid0leGG
 
Старый Android на новый лад
Старый Android на новый ладСтарый Android на новый лад
Старый Android на новый лад0leGG
 
Профессии в IT
Профессии в ITПрофессии в IT
Профессии в IT0leGG
 
The_Lecture_Presentation
The_Lecture_PresentationThe_Lecture_Presentation
The_Lecture_PresentationNelly Kamel
 
Многопоточность
МногопоточностьМногопоточность
Многопоточность0leGG
 
ЦУГАЭТ позвонит
ЦУГАЭТ позвонитЦУГАЭТ позвонит
ЦУГАЭТ позвонит0leGG
 
I nacol coursestandards_2011
I nacol coursestandards_2011I nacol coursestandards_2011
I nacol coursestandards_2011Nelly Kamel
 
Проекты летней школы
Проекты летней школыПроекты летней школы
Проекты летней школы0leGG
 
Как завести трактор
Как завести тракторКак завести трактор
Как завести трактор0leGG
 
E learning fundanemtals and standards
E learning fundanemtals and standardsE learning fundanemtals and standards
E learning fundanemtals and standardsNelly Kamel
 
Как учёба в университете и олимпиадное программирование не сделали мою жизнь ...
Как учёба в университете и олимпиадное программирование не сделали мою жизнь ...Как учёба в университете и олимпиадное программирование не сделали мою жизнь ...
Как учёба в университете и олимпиадное программирование не сделали мою жизнь ...0leGG
 
10 способов облажаться на презентации
10 способов облажаться на презентации10 способов облажаться на презентации
10 способов облажаться на презентации0leGG
 

En vedette (15)

Find my shiny metal droid
Find my shiny metal droidFind my shiny metal droid
Find my shiny metal droid
 
Старый Android на новый лад
Старый Android на новый ладСтарый Android на новый лад
Старый Android на новый лад
 
Профессии в IT
Профессии в ITПрофессии в IT
Профессии в IT
 
Implementaion
ImplementaionImplementaion
Implementaion
 
The_Lecture_Presentation
The_Lecture_PresentationThe_Lecture_Presentation
The_Lecture_Presentation
 
Многопоточность
МногопоточностьМногопоточность
Многопоточность
 
Implementaion
ImplementaionImplementaion
Implementaion
 
ЦУГАЭТ позвонит
ЦУГАЭТ позвонитЦУГАЭТ позвонит
ЦУГАЭТ позвонит
 
I nacol coursestandards_2011
I nacol coursestandards_2011I nacol coursestandards_2011
I nacol coursestandards_2011
 
Проекты летней школы
Проекты летней школыПроекты летней школы
Проекты летней школы
 
Как завести трактор
Как завести тракторКак завести трактор
Как завести трактор
 
Evaluation
EvaluationEvaluation
Evaluation
 
E learning fundanemtals and standards
E learning fundanemtals and standardsE learning fundanemtals and standards
E learning fundanemtals and standards
 
Как учёба в университете и олимпиадное программирование не сделали мою жизнь ...
Как учёба в университете и олимпиадное программирование не сделали мою жизнь ...Как учёба в университете и олимпиадное программирование не сделали мою жизнь ...
Как учёба в университете и олимпиадное программирование не сделали мою жизнь ...
 
10 способов облажаться на презентации
10 способов облажаться на презентации10 способов облажаться на презентации
10 способов облажаться на презентации
 

Similaire à Как писать под Android программы, а не код

Экскурсия по Flutter SDK
Экскурсия по Flutter SDKЭкскурсия по Flutter SDK
Экскурсия по Flutter SDKSergey Penkovsky
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 
Почему Kotlin?
Почему Kotlin?Почему Kotlin?
Почему Kotlin?Kirill Rozov
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Sigma Software
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DAndreyGeonya
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...HappyDev
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практикеVitebsk Miniq
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8Technopark
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 

Similaire à Как писать под Android программы, а не код (20)

Экскурсия по Flutter SDK
Экскурсия по Flutter SDKЭкскурсия по Flutter SDK
Экскурсия по Flutter SDK
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
Почему Kotlin?
Почему Kotlin?Почему Kotlin?
Почему Kotlin?
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
Android service
Android serviceAndroid service
Android service
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
Spring puzzlers 2
Spring puzzlers 2Spring puzzlers 2
Spring puzzlers 2
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
 
Grails & Groovy
Grails & GroovyGrails & Groovy
Grails & Groovy
 
Kotlin
KotlinKotlin
Kotlin
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практике
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 
My batis
My batisMy batis
My batis
 

Как писать под Android программы, а не код

  • 1. Как писать под Android программы, а не код Олег Годовых @0leGG
  • 6. Bean public class StoryTeller { private int imageId; private String name; public StoryTeller(int imageId, String name) { this.imageId = imageId; this.name = name; } public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } public int getName() { return name; } public void setName(String name) { this.name = name; } }
  • 7. Bean + Lombok @AllArgsConstructor(suppressConstructorProperties = true) public class StoryTeller { @Getter @Setter private int imageId; @Getter @Setter private String name; }
  • 8. Bean + Lombok @Data @AllArgsConstructor(suppressConstructorProperties = true) public class StoryTeller { private int imageId; private String name; }
  • 9. Lombok buildscript { dependencies { classpath 'com.jimdo.gradle:gradle-apt-plugin:0.5' ... } } apply plugin: 'apt' dependencies { provided "org.projectlombok:lombok:1.12.6" apt "org.projectlombok:lombok:1.12.6" ... }
  • 10. Lombok • toString() • equals() и hashCode() • value-классы • throws • log
  • 11. Annotations • JSON — Gson, Jackson, Jackson-jr • XML — SimpleXml • Database — ORMLite
  • 12. Java 6 • Код нелаконичен • Очень много boilerplate
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18. RxJava + Java 6 articleSubscription.add(service.getNewsById(articleId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .onErrorReturn(new Func1<Throwable, SingleNewsItem>() { @Override public SingleNewsItem call(final Throwable throwable) { LOGGER.error("Error while fetching the article with id = " + articleId); Toast.makeText(getActivity(), R.string.error, Toast.LENGTH_LONG).show(); hideProgressBar(); return null; } }) .subscribe(new Action1<SingleNewsItem>() { @Override public void call(final SingleNewsItem newsItem) { article = newsItem; articleView.loadData(article.getContent(); hideProgressBar(); } }));
  • 19. RxJava + Java 6 + RetroLambda articleSubscription.add(service.getNewsById(articleId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .onErrorReturn(throwable -> { LOGGER.error("Error while fetching the article with id = " + articleId); Toast.makeText(getActivity(), R.string.error, Toast.LENGTH_LONG).show(); hideProgressBar(); return null; }) .subscribe(newsItem -> { article = newsItem; articleView.loadData(article.getContent()); hideProgressBar(); }));
  • 20. Java 6 + RetroLambda buildscript { dependencies { classpath 'me.tatarka:gradle-retrolambda:2.2.3' ... } } apply plugin: 'retrolambda' android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } ... }
  • 21. RxJava • Реактивное программирование — очень ок • Экономит время на: • повторяющихся операциях • цепочках операций • группах параллельных операций • взаимодействиях потоков
  • 22. Event Bus • Делаем приложение слабо связным • Развязываем руки как «производителям», так и «потребителям» • Дешёвый аналог BroadcastListener
  • 23. Otto — через аннотации public class BaseFragment extends Fragment { protected Bus bus = MyApplication.getBus(); @Override public void onResume() { super.onResume(); bus.register(this); } @Override public void onPause() { bus.unregister(this); super.onPause(); } @Subscribe public void onResponse(WelcomeData data) { loadWelcome(data); } }
  • 24. GreenDroid EventBus — по конвенции public class BaseFragment extends Fragment { protected EventBus bus = EventBus.getDefault(); @Override public void onResume() { super.onResume(); bus.register(this); } @Override public void onPause() { bus.unregister(this); super.onPause(); } public void onEvent(WelcomeData data) { loadWelcome(data); } }
  • 25. Layouts andViews • findViewById — скучно и многословно. • ButterKnife — аннотируем поля класса, устанавливаем автоматически. • AndroidQuery — всё в одном, более лаконичные средства для простой работы соView
  • 26. Layouts andViews TextView view = (TextView)findViewById(R.id.text); view.setText("Hello"); // становится new AQuery(this).id(R.id.text).text("Hello");
  • 27. Layouts andViews class ExampleActivity extends Activity { private TextView title; private TextView subtitle; private TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); title = (TextView)findViewById(R.id.title); subtitle = (TextView)findViewById(R.id.subtitle); footer = (TextView)findViewById(R.id.footer); } }
  • 28. Layouts andViews class ExampleActivity extends Activity { @InjectView(R.id.title) TextView title; @InjectView(R.id.subtitle) TextView subtitle; @InjectView(R.id.footer) TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.inject(this); } }
  • 29. Dependency Injection • Связывать части приложения будет легче и удобнее. • Стандарт де-факто — Dagger • Части приложения (модули) — будут связаны за нас. • Синглтоны — за нас. • Легко подменять модули. • Легко делать mock-модули.
  • 30. JVM-based языки • Scala, Clojure, тысячи их. • Главное — генерировать байткод Java 6. • И не использовать те фишки, которые Android из Java 6 не взял.
  • 31. Лучшее — враг хорошего • При всех улучшениях и удобствах нужно контролировать bus factor. • Все «нестандартные» компоненты могут со временем сломаться. • Совместимость между ними не всегда хороша.