SlideShare a Scribd company logo
1 of 86
Download to read offline
Delegates, Delegates
everywhere
Миронов Владимир
Делегирование
Делегирование
● Очень часто используемый дизайн паттерн
Делегирование
● Очень часто используемый дизайн паттерн
● Kotlin поддерживает делегирование на уровне языка
Делегирование
● Очень часто используемый дизайн паттерн
● Kotlin поддерживает делегирование на уровне языка
● Два вида делегирования в Kotlin
Делегирование
● Очень часто используемый дизайн паттерн
● Kotlin поддерживает делегирование на уровне языка
● Два вида делегирования в Kotlin
● Interface delegation
Делегирование
● Очень часто используемый дизайн паттерн
● Kotlin поддерживает делегирование на уровне языка
● Два вида делегирования в Kotlin
● Interface delegation
● Property delegation
Properties
Properties
● Понятие field отсутсвует на уровне языка
Properties
● Понятие field отсутсвует на уровне языка
● Есть только property
Properties
● Понятие field отсутсвует на уровне языка
● Есть только property
● Пара setter + getter для var и getter для val
Properties
● Понятие field отсутсвует на уровне языка
● Есть только property
● Пара setter + getter для var и getter для val
● Все обращения происходят через getter и setter
Properties
● Понятие field отсутсвует на уровне языка
● Есть только property
● Пара setter + getter для var и getter для val
● Все обращения происходят через getter и setter
● При необходимости у property есть backing field
Property Delegation
Property Delegation
class HelloDelegates {
var property by Delegate()
}
Property Delegation
class HelloDelegates {
var property by Delegate()
}
class HelloDelegates {
private val delegate = Delegate()
}
Property Delegation
class HelloDelegates {
var property by Delegate()
}
class HelloDelegates {
private val delegate = Delegate()
var property: String
set(value) = delegate.setValue(this, metadata, value)
get() = delegate.getValue(this, metadata)
}
Property Delegation
class Delegate {
operator fun getValue(thisRef: Any, property: KProperty<*>): String
operator fun setValue(thisRef: Any, property: KProperty<*>, value: String)
}
Property Delegation
class Delegate {
operator fun getValue(thisRef: Any, property: KProperty<*>): String
operator fun setValue(thisRef: Any, property: KProperty<*>, value: String)
}
class Delegate : ReadOnlyProperty<Any, String>
class Delegate : ReadWriteProperty<Any, String>
Built-in delegates
● Delegates.notNull()
● lazy
● Delegates.observable()
● Delegates.vetoable
Delegates.notNull()
class ChatFragment : Fragment() {
override fun onAttach(activity: Activity) {
super.onAttach(activity)
adapter = createMessagesAdapter(context)
}
}
Delegates.notNull()
class ChatFragment : Fragment() {
private var adapter: MessagesAdapter? = null
override fun onAttach(activity: Activity) {
super.onAttach(activity)
adapter = createMessagesAdapter(context)
}
}
Delegates.notNull()
class ChatFragment : Fragment() {
private var adapter: MessagesAdapter? = null
override fun onAttach(activity: Activity) {
super.onAttach(activity)
adapter = createMessagesAdapter(context)
}
private fun onMessagesChanged(messages: List<Message>) {
adapter!!.notifyMessagedChanged(messages)
}
}
Delegates.notNull()
class ChatFragment : Fragment() {
private var adapter: MessagesAdapter by Delegates.notNull()
override fun onAttach(activity: Activity) {
super.onAttach(activity)
adapter = createMessagesAdapter(context)
}
private fun onMessagesChanged(messages: List<Message>) {
adapter!!.notifyMessagedChanged(messages)
}
}
Delegates.notNull()
class ChatFragment : Fragment() {
private var adapter: MessagesAdapter by Delegates.notNull()
override fun onAttach(activity: Activity) {
super.onAttach(activity)
adapter = createMessagesAdapter(context)
}
private fun onMessagesChanged(messages: List<Message>) {
adapter.notifyMessagedChanged(messages)
}
}
lazy
class ChatFragment : Fragment() {
private val adapter by lazy(LazyThreadSafetyMode.NONE) {
createMessagesAdapter(context)
}
private fun onMessagesChanged(messages: List<Message>) {
adapter.notifyMessagedChanged(messages)
}
}
Delegates.observable
class ChatFragment : Fragment() {
private var title by Delegates.observable("Chat") { desc, old, new ->
notifyTitleChanged(new)
}
private fun notifyTitleChanged(title: String) {
titleView.text = title
}
}
Наш первый делегат
public class OvalView extends View {
private float radiusX = 100.0f;
private float radiusY = 100.0f;
}
Наш первый делегат
public class OvalView extends View {
private float radiusX = 100.0f;
private float radiusY = 100.0f;
public void setRadiusX(float radiusX) {
this.radiusX = radiusX;
invalidate();
}
}
Наш первый делегат
public class OvalView extends View {
private float radiusX = 100.0f;
private float radiusY = 100.0f;
public void setRadiusX(float radiusX) {
this.radiusX = radiusX;
invalidate();
}
public void setRadiusY(float radiusY) {
this.radiusY = radiusY;
invalidate();
}
}
Наш первый делегат
class OvalView : View() {
val radiusX by Delegates.observable(100.0f) { desc, old, new ->
invalidate()
}
val radiusY by Delegates.observable(100.0f) { desc, old, new ->
invalidate()
}
}
Наш первый делегат
fun <T> View.bindViewProperty(initial: T): ReadWriteProperty<Any, T> {
return Delegates.observable(initial) { desc, old, new ->
invalidate()
}
}
Наш первый делегат
fun <T> View.bindViewProperty(initial: T): ReadWriteProperty<Any, T> {
return Delegates.observable(initial) { desc, old, new ->
invalidate()
}
}
class OvalView : View() {
val radiusX by bindViewProperty(100.0f)
val radiusY by bindViewProperty(100.0f)
}
Наш первый делегат
fun <T> View.bindViewProperty(initial: T): ReadWriteProperty<Any, T> {
return Delegates.observable(initial) { desc, old, new ->
invalidate()
}
}
class OvalView : View() {
val radiusX by bindViewProperty(100.0f)
val radiusY by bindViewProperty(100.0f)
val centerX by bindViewProperty(50.0f)
val centerY by bindViewProperty(50.0f)
}
Еще один простой делегат
fun <V : View> Activity.bindView(id: Int): Lazy<V> {
throw UnsupportedOperationException("Implement me!")
}
Еще один простой делегат
fun <V : View> Activity.bindView(id: Int): Lazy<V> {
return lazy(LazyThreadSafetyMode.NONE) {
findViewById(id) as V
}
}
Еще один простой делегат
fun <V : View> Activity.bindView(id: Int): Lazy<V> {
return lazy(LazyThreadSafetyMode.NONE) {
findViewById(id) as V
}
}
class UserActivity : Activity() {
private val image by bindView<ImageView>(R.id.user_image)
private val firstName by bindView<TextView>(R.id.user_first_name)
private val lastName by bindView<TextView>(R.id.user_last_name)
}
Typesafe Bundle Builders
Typesafe Bundle Builders
val fragment = UserFragment()
val extras = Bundle()
extras.putString("firstName", "Ivan")
extras.putString("lastName", "Ivanov")
extras.putInt("age", 20)
fragment.arguments = extras
Typesafe Bundle Builders
val fragment = UserFragment()
val extras = Bundle()
extras.putString("firstName", "Ivan")
extras.putString("lastName", "Ivanov")
extras.putInt("age", 20)
fragment.arguments = extras
inline fun <reified T : Any> bindArgument(bundle: Bundle, default: T? = null): BundleDelegate {
throw UnsupportedOperationException()
}
Typesafe Bundle Builders
class UserArguments(val extras: Bundle) {
var firstName by bindArgument<String>(extras)
var lastName by bindArgument<String>(extras)
var age by bindArgument(extras, 33)
}
Typesafe Bundle Builders
class UserArguments(val extras: Bundle) {
var firstName by bindArgument<String>(extras)
var lastName by bindArgument<String>(extras)
var age by bindArgument(extras, 33)
}
val fragment = UserFragment()
val arguments = UserArguments(Bundle())
arguments.firstName = "Ivan"
arguments.lastName = "Ivanov"
fragment.arguments = arguments.extras
Typesafe Bundle Builders
class UserFragment : Fragment() {
private val args by lazy(LazyThreadSafetyMode.NONE) {
UserArguments(arguments)
}
}
LifecycleAware delegates
class ChatFragment : BaseFragment() {
private var chat by Delegates.notNull<ChatModel>()
private var messages by Delegates.notNull<CollectionRange<Message>>()
}
LifecycleAware delegates
class ChatFragment : BaseFragment() {
private var chat by Delegates.notNull<ChatModel>()
private var messages by Delegates.notNull<CollectionRange<Message>>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
chat = acquireChatModel()
messages = chat.acquireMessagesRange()
}
}
LifecycleAware delegates
class ChatFragment : BaseFragment() {
private var chat by Delegates.notNull<ChatModel>()
private var messages by Delegates.notNull<CollectionRange<Message>>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
chat = acquireChatModel()
messages = chat.acquireMessagesRange()
}
override fun onDestroy() {
messages.close()
chat.close()
super.onDestroy()
}
}
LifecycleAware delegates
class ChatFragment : BaseFragment() {
private val chat by bindToLifecycleEagerly(LifecycleInterval.CREATED) {
acquireChatModel()
}
private val participants by bindToLifecycleEagerly(LifecycleInterval.CREATED) {
chat.acquireParticipantsRange()
}
}
Preferences delegates
class DebugSettings(private val preferences: SharedPreferences) {
var logEnabled: Boolean
set(value) = preferences.edit().putBoolean("logEnabled", value).apply()
get() = preferences.getBoolean("logEnabled", true)
var logTag: String
set(value) = preferences.edit().putString("logTag", value).apply()
get() = preferences.getString("logTag", "Debug")
}
Preferences delegates
class DebugSettings(private val preferences: SharedPreferences) {
var logEnabled by bindPreference(preferences, true)
var logTag by bindPreference(preferences, "Debug")
}
ReadWriteProperty и ReadOnlyProperty
ReadWriteProperty и ReadOnlyProperty
public interface ReadWriteProperty<in R, T> {
public operator fun getValue(thisRef: R, property: KProperty<*>): T
public operator fun setValue(thisRef: R, property: KProperty<*>, value: T)
}
public interface ReadOnlyProperty<in R, out T> {
public operator fun getValue(thisRef: R, property: KProperty<*>): T
}
KProperty<T>
KProperty<T>
● Хранит в себе метаинформацию о property
KProperty<T>
● Хранит в себе метаинформацию о property
● KProperty<T>.name: String
KProperty<T>
● Хранит в себе метаинформацию о property
● KProperty<T>.name: String
● KProperty<T>.returnType.javaType: Class
KProperty<T>
● Хранит в себе метаинформацию о property
● KProperty<T>.name: String
● KProperty<T>.returnType.javaType: Class
● KProperty<T>.returnType.isMarkedNullable: Boolean
KProperty<T>
● Хранит в себе метаинформацию о property
● KProperty<T>.name: String
● KProperty<T>.returnType.javaType: Class
● KProperty<T>.returnType.isMarkedNullable: Boolean
● KProperty<T>.annotations: List<Annotation>
KProperty<T> и Android
KProperty<T> и Android
● По дефолту работает только KProperty.name
KProperty<T> и Android
● По дефолту работает только KProperty.name
● Оставшимся методам необходима зависимость kotlin-reflect
KProperty<T> и Android
● По дефолту работает только KProperty.name
● Оставшимся методам необходима зависимость kotlin-reflect
● Количество методов - 12112
KProperty<T> и Android
● По дефолту работает только KProperty.name
● Оставшимся методам необходима зависимость kotlin-reflect
● Количество методов - 12112
● JAR Size - 2268KB
KProperty<T> и Android
● По дефолту работает только KProperty.name
● Оставшимся методам необходима зависимость kotlin-reflect
● Количество методов - 12112
● JAR Size - 2268KB
● DEX size - 1726KB
Как жить без reflection
Как жить без reflection
● KProperty.name работает и так
Как жить без reflection
● KProperty.name работает и так
● KProperty.returnType.javaType - inline reified generic функция
Как жить без reflection
● KProperty.name работает и так
● KProperty.returnType.javaType - inline reified generic функция
● KProperty.returnType.isMarkedNullable - два разных делегата
Как жить без reflection
● KProperty.name работает и так
● KProperty.returnType.javaType - inline reified generic функция
● KProperty.returnType.isMarkedNullable - два разных делегата
inline fun <reified T : Any> bindValue(): ReadWriteProperty<Any, T> {
return createRequiredDelegate(T::class.java)
}
Как жить без reflection
● KProperty.name работает и так
● KProperty.returnType.javaType - inline reified generic функция
● KProperty.returnType.isMarkedNullable - два разных делегата
inline fun <reified T : Any> bindValue(): ReadWriteProperty<Any, T> {
return createRequiredDelegate(T::class.java)
}
inline fun <reified T : Any> bindOptionalValue(): ReadWriteProperty<Any, T?> {
return createOptionalDelegate(T::class.java)
}
Preferences delegates
class DebugSettings(private val preferences: SharedPreferences) {
var logEnabled by bindPreference(preferences, true)
var logTag by bindPreference(preferences, "Debug")
}
Preferences delegates
class PreferenceReadWriteProperty<T : Any>(
// some arguments here
) : ReadWriteProperty<Any, T> {
// implement me
}
Preferences delegates
class PreferenceReadWriteProperty<T : Any>(
private val preferences: SharedPreferences
) : ReadWriteProperty<Any, T> {
// implement me
}
Preferences delegates
class PreferenceReadWriteProperty<T : Any>(
private val preferences: SharedPreferences,
private val clazz: Class<T>
) : ReadWriteProperty<Any, T> {
// implement me
}
Preferences delegates
class PreferenceReadWriteProperty<T : Any>(
private val preferences: SharedPreferences,
private val clazz: Class<T>,
private val default: T
) : ReadWriteProperty<Any, T> {
// implement me
}
Preferences delegates
class PreferenceReadWriteProperty<T : Any>(
private val preferences: SharedPreferences,
private val clazz: Class<T>,
private val default: T,
private val name: String?
) : ReadWriteProperty<Any, T> {
// implement me
}
Preferences delegates
override fun getValue(thisRef: Any, property: KProperty<*>): T {
throw UnsupportedOperationException()
}
Preferences delegates
override fun getValue(thisRef: Any, property: KProperty<*>): T {
val key = name ?: property.name
}
Preferences delegates
override fun getValue(thisRef: Any, property: KProperty<*>): T {
val key = name ?: property.name
if (!preferences.contains(key)) {
return default
}
}
Preferences delegates
override fun getValue(thisRef: Any, property: KProperty<*>): T {
val key = name ?: property.name
if (!preferences.contains(key)) {
return default
}
return when (clazz) {
String::class.java -> preferences.getString(key, null)
else -> throw UnsupportedOperationException()
} as T
}
Preferences delegates
override fun getValue(thisRef: Any, property: KProperty<*>): T {
val key = name ?: property.name
if (!preferences.contains(key)) {
return default
}
return when (clazz) {
String::class.java -> preferences.getString(key, null)
Int::class.java -> preferences.getInt(key, 0)
else -> throw UnsupportedOperationException()
} as T
}
Preferences delegates
override fun getValue(thisRef: Any, property: KProperty<*>): T {
val key = name ?: property.name
if (!preferences.contains(key)) {
return default
}
return when (clazz) {
String::class.java -> preferences.getString(key, null)
Int::class.java -> preferences.getInt(key, 0)
Long::class.java -> preferences.getLong(key, 0L)
else -> throw UnsupportedOperationException()
} as T
}
Preferences delegates
override fun getValue(thisRef: Any, property: KProperty<*>): T {
val key = name ?: property.name
if (!preferences.contains(key)) {
return default
}
return when (clazz) {
String::class.java -> preferences.getString(key, null)
Int::class.java -> preferences.getInt(key, 0)
Long::class.java -> preferences.getLong(key, 0L)
Boolean::class.java -> preferences.getBoolean(key, false)
else -> throw UnsupportedOperationException()
} as T
}
Preferences delegates
override fun getValue(thisRef: Any, property: KProperty<*>): T {
val key = name ?: property.name
if (!preferences.contains(key)) {
return default
}
return when (clazz) {
String::class.java -> preferences.getString(key, null)
Int::class.java -> preferences.getInt(key, 0)
Long::class.java -> preferences.getLong(key, 0L)
Boolean::class.java -> preferences.getBoolean(key, false)
Float::class.java -> preferences.getFloat(key, 0.0f)
else -> throw UnsupportedOperationException()
} as T
}
Preferences delegates
inline fun <reified T : Any> bindPreference(
preferences: SharedPreferences,
default: T,
name: String? = null
) : ReadWriteProperty<Any, T> {
return PreferenceReadWriteProperty(preferences, T::class.java, default, name)
}
Preferences delegates
class DebugSettings(private val preferences: SharedPreferences) {
var logEnabled by bindPreference(preferences, true)
var logTag by bindPreference(preferences, "Debug")
}
Links
https://kotlinlang.org/docs/reference/delegated-properties.html
https://github.com/JakeWharton/kotterknife
https://github.com/nsk-mironov/kotlin-jetpack

More Related Content

What's hot

Let the type system be your friend
Let the type system be your friendLet the type system be your friend
Let the type system be your friendThe Software House
 
Introduction to kotlin + spring boot demo
Introduction to kotlin + spring boot demoIntroduction to kotlin + spring boot demo
Introduction to kotlin + spring boot demoMuhammad Abdullah
 
Idiomatic Kotlin
Idiomatic KotlinIdiomatic Kotlin
Idiomatic Kotlinintelliyole
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahNick Plante
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftGiordano Scalzo
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokusHamletDRC
 
Feel of Kotlin (Berlin JUG 16 Apr 2015)
Feel of Kotlin (Berlin JUG 16 Apr 2015)Feel of Kotlin (Berlin JUG 16 Apr 2015)
Feel of Kotlin (Berlin JUG 16 Apr 2015)intelliyole
 
ADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersBartosz Kosarzycki
 
Develop your next app with kotlin @ AndroidMakersFr 2017
Develop your next app with kotlin @ AndroidMakersFr 2017Develop your next app with kotlin @ AndroidMakersFr 2017
Develop your next app with kotlin @ AndroidMakersFr 2017Arnaud Giuliani
 
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMConcurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMMario Fusco
 
Kotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersKotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersBartosz Kosarzycki
 
Kotlin Advanced - Apalon Kotlin Sprint Part 3
Kotlin Advanced - Apalon Kotlin Sprint Part 3Kotlin Advanced - Apalon Kotlin Sprint Part 3
Kotlin Advanced - Apalon Kotlin Sprint Part 3Kirill Rozov
 
ConFess Vienna 2015 - Metaprogramming with Groovy
ConFess Vienna 2015 - Metaprogramming with GroovyConFess Vienna 2015 - Metaprogramming with Groovy
ConFess Vienna 2015 - Metaprogramming with GroovyIván López Martín
 
Scala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldScala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldBTI360
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Jonas Bonér
 

What's hot (20)

Comparing JVM languages
Comparing JVM languagesComparing JVM languages
Comparing JVM languages
 
Let the type system be your friend
Let the type system be your friendLet the type system be your friend
Let the type system be your friend
 
Introduction to kotlin + spring boot demo
Introduction to kotlin + spring boot demoIntroduction to kotlin + spring boot demo
Introduction to kotlin + spring boot demo
 
Idiomatic Kotlin
Idiomatic KotlinIdiomatic Kotlin
Idiomatic Kotlin
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and Pindah
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in Swift
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokus
 
Feel of Kotlin (Berlin JUG 16 Apr 2015)
Feel of Kotlin (Berlin JUG 16 Apr 2015)Feel of Kotlin (Berlin JUG 16 Apr 2015)
Feel of Kotlin (Berlin JUG 16 Apr 2015)
 
Es.next
Es.nextEs.next
Es.next
 
Scala - brief intro
Scala - brief introScala - brief intro
Scala - brief intro
 
ADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developers
 
Develop your next app with kotlin @ AndroidMakersFr 2017
Develop your next app with kotlin @ AndroidMakersFr 2017Develop your next app with kotlin @ AndroidMakersFr 2017
Develop your next app with kotlin @ AndroidMakersFr 2017
 
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMConcurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
 
Kotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersKotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developers
 
ES6 in Real Life
ES6 in Real LifeES6 in Real Life
ES6 in Real Life
 
Kotlin Advanced - Apalon Kotlin Sprint Part 3
Kotlin Advanced - Apalon Kotlin Sprint Part 3Kotlin Advanced - Apalon Kotlin Sprint Part 3
Kotlin Advanced - Apalon Kotlin Sprint Part 3
 
SDC - Einführung in Scala
SDC - Einführung in ScalaSDC - Einführung in Scala
SDC - Einführung in Scala
 
ConFess Vienna 2015 - Metaprogramming with Groovy
ConFess Vienna 2015 - Metaprogramming with GroovyConFess Vienna 2015 - Metaprogramming with Groovy
ConFess Vienna 2015 - Metaprogramming with Groovy
 
Scala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldScala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 World
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
 

Viewers also liked

Эффективная команда, работа, делегирование (доклад с Web camp 2013)
Эффективная команда, работа, делегирование (доклад с Web camp 2013)Эффективная команда, работа, делегирование (доклад с Web camp 2013)
Эффективная команда, работа, делегирование (доклад с Web camp 2013)Aleksey Denysyuk
 
Делегирование как оно есть
Делегирование как оно естьДелегирование как оно есть
Делегирование как оно естьVasilisa Smirnova
 
Ответственность и делегирование
Ответственность и делегированиеОтветственность и делегирование
Ответственность и делегированиеMark&Sales
 
Мастер-класс. Эффективное делегирование. Минск. Март. 2013
Мастер-класс. Эффективное делегирование. Минск. Март. 2013Мастер-класс. Эффективное делегирование. Минск. Март. 2013
Мастер-класс. Эффективное делегирование. Минск. Март. 2013Oleg Afanasyev
 
Вебинар "Делегирование: что, как и зачем?"
Вебинар "Делегирование: что, как и зачем?"Вебинар "Делегирование: что, как и зачем?"
Вебинар "Делегирование: что, как и зачем?"Timofey (Tim) Yevgrashyn
 
Основы успешного делегирования
Основы успешного делегированияОсновы успешного делегирования
Основы успешного делегированияIPM Business School
 
Украденные мысли: Делегирование это любовь
Украденные мысли: Делегирование это любовьУкраденные мысли: Делегирование это любовь
Украденные мысли: Делегирование это любовьIosif Itkin
 
Делегирование. Повышаем шансы на исполнение
Делегирование. Повышаем шансы на исполнениеДелегирование. Повышаем шансы на исполнение
Делегирование. Повышаем шансы на исполнениеSQALab
 
"Организация работы команды". Тренинг 4 курса "Управленческий Коктейль"
"Организация работы команды". Тренинг 4 курса "Управленческий Коктейль""Организация работы команды". Тренинг 4 курса "Управленческий Коктейль"
"Организация работы команды". Тренинг 4 курса "Управленческий Коктейль"Chakova Lilia
 
"Опыт миграции между дата-центрами" Сергей Бурладян и Михаил Тюрин (Avito)
"Опыт миграции между дата-центрами" Сергей Бурладян и Михаил Тюрин (Avito)"Опыт миграции между дата-центрами" Сергей Бурладян и Михаил Тюрин (Avito)
"Опыт миграции между дата-центрами" Сергей Бурладян и Михаил Тюрин (Avito)AvitoTech
 
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)AvitoTech
 
"Favicon на стероидах" Александр Амосов (Avito)
"Favicon на стероидах" Александр Амосов (Avito)"Favicon на стероидах" Александр Амосов (Avito)
"Favicon на стероидах" Александр Амосов (Avito)AvitoTech
 
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av..."Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...AvitoTech
 
"Икскод, джейсон, два скетча" Олег Фролов (Avito)
"Икскод, джейсон, два скетча" Олег Фролов (Avito)"Икскод, джейсон, два скетча" Олег Фролов (Avito)
"Икскод, джейсон, два скетча" Олег Фролов (Avito)AvitoTech
 
"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)
"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)
"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)AvitoTech
 
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)AvitoTech
 
"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)AvitoTech
 
"Ускорение сборки большого проекта на Objective-C + Swift" Иван Бондарь (Avito)
"Ускорение сборки большого проекта на Objective-C + Swift" Иван Бондарь (Avito)"Ускорение сборки большого проекта на Objective-C + Swift" Иван Бондарь (Avito)
"Ускорение сборки большого проекта на Objective-C + Swift" Иван Бондарь (Avito)AvitoTech
 
"Удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Avito)
"Удобный и расширяемый роутинг в iOS-приложении" Тимур  Юсипов (Avito)"Удобный и расширяемый роутинг в iOS-приложении" Тимур  Юсипов (Avito)
"Удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Avito)AvitoTech
 
"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов ...
"Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов ..."Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов ...
"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов ...AvitoTech
 

Viewers also liked (20)

Эффективная команда, работа, делегирование (доклад с Web camp 2013)
Эффективная команда, работа, делегирование (доклад с Web camp 2013)Эффективная команда, работа, делегирование (доклад с Web camp 2013)
Эффективная команда, работа, делегирование (доклад с Web camp 2013)
 
Делегирование как оно есть
Делегирование как оно естьДелегирование как оно есть
Делегирование как оно есть
 
Ответственность и делегирование
Ответственность и делегированиеОтветственность и делегирование
Ответственность и делегирование
 
Мастер-класс. Эффективное делегирование. Минск. Март. 2013
Мастер-класс. Эффективное делегирование. Минск. Март. 2013Мастер-класс. Эффективное делегирование. Минск. Март. 2013
Мастер-класс. Эффективное делегирование. Минск. Март. 2013
 
Вебинар "Делегирование: что, как и зачем?"
Вебинар "Делегирование: что, как и зачем?"Вебинар "Делегирование: что, как и зачем?"
Вебинар "Делегирование: что, как и зачем?"
 
Основы успешного делегирования
Основы успешного делегированияОсновы успешного делегирования
Основы успешного делегирования
 
Украденные мысли: Делегирование это любовь
Украденные мысли: Делегирование это любовьУкраденные мысли: Делегирование это любовь
Украденные мысли: Делегирование это любовь
 
Делегирование. Повышаем шансы на исполнение
Делегирование. Повышаем шансы на исполнениеДелегирование. Повышаем шансы на исполнение
Делегирование. Повышаем шансы на исполнение
 
"Организация работы команды". Тренинг 4 курса "Управленческий Коктейль"
"Организация работы команды". Тренинг 4 курса "Управленческий Коктейль""Организация работы команды". Тренинг 4 курса "Управленческий Коктейль"
"Организация работы команды". Тренинг 4 курса "Управленческий Коктейль"
 
"Опыт миграции между дата-центрами" Сергей Бурладян и Михаил Тюрин (Avito)
"Опыт миграции между дата-центрами" Сергей Бурладян и Михаил Тюрин (Avito)"Опыт миграции между дата-центрами" Сергей Бурладян и Михаил Тюрин (Avito)
"Опыт миграции между дата-центрами" Сергей Бурладян и Михаил Тюрин (Avito)
 
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
 
"Favicon на стероидах" Александр Амосов (Avito)
"Favicon на стероидах" Александр Амосов (Avito)"Favicon на стероидах" Александр Амосов (Avito)
"Favicon на стероидах" Александр Амосов (Avito)
 
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av..."Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
 
"Икскод, джейсон, два скетча" Олег Фролов (Avito)
"Икскод, джейсон, два скетча" Олег Фролов (Avito)"Икскод, джейсон, два скетча" Олег Фролов (Avito)
"Икскод, джейсон, два скетча" Олег Фролов (Avito)
 
"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)
"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)
"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)
 
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
 
"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)
 
"Ускорение сборки большого проекта на Objective-C + Swift" Иван Бондарь (Avito)
"Ускорение сборки большого проекта на Objective-C + Swift" Иван Бондарь (Avito)"Ускорение сборки большого проекта на Objective-C + Swift" Иван Бондарь (Avito)
"Ускорение сборки большого проекта на Objective-C + Swift" Иван Бондарь (Avito)
 
"Удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Avito)
"Удобный и расширяемый роутинг в iOS-приложении" Тимур  Юсипов (Avito)"Удобный и расширяемый роутинг в iOS-приложении" Тимур  Юсипов (Avito)
"Удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Avito)
 
"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов ...
"Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов ..."Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов ...
"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов ...
 

Similar to ​"Delegates, Delegates everywhere" Владимир Миронов

Kotlin Delegates: Reduce the boilerplate
Kotlin Delegates: Reduce the boilerplateKotlin Delegates: Reduce the boilerplate
Kotlin Delegates: Reduce the boilerplateDmytro Zaitsev
 
Kotlin on Android: Delegate with pleasure
Kotlin on Android: Delegate with pleasureKotlin on Android: Delegate with pleasure
Kotlin on Android: Delegate with pleasureDmytro Zaitsev
 
Scala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghScala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghStuart Roebuck
 
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...Donny Wals
 
Code generation for alternative languages
Code generation for alternative languagesCode generation for alternative languages
Code generation for alternative languagesRafael Winterhalter
 
Mastering Kotlin Standard Library
Mastering Kotlin Standard LibraryMastering Kotlin Standard Library
Mastering Kotlin Standard LibraryNelson Glauber Leal
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
Generics and Inference
Generics and InferenceGenerics and Inference
Generics and InferenceRichard Fox
 
Scala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereldScala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereldWerner Hofstra
 
Scala for Java Developers
Scala for Java DevelopersScala for Java Developers
Scala for Java DevelopersMartin Ockajak
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kirill Rozov
 
Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014Jaroslaw Palka
 
An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scalaXing
 
Lego: A brick system build by scala
Lego: A brick system build by scalaLego: A brick system build by scala
Lego: A brick system build by scalalunfu zhong
 
Scaladroids: Developing Android Apps with Scala
Scaladroids: Developing Android Apps with ScalaScaladroids: Developing Android Apps with Scala
Scaladroids: Developing Android Apps with ScalaOstap Andrusiv
 

Similar to ​"Delegates, Delegates everywhere" Владимир Миронов (20)

Kotlin Delegates: Reduce the boilerplate
Kotlin Delegates: Reduce the boilerplateKotlin Delegates: Reduce the boilerplate
Kotlin Delegates: Reduce the boilerplate
 
Kotlin on Android: Delegate with pleasure
Kotlin on Android: Delegate with pleasureKotlin on Android: Delegate with pleasure
Kotlin on Android: Delegate with pleasure
 
Scala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghScala @ TechMeetup Edinburgh
Scala @ TechMeetup Edinburgh
 
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
 
Code generation for alternative languages
Code generation for alternative languagesCode generation for alternative languages
Code generation for alternative languages
 
Mastering Kotlin Standard Library
Mastering Kotlin Standard LibraryMastering Kotlin Standard Library
Mastering Kotlin Standard Library
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
Generics and Inference
Generics and InferenceGenerics and Inference
Generics and Inference
 
Scala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereldScala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereld
 
Scala for Java Developers
Scala for Java DevelopersScala for Java Developers
Scala for Java Developers
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2
 
ppopoff
ppopoffppopoff
ppopoff
 
Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014
 
An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scala
 
Scala
ScalaScala
Scala
 
Lego: A brick system build by scala
Lego: A brick system build by scalaLego: A brick system build by scala
Lego: A brick system build by scala
 
Scaladroids: Developing Android Apps with Scala
Scaladroids: Developing Android Apps with ScalaScaladroids: Developing Android Apps with Scala
Scaladroids: Developing Android Apps with Scala
 

More from AvitoTech

Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)AvitoTech
 
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...AvitoTech
 
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)AvitoTech
 
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)AvitoTech
 
Yandex Tank - Арсений Фомченко
Yandex Tank - Арсений ФомченкоYandex Tank - Арсений Фомченко
Yandex Tank - Арсений ФомченкоAvitoTech
 
Migro - Юрий Богомолов
Migro - Юрий БогомоловMigro - Юрий Богомолов
Migro - Юрий БогомоловAvitoTech
 
TableKit - Максим Соколов
TableKit - Максим СоколовTableKit - Максим Соколов
TableKit - Максим СоколовAvitoTech
 
Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)AvitoTech
 
SimplePEG - Алексей Охрименко
SimplePEG - Алексей ОхрименкоSimplePEG - Алексей Охрименко
SimplePEG - Алексей ОхрименкоAvitoTech
 
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 Как перестать бояться и начать контрибьютить - Алексей Кудрявцев Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
Как перестать бояться и начать контрибьютить - Алексей КудрявцевAvitoTech
 
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision", Хомутников Тимофей, AvitoAvitoTech
 
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the AirAvitoTech
 
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb..."ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...AvitoTech
 
ASO for iOS 11
ASO for iOS 11ASO for iOS 11
ASO for iOS 11AvitoTech
 
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)AvitoTech
 
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...AvitoTech
 
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)AvitoTech
 
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)AvitoTech
 
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...AvitoTech
 
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий РубцовКонкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий РубцовAvitoTech
 

More from AvitoTech (20)

Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
 
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
 
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
 
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
 
Yandex Tank - Арсений Фомченко
Yandex Tank - Арсений ФомченкоYandex Tank - Арсений Фомченко
Yandex Tank - Арсений Фомченко
 
Migro - Юрий Богомолов
Migro - Юрий БогомоловMigro - Юрий Богомолов
Migro - Юрий Богомолов
 
TableKit - Максим Соколов
TableKit - Максим СоколовTableKit - Максим Соколов
TableKit - Максим Соколов
 
Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)
 
SimplePEG - Алексей Охрименко
SimplePEG - Алексей ОхрименкоSimplePEG - Алексей Охрименко
SimplePEG - Алексей Охрименко
 
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 Как перестать бояться и начать контрибьютить - Алексей Кудрявцев Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
 
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
 
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb..."ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
 
ASO for iOS 11
ASO for iOS 11ASO for iOS 11
ASO for iOS 11
 
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
 
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
 
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
 
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
 
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
 
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий РубцовКонкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
 

Recently uploaded

CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceCALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceanilsa9823
 
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost LoverPowerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost LoverPsychicRuben LoveSpells
 
9892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x79892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x7Pooja Nehwal
 
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...wyqazy
 
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Pooja Nehwal
 
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝soniya singh
 
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...Niamh verma
 
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceCALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceanilsa9823
 

Recently uploaded (8)

CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceCALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
 
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost LoverPowerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
 
9892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x79892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x7
 
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...
哪里有卖的《俄亥俄大学学历证书+俄亥俄大学文凭证书+俄亥俄大学学位证书》Q微信741003700《俄亥俄大学学位证书复制》办理俄亥俄大学毕业证成绩单|购买...
 
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
 
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Shalimar Bagh Delhi reach out to us at 🔝8264348440🔝
 
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...
Chandigarh Call Girls Service ❤️🍑 9115573837 👄🫦Independent Escort Service Cha...
 
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceCALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
 

​"Delegates, Delegates everywhere" Владимир Миронов

  • 3. Делегирование ● Очень часто используемый дизайн паттерн
  • 4. Делегирование ● Очень часто используемый дизайн паттерн ● Kotlin поддерживает делегирование на уровне языка
  • 5. Делегирование ● Очень часто используемый дизайн паттерн ● Kotlin поддерживает делегирование на уровне языка ● Два вида делегирования в Kotlin
  • 6. Делегирование ● Очень часто используемый дизайн паттерн ● Kotlin поддерживает делегирование на уровне языка ● Два вида делегирования в Kotlin ● Interface delegation
  • 7. Делегирование ● Очень часто используемый дизайн паттерн ● Kotlin поддерживает делегирование на уровне языка ● Два вида делегирования в Kotlin ● Interface delegation ● Property delegation
  • 9. Properties ● Понятие field отсутсвует на уровне языка
  • 10. Properties ● Понятие field отсутсвует на уровне языка ● Есть только property
  • 11. Properties ● Понятие field отсутсвует на уровне языка ● Есть только property ● Пара setter + getter для var и getter для val
  • 12. Properties ● Понятие field отсутсвует на уровне языка ● Есть только property ● Пара setter + getter для var и getter для val ● Все обращения происходят через getter и setter
  • 13. Properties ● Понятие field отсутсвует на уровне языка ● Есть только property ● Пара setter + getter для var и getter для val ● Все обращения происходят через getter и setter ● При необходимости у property есть backing field
  • 15. Property Delegation class HelloDelegates { var property by Delegate() }
  • 16. Property Delegation class HelloDelegates { var property by Delegate() } class HelloDelegates { private val delegate = Delegate() }
  • 17. Property Delegation class HelloDelegates { var property by Delegate() } class HelloDelegates { private val delegate = Delegate() var property: String set(value) = delegate.setValue(this, metadata, value) get() = delegate.getValue(this, metadata) }
  • 18. Property Delegation class Delegate { operator fun getValue(thisRef: Any, property: KProperty<*>): String operator fun setValue(thisRef: Any, property: KProperty<*>, value: String) }
  • 19. Property Delegation class Delegate { operator fun getValue(thisRef: Any, property: KProperty<*>): String operator fun setValue(thisRef: Any, property: KProperty<*>, value: String) } class Delegate : ReadOnlyProperty<Any, String> class Delegate : ReadWriteProperty<Any, String>
  • 20. Built-in delegates ● Delegates.notNull() ● lazy ● Delegates.observable() ● Delegates.vetoable
  • 21. Delegates.notNull() class ChatFragment : Fragment() { override fun onAttach(activity: Activity) { super.onAttach(activity) adapter = createMessagesAdapter(context) } }
  • 22. Delegates.notNull() class ChatFragment : Fragment() { private var adapter: MessagesAdapter? = null override fun onAttach(activity: Activity) { super.onAttach(activity) adapter = createMessagesAdapter(context) } }
  • 23. Delegates.notNull() class ChatFragment : Fragment() { private var adapter: MessagesAdapter? = null override fun onAttach(activity: Activity) { super.onAttach(activity) adapter = createMessagesAdapter(context) } private fun onMessagesChanged(messages: List<Message>) { adapter!!.notifyMessagedChanged(messages) } }
  • 24. Delegates.notNull() class ChatFragment : Fragment() { private var adapter: MessagesAdapter by Delegates.notNull() override fun onAttach(activity: Activity) { super.onAttach(activity) adapter = createMessagesAdapter(context) } private fun onMessagesChanged(messages: List<Message>) { adapter!!.notifyMessagedChanged(messages) } }
  • 25. Delegates.notNull() class ChatFragment : Fragment() { private var adapter: MessagesAdapter by Delegates.notNull() override fun onAttach(activity: Activity) { super.onAttach(activity) adapter = createMessagesAdapter(context) } private fun onMessagesChanged(messages: List<Message>) { adapter.notifyMessagedChanged(messages) } }
  • 26. lazy class ChatFragment : Fragment() { private val adapter by lazy(LazyThreadSafetyMode.NONE) { createMessagesAdapter(context) } private fun onMessagesChanged(messages: List<Message>) { adapter.notifyMessagedChanged(messages) } }
  • 27. Delegates.observable class ChatFragment : Fragment() { private var title by Delegates.observable("Chat") { desc, old, new -> notifyTitleChanged(new) } private fun notifyTitleChanged(title: String) { titleView.text = title } }
  • 28. Наш первый делегат public class OvalView extends View { private float radiusX = 100.0f; private float radiusY = 100.0f; }
  • 29. Наш первый делегат public class OvalView extends View { private float radiusX = 100.0f; private float radiusY = 100.0f; public void setRadiusX(float radiusX) { this.radiusX = radiusX; invalidate(); } }
  • 30. Наш первый делегат public class OvalView extends View { private float radiusX = 100.0f; private float radiusY = 100.0f; public void setRadiusX(float radiusX) { this.radiusX = radiusX; invalidate(); } public void setRadiusY(float radiusY) { this.radiusY = radiusY; invalidate(); } }
  • 31. Наш первый делегат class OvalView : View() { val radiusX by Delegates.observable(100.0f) { desc, old, new -> invalidate() } val radiusY by Delegates.observable(100.0f) { desc, old, new -> invalidate() } }
  • 32. Наш первый делегат fun <T> View.bindViewProperty(initial: T): ReadWriteProperty<Any, T> { return Delegates.observable(initial) { desc, old, new -> invalidate() } }
  • 33. Наш первый делегат fun <T> View.bindViewProperty(initial: T): ReadWriteProperty<Any, T> { return Delegates.observable(initial) { desc, old, new -> invalidate() } } class OvalView : View() { val radiusX by bindViewProperty(100.0f) val radiusY by bindViewProperty(100.0f) }
  • 34. Наш первый делегат fun <T> View.bindViewProperty(initial: T): ReadWriteProperty<Any, T> { return Delegates.observable(initial) { desc, old, new -> invalidate() } } class OvalView : View() { val radiusX by bindViewProperty(100.0f) val radiusY by bindViewProperty(100.0f) val centerX by bindViewProperty(50.0f) val centerY by bindViewProperty(50.0f) }
  • 35. Еще один простой делегат fun <V : View> Activity.bindView(id: Int): Lazy<V> { throw UnsupportedOperationException("Implement me!") }
  • 36. Еще один простой делегат fun <V : View> Activity.bindView(id: Int): Lazy<V> { return lazy(LazyThreadSafetyMode.NONE) { findViewById(id) as V } }
  • 37. Еще один простой делегат fun <V : View> Activity.bindView(id: Int): Lazy<V> { return lazy(LazyThreadSafetyMode.NONE) { findViewById(id) as V } } class UserActivity : Activity() { private val image by bindView<ImageView>(R.id.user_image) private val firstName by bindView<TextView>(R.id.user_first_name) private val lastName by bindView<TextView>(R.id.user_last_name) }
  • 39. Typesafe Bundle Builders val fragment = UserFragment() val extras = Bundle() extras.putString("firstName", "Ivan") extras.putString("lastName", "Ivanov") extras.putInt("age", 20) fragment.arguments = extras
  • 40. Typesafe Bundle Builders val fragment = UserFragment() val extras = Bundle() extras.putString("firstName", "Ivan") extras.putString("lastName", "Ivanov") extras.putInt("age", 20) fragment.arguments = extras inline fun <reified T : Any> bindArgument(bundle: Bundle, default: T? = null): BundleDelegate { throw UnsupportedOperationException() }
  • 41. Typesafe Bundle Builders class UserArguments(val extras: Bundle) { var firstName by bindArgument<String>(extras) var lastName by bindArgument<String>(extras) var age by bindArgument(extras, 33) }
  • 42. Typesafe Bundle Builders class UserArguments(val extras: Bundle) { var firstName by bindArgument<String>(extras) var lastName by bindArgument<String>(extras) var age by bindArgument(extras, 33) } val fragment = UserFragment() val arguments = UserArguments(Bundle()) arguments.firstName = "Ivan" arguments.lastName = "Ivanov" fragment.arguments = arguments.extras
  • 43. Typesafe Bundle Builders class UserFragment : Fragment() { private val args by lazy(LazyThreadSafetyMode.NONE) { UserArguments(arguments) } }
  • 44. LifecycleAware delegates class ChatFragment : BaseFragment() { private var chat by Delegates.notNull<ChatModel>() private var messages by Delegates.notNull<CollectionRange<Message>>() }
  • 45. LifecycleAware delegates class ChatFragment : BaseFragment() { private var chat by Delegates.notNull<ChatModel>() private var messages by Delegates.notNull<CollectionRange<Message>>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) chat = acquireChatModel() messages = chat.acquireMessagesRange() } }
  • 46. LifecycleAware delegates class ChatFragment : BaseFragment() { private var chat by Delegates.notNull<ChatModel>() private var messages by Delegates.notNull<CollectionRange<Message>>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) chat = acquireChatModel() messages = chat.acquireMessagesRange() } override fun onDestroy() { messages.close() chat.close() super.onDestroy() } }
  • 47. LifecycleAware delegates class ChatFragment : BaseFragment() { private val chat by bindToLifecycleEagerly(LifecycleInterval.CREATED) { acquireChatModel() } private val participants by bindToLifecycleEagerly(LifecycleInterval.CREATED) { chat.acquireParticipantsRange() } }
  • 48. Preferences delegates class DebugSettings(private val preferences: SharedPreferences) { var logEnabled: Boolean set(value) = preferences.edit().putBoolean("logEnabled", value).apply() get() = preferences.getBoolean("logEnabled", true) var logTag: String set(value) = preferences.edit().putString("logTag", value).apply() get() = preferences.getString("logTag", "Debug") }
  • 49. Preferences delegates class DebugSettings(private val preferences: SharedPreferences) { var logEnabled by bindPreference(preferences, true) var logTag by bindPreference(preferences, "Debug") }
  • 51. ReadWriteProperty и ReadOnlyProperty public interface ReadWriteProperty<in R, T> { public operator fun getValue(thisRef: R, property: KProperty<*>): T public operator fun setValue(thisRef: R, property: KProperty<*>, value: T) } public interface ReadOnlyProperty<in R, out T> { public operator fun getValue(thisRef: R, property: KProperty<*>): T }
  • 53. KProperty<T> ● Хранит в себе метаинформацию о property
  • 54. KProperty<T> ● Хранит в себе метаинформацию о property ● KProperty<T>.name: String
  • 55. KProperty<T> ● Хранит в себе метаинформацию о property ● KProperty<T>.name: String ● KProperty<T>.returnType.javaType: Class
  • 56. KProperty<T> ● Хранит в себе метаинформацию о property ● KProperty<T>.name: String ● KProperty<T>.returnType.javaType: Class ● KProperty<T>.returnType.isMarkedNullable: Boolean
  • 57. KProperty<T> ● Хранит в себе метаинформацию о property ● KProperty<T>.name: String ● KProperty<T>.returnType.javaType: Class ● KProperty<T>.returnType.isMarkedNullable: Boolean ● KProperty<T>.annotations: List<Annotation>
  • 59. KProperty<T> и Android ● По дефолту работает только KProperty.name
  • 60. KProperty<T> и Android ● По дефолту работает только KProperty.name ● Оставшимся методам необходима зависимость kotlin-reflect
  • 61. KProperty<T> и Android ● По дефолту работает только KProperty.name ● Оставшимся методам необходима зависимость kotlin-reflect ● Количество методов - 12112
  • 62. KProperty<T> и Android ● По дефолту работает только KProperty.name ● Оставшимся методам необходима зависимость kotlin-reflect ● Количество методов - 12112 ● JAR Size - 2268KB
  • 63. KProperty<T> и Android ● По дефолту работает только KProperty.name ● Оставшимся методам необходима зависимость kotlin-reflect ● Количество методов - 12112 ● JAR Size - 2268KB ● DEX size - 1726KB
  • 65. Как жить без reflection ● KProperty.name работает и так
  • 66. Как жить без reflection ● KProperty.name работает и так ● KProperty.returnType.javaType - inline reified generic функция
  • 67. Как жить без reflection ● KProperty.name работает и так ● KProperty.returnType.javaType - inline reified generic функция ● KProperty.returnType.isMarkedNullable - два разных делегата
  • 68. Как жить без reflection ● KProperty.name работает и так ● KProperty.returnType.javaType - inline reified generic функция ● KProperty.returnType.isMarkedNullable - два разных делегата inline fun <reified T : Any> bindValue(): ReadWriteProperty<Any, T> { return createRequiredDelegate(T::class.java) }
  • 69. Как жить без reflection ● KProperty.name работает и так ● KProperty.returnType.javaType - inline reified generic функция ● KProperty.returnType.isMarkedNullable - два разных делегата inline fun <reified T : Any> bindValue(): ReadWriteProperty<Any, T> { return createRequiredDelegate(T::class.java) } inline fun <reified T : Any> bindOptionalValue(): ReadWriteProperty<Any, T?> { return createOptionalDelegate(T::class.java) }
  • 70. Preferences delegates class DebugSettings(private val preferences: SharedPreferences) { var logEnabled by bindPreference(preferences, true) var logTag by bindPreference(preferences, "Debug") }
  • 71. Preferences delegates class PreferenceReadWriteProperty<T : Any>( // some arguments here ) : ReadWriteProperty<Any, T> { // implement me }
  • 72. Preferences delegates class PreferenceReadWriteProperty<T : Any>( private val preferences: SharedPreferences ) : ReadWriteProperty<Any, T> { // implement me }
  • 73. Preferences delegates class PreferenceReadWriteProperty<T : Any>( private val preferences: SharedPreferences, private val clazz: Class<T> ) : ReadWriteProperty<Any, T> { // implement me }
  • 74. Preferences delegates class PreferenceReadWriteProperty<T : Any>( private val preferences: SharedPreferences, private val clazz: Class<T>, private val default: T ) : ReadWriteProperty<Any, T> { // implement me }
  • 75. Preferences delegates class PreferenceReadWriteProperty<T : Any>( private val preferences: SharedPreferences, private val clazz: Class<T>, private val default: T, private val name: String? ) : ReadWriteProperty<Any, T> { // implement me }
  • 76. Preferences delegates override fun getValue(thisRef: Any, property: KProperty<*>): T { throw UnsupportedOperationException() }
  • 77. Preferences delegates override fun getValue(thisRef: Any, property: KProperty<*>): T { val key = name ?: property.name }
  • 78. Preferences delegates override fun getValue(thisRef: Any, property: KProperty<*>): T { val key = name ?: property.name if (!preferences.contains(key)) { return default } }
  • 79. Preferences delegates override fun getValue(thisRef: Any, property: KProperty<*>): T { val key = name ?: property.name if (!preferences.contains(key)) { return default } return when (clazz) { String::class.java -> preferences.getString(key, null) else -> throw UnsupportedOperationException() } as T }
  • 80. Preferences delegates override fun getValue(thisRef: Any, property: KProperty<*>): T { val key = name ?: property.name if (!preferences.contains(key)) { return default } return when (clazz) { String::class.java -> preferences.getString(key, null) Int::class.java -> preferences.getInt(key, 0) else -> throw UnsupportedOperationException() } as T }
  • 81. Preferences delegates override fun getValue(thisRef: Any, property: KProperty<*>): T { val key = name ?: property.name if (!preferences.contains(key)) { return default } return when (clazz) { String::class.java -> preferences.getString(key, null) Int::class.java -> preferences.getInt(key, 0) Long::class.java -> preferences.getLong(key, 0L) else -> throw UnsupportedOperationException() } as T }
  • 82. Preferences delegates override fun getValue(thisRef: Any, property: KProperty<*>): T { val key = name ?: property.name if (!preferences.contains(key)) { return default } return when (clazz) { String::class.java -> preferences.getString(key, null) Int::class.java -> preferences.getInt(key, 0) Long::class.java -> preferences.getLong(key, 0L) Boolean::class.java -> preferences.getBoolean(key, false) else -> throw UnsupportedOperationException() } as T }
  • 83. Preferences delegates override fun getValue(thisRef: Any, property: KProperty<*>): T { val key = name ?: property.name if (!preferences.contains(key)) { return default } return when (clazz) { String::class.java -> preferences.getString(key, null) Int::class.java -> preferences.getInt(key, 0) Long::class.java -> preferences.getLong(key, 0L) Boolean::class.java -> preferences.getBoolean(key, false) Float::class.java -> preferences.getFloat(key, 0.0f) else -> throw UnsupportedOperationException() } as T }
  • 84. Preferences delegates inline fun <reified T : Any> bindPreference( preferences: SharedPreferences, default: T, name: String? = null ) : ReadWriteProperty<Any, T> { return PreferenceReadWriteProperty(preferences, T::class.java, default, name) }
  • 85. Preferences delegates class DebugSettings(private val preferences: SharedPreferences) { var logEnabled by bindPreference(preferences, true) var logTag by bindPreference(preferences, "Debug") }