{"id":318471,"date":"2021-02-23T21:00:22","date_gmt":"2021-02-23T21:00:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=318471"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=318471","title":{"rendered":"\u0421\u0442\u043e\u043f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433. Kotlin. Android"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/956\/31e\/819\/95631e819a14dc6c328278f58885b1ec.png\" width=\"1640\" height=\"1546\"><figcaption><\/figcaption><\/figure>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u044f \u043d\u0430\u0434 \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u044f \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u043a\u0430\u043a \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0435 \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430 \u043d\u0430\u0437\u0430\u0434 \u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u043c. \u0418\u043d\u0436\u0435\u043d\u0435\u0440\u0430\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 &#8212; \u0432\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u0430\u0440\u0443 \u043d\u043e\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u043f\u043e\u0431\u0435\u0436\u0430\u043b\u0438 \u0434\u0430\u043b\u044c\u0448\u0435. \u0418\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043a\u0430\u0441\u0430\u044e\u0442\u0441\u044f \u0443\u0436\u0435 \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 &#8212; \u0432\u0437\u043c\u0430\u0445 \u0441\u0438\u043d\u0435\u0439 \u0438\u0437\u043e\u043b\u0435\u043d\u0442\u043e\u0439 \u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0446\u0435\u043d\u0430 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0440\u043e\u0433\u0430 \u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 &#8212; \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435&#8230; \u0410 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u0435\u0433\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u043b\u0433\u0438\u0439 \u0441\u0440\u043e\u043a?<\/p>\n<p>\u042f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0443\u0436\u0435 \u0432\u044b\u0440\u0443\u0447\u0430\u043b\u0438 \u043d\u0430\u0441 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041f\u043e\u0434\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u043d\u0430 \u043f\u0443\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0432\u0441\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b PullRequest-\u043e\u0432.<br \/>\u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u041d\u0415 \u0432\u044b\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0435 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0436\u0438\u0432\u044b\u0445 \u043b\u044e\u0434\u044f\u0445. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u044e\u0434\u0435\u0439 \u043f\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u043b\u043e.<\/p>\n<h2>\u0417\u0430\u043c\u0435\u043d\u044f\u0439\u0442\u0435 if-else \u043d\u0430 when \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e<\/h2>\n<p>\u0414\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f Java \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Android. \u0417\u0430\u0442\u0435\u043c \u043d\u0430 \u0430\u0440\u0435\u043d\u0443 \u043f\u0440\u0438\u0448\u0435\u043b Kotlin, \u0434\u0430 \u0432\u043e\u0442 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0441\u0442\u0430\u0440\u044b\u0435.<\/p>\n<pre><code class=\"kotlin\">fun getNumberSign(num: Int): String = if (num &lt; 0) {     \"negative\" } else if (num &gt; 0) {     \"positive\" } else {     \"zero\" }<\/code><\/pre>\n<p>\u041a\u0440\u0430\u0441\u0438\u0432\u043e &#8212; 7 \u0441\u0442\u0440\u043e\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0449\u0435:<\/p>\n<pre><code class=\"kotlin\">fun getNumberSign(num: Int): String = when {     num &lt; 0 -&gt; \"negative\"     num &gt; 0 -&gt; \"positive\"     else -&gt; \"zero\" }<\/code><\/pre>\n<p>\u0422\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434, \u0430 \u0441\u0442\u0440\u043e\u043a 5.<\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0438 \u043f\u0440\u043e \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435&nbsp;<code>if-else<\/code>&nbsp;\u0438 \u0435\u0433\u043e \u043d\u0435\u0447\u0438\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u043e\u0431\u0430\u0437\u044b. \u0415\u0441\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c 2 \u042f\u041f(Kotlin + Java), \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u0437\u044f\u0442\u044c \u0435\u0433\u043e \u0441\u0435\u0431\u0435 \u043d\u0430 \u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u0435. \u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u0447\u0438\u043d \u0435\u0433\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#8212; &#171;\u041d\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u2026&#187;<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f85\/bee\/c83\/f85beec8398a117715b5f8f39aaa2b91.jpg\" width=\"512\" height=\"384\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0435\u043b\u043e \u043d\u0435 \u0432 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u044f\u0445 \u0441\u0442\u0438\u043b\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u0438\u0441\u0430\u043d\u0438\u044f: \u0441\u0435\u043c\u0438\u0441\u0442\u043e\u043f\u043d\u044b\u0439 \u0434\u0430\u043a\u0442\u0438\u043b\u044c \u0438\u043b\u0438 \u043f\u044f\u0442\u0438\u0441\u0442\u043e\u043f\u043d\u044b\u0439 \u0445\u043e\u0440\u0435\u0439. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 Kotlin \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440&nbsp;<code>else-if<\/code>. \u0423\u043f\u0443\u0441\u043a\u0430\u044f \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443. \u0410 \u0432\u043e\u0442 \u0438 \u0441\u0430\u043c \u043f\u0430\u0437\u043b\u0435\u0440 \u21169 \u043e\u0442&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/338924\/\" rel=\"noopener noreferrer nofollow\">\u0410\u043d\u0442\u043e\u043d\u0430 \u041a\u0435\u043a\u0441\u0430<\/a>.<\/p>\n<p>\u042f \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c&nbsp;<code>when<\/code>&nbsp;\u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e. \u0412 Kotlin \u043d\u0435\u0442(<a href=\"https:\/\/discuss.kotlinlang.org\/t\/ternary-operator\/2116\/11\" rel=\"noopener noreferrer nofollow\">\u0438 \u043d\u0435<\/a>&nbsp;<a href=\"https:\/\/discuss.kotlinlang.org\/t\/announcement-about-closing-two-topics-and-a-code-of-conduct-reminder\/9160\" rel=\"noopener noreferrer nofollow\">\u0431\u0443\u0434\u0435\u0442<\/a>) \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0431\u0443\u043b\u0435\u0432\u044b \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0441\u0442\u043e\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0435. \u041a\u043e\u0433\u0434\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445, \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435\u0441\u044c \u0438 \u0441\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u043a\u043e\u0434 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0435\u0435.<\/p>\n<h2>\u041e\u0442\u0440\u044f\u0434 \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u0444\u043b\u0430\u0436\u043a\u043e\u0432<\/h2>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u0433\u043e \u0422\u0417 \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0435:<\/p>\n<blockquote>\n<p>1. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442<\/p>\n<\/blockquote>\n<pre><code class=\"kotlin\">data class Message(   \/\/ ...   val isDelivered: Boolean )<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u043b\u0438 \u0437\u0434\u0435\u0441\u044c \u0445\u043e\u0440\u043e\u0448\u043e? \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0430 \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c? \u0415\u0441\u0442\u044c \u043b\u0438 \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0438\u043f\u0430&nbsp;<code>Message<\/code>&nbsp;\u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u043e\u0432\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c? \u0418\u043c\u0435\u0435\u043c \u043b\u0438 \u043c\u044b \u043f\u0440\u0430\u0432\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0422\u0417 \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0441\u0442\u0443\u043b\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0440\u0443\u0448\u0438\u0442\u044c?<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d3c\/eba\/1cf\/d3ceba1cf84f50686394a8a749a6f8b5.jpg\" width=\"1280\" height=\"720\"><figcaption><\/figcaption><\/figure>\n<blockquote>\n<p>2. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442<\/p>\n<\/blockquote>\n<pre><code class=\"kotlin\">data class Message(   \/\/ ...   val isDelivered: Boolean,   val isRead: Boolean ) <\/code><\/pre>\n<p>\u041d\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u043c\u044b \u043c\u043e\u0440\u0433\u043d\u0443\u0442\u044c \u0433\u043b\u0430\u0437\u043e\u043c, \u043a\u0430\u043a ProductOwner \u043f\u0435\u0440\u0435\u0434\u0443\u043c\u0430\u043b \u0438 \u0432\u043d\u0435\u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f. \u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e? \u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 &#8212; \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 &#171;\u0440\u0435\u0448\u0438\u0442\u044c&#187; \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u041e\u0433\u043e\u0440\u0447\u0443, \u043d\u0435 \u0440\u0435\u0448\u0438\u0442\u044c &#8212; \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e\u0435. \u0418\u0437\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0437\u0434\u0435\u0441\u044c \u0438 \u0441\u0435\u0439\u0447\u0430\u0441 &#8212; must have \u043a\u0430\u0436\u0434\u043e\u0433\u043e IT \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430. \u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 &#8212; \u043e\u043f\u044b\u0442, \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430, \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e.<\/p>\n<p>\u041f\u043e\u0434 &#171;\u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e\u0435&#187; \u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e \u0444\u0430\u043a\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0435\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0430 \u0438 \u043f\u0440\u0438\u0434\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430. \u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 -&gt; \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 -&gt; \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0435 \u043f\u043e \u0441\u043c\u0435\u0442\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u0430 -&gt; \u043d\u0435\u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 -&gt; \u0443\u0432\u043e\u043b\u044c\u043d\u0435\u043d\u0438\u0435 -&gt; \u0434\u0435\u043f\u0440\u0435\u0441\u0441\u0438\u044f -&gt; \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 -&gt; \u0433\u043e\u043b\u043e\u0434 -&gt; \u0441\u043c\u0435\u0440\u0442\u044c. \u0412\u0441\u0435 \u0438\u0437-\u0437\u0430 Boolean \u0444\u043b\u0430\u0433\u0430?!!! COVID-19 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0441\u0442\u0440\u0430\u0448\u0435\u043d.<\/p>\n<p>\u0427\u0442\u043e \u043d\u0435 \u0442\u0430\u043a? \u0421\u0430\u043c \u0444\u0430\u043a\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0435 \u0435\u0441\u0442\u044c \u0433\u043b\u0443\u043f\u043e\u0441\u0442\u044c PO, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043c\u043e\u0433 \u0441\u0440\u0430\u0437\u0443 \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043c\u044b\u0441\u043b\u044c. \u041d\u0435 \u0432\u0441\u0435 \u0442\u043e, \u0447\u0442\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0440\u0430\u043d\u0435\u0435. \u0427\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043c\u0430\u043d\u0435\u0432\u0440, \u0442\u0435\u043c \u0432\u044b \u0446\u0435\u043d\u043d\u0435\u0435 \u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u0435\u0435. \u0414\u0430\u043b\u0435\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u044e \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0435\u0434\u0443\u0433\u0430\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0436\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440?<\/p>\n<blockquote>\n<p>3. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<p>4. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445 e.t.c.<\/p>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u043b\u043e\u0436\u0438\u043c \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u0432\u0441\u0435 \u043d\u043e\u0432\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442&nbsp;<code>Message<\/code>&nbsp;\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438: \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e, \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e, \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e\u2026 \u041d\u0430\u0431\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439&nbsp;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d<\/a>. \u041e\u043f\u0438\u0448\u0435\u043c \u0438\u0445 \u0438 \u0437\u0430\u043b\u043e\u0436\u0438\u043c \u0432 \u043d\u0430\u0448 \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<pre><code class=\"kotlin\">data class Message(   \/\/ ...   val state: State ) {     enum class State {         SENT,         DELIVERED,         SHOWN_IN_NOTIFICATION,         READ     } }<\/code><\/pre>\n<p>\u041d\u0430\u0431\u043e\u0440 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d. \u041c\u044b \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043c\u043e\u0436\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e, \u0442\u043e \u043e\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e\u2026 \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0437\u0430\u0431\u0435\u0433\u0443 \u0432\u043f\u0435\u0440\u0435\u0434, \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440, \u0433\u0434\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d \u044f\u0432\u043d\u043e. \u041d\u043e \u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u043e\u0441\u044c \u0432 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445? \u0412\u0435\u0434\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0430\u0436\u043d\u043e, \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c\u0438 \u0444\u043b\u0430\u0433\u0430\u043c\u0438:<\/p>\n<pre><code class=\"kotlin\">data class Message(   \/\/ ...   val states: Set&lt;State&gt; ) {   fun hasState(state: State): Boolean = states.contains(state) } \/\/ \u043b\u0438\u0431\u043e  data class Message(     \/\/ ...     val states: States ) {     enum class State(internal val flag: Int) {         SENT(1),         DELIVERED(1 shl 1),         READ(1 shl 2),         SHOWN_IN_NOTIFICATION(1 shl 3)     }      data class States internal constructor(internal val flags: Int) {         init {           check(flags and (flags+1)) { \"Expected value: flags=2^n-1\" }         }         constructor(vararg states: State): this(             states.map(State::flag).reduce { acc, flag -&gt; acc or flag }         )          fun hasState(state: State): Boolean = (flags and state.flag) == state.flag     } }<\/code><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434\u044b: \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0437\u0430\u0434\u0430\u0439\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u043c \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.&nbsp;<em>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c? \u041d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043b\u0438 \u043e\u043d \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c?<\/em>&nbsp;\u0415\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u044d\u0442\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0414\u0410-\u0414\u0410 &#8212; \u0441\u043c\u0435\u043b\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0431\u0443\u043b\u0435\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0445\u043e\u0442\u044c \u043d\u0430 \u043e\u0434\u0438\u043d \u0432\u043e\u043f\u0440\u043e\u0441 \u043e\u0442\u0432\u0435\u0442 \u041d\u0415\u0422 &#8212; \u0437\u0430\u043b\u043e\u0436\u0438\u0442\u0435 \u0434\u0435\u0442\u0435\u0440\u043c\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 &#8212; \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0439\u0442\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0431\u0443\u043b\u0435\u0432\u044b\u043c\u0438 \u0444\u043b\u0430\u0433\u0430\u043c\u0438:<\/p>\n<pre><code class=\"kotlin\">data class Message(   \/\/..   val isSent: Boolean,   val isDelivered: Boolean   val isRead: Boolean,   val isShownInNotification: Boolean )  \/\/... fun drawStatusIcon(message: Message) {   when {     message.isSent &amp;&amp; message.isDelivered &amp;&amp; message.isRead &amp;&amp; message.isShownInNotification -&gt;      \tdrawNotificationStatusIcon()     message.isSent &amp;&amp; message.isDelivered &amp;&amp; message.isRead -&gt; drawReadStatusIcon()     message.isSent &amp;&amp; message.isDelivered -&gt; drawDeliviredStatusIcon()     else -&gt; drawSentStatus()    } }<\/code><\/pre>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435(\u043e\u0448\u0438\u0431\u043a\u0443) \u0432 \u043a\u043e\u043d\u0435\u0446 \u0438 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432. \u0411\u0435\u0437 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0431\u0435\u0437 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.<\/p>\n<h2>\u041e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/h2>\n<p>\u041e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438. \u0420\u0435\u0434\u043a\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0444\u043e\u043a\u0443\u0441\u0430 \u043d\u0430\u0434 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<\/p>\n<pre><code class=\"kotlin\">data class User(     val username: String?     val hasUsername: Boolean )<\/code><\/pre>\n<p>\u041f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041d\u0430 GUI\u043d\u0435 \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u0417\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e&nbsp;<code>hasUsername<\/code>. \u041f\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f\u043c, \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<pre><code class=\"kotlin\">\/\/ OK val user1 = User(username = null, hasUsername = false)  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0435\u0441\u0442\u044c val user2 = User(username = \"user\", hasUsername = false)  \/\/ OK val user3 = User(username = \"user\", hasUsername = true)  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e, \u0430 \u0444\u043b\u0430\u0433 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u0431 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c val user4 = User(username = null, hasUsername = true)  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0443\u0441\u0442\u043e\u0435, \u0430 \u0444\u043b\u0430\u0433 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u0431 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c val user5 = User(username = \"\", hasUsername = true)  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0443\u0441\u0442\u043e\u0435, \u0430 \u0444\u043b\u0430\u0433 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u0431 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c val user6 = User(username = \" \", hasUsername = true) <\/code><\/pre>\n<p>\u0423\u0437\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430 \u0432 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0435\u0440\u0438 \u0434\u043b\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438. \u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 &#8212;&nbsp;<code>username<\/code>.<\/p>\n<pre><code class=\"kotlin\">data class User(     val username: String? ) {     fun hasUsername(): Boolean = !username.isNullOrBlank() }<\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u043c &#8212; \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0439\u0442\u0435 \u0435\u0433\u043e \u043f\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044e. \u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443 \u043d\u0430 \u0440\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043b\u0438\u0431\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0443\u0441\u0430:<\/p>\n<ul>\n<li>\n<p>\u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043b\u0438\u0431\u043e \u0437\u0430\u043b\u0435\u043d\u0438\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"kotlin\">data class User(     val username: String? ) {     val hasUsername: Boolean = !username.isNullOrBlank()     val hasUsernameLazy: Boolean by lazy { !username.isNullOrBlank() } }<\/code><\/pre>\n<ul>\n<li>\n<p>\u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"kotlin\">class UsernameHelper {     private val cache: MutableMap&lt;User, Boolean&gt; = WeakHashMap()          fun hasUsername(user: User): Boolean = cache.getOrPut(user) {        !user.username.isNullOrBlank()      } }<\/code><\/pre>\n<h2>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 &#8212; \u043d\u0435 \u043b\u0438\u0448\u043d\u0435\u0435<\/h2>\n<p>\u042f \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u044e, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439. \u041a \u043d\u0430\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u2026 \u043f\u0440\u0438\u0431\u0438\u0432\u0430\u0435\u0442 \u0433\u0432\u043e\u0437\u0434\u044f\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443. \u0421\u043f\u0443\u0441\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043c \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c, \u0438 \u043d\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0432\u043b\u0435\u0437\u0430\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438 \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e.<\/p>\n<blockquote>\n<p>\u041a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f 3rd party services \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 backend. \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d&nbsp;<strong>\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c<\/strong>&nbsp;\u044d\u0442\u0438 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<\/blockquote>\n<pre><code class=\"kotlin\">\/\/ ... val result = remoteService.getConfig() if (result is Result.Success) {   val remoteConfig = result.value.clientConfig?.keys   for (localConfigKey: ConfigKey in configKeyProvider.getConfigKeys()) {   \t  sharedPreferences.edit { putString(localConfigKey.key, remoteConfig[localConfigKey.key]) }     } } \/\/... enum class ConfigKey(val key) {   FACEBOOK(\"facebook\"),   MAPBOX(\"mapbox\"),   THIRD_PARTY(\"some_service\") }<\/code><\/pre>\n<p>\u0421\u043f\u0443\u0441\u0442\u044f N \u043d\u0435\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0442 \u0441\u043b\u0443\u0436\u0431\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u043a\u043b\u044e\u0447\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430&nbsp;<code>THIRD_PARTY<\/code>&nbsp;\u043d\u0438 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041d\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c InMemory. \u0418 \u043f\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044c \u0435\u0449\u0435 20 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0425\u043c, \u0438 \u043a\u0430\u043a \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f?<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bea\/eb3\/58d\/beaeb358dc53888b8bacbf848cdfe021.png\" width=\"1014\" height=\"658\"><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u0432\u0435\u0440\u043d\u0435\u043c \u043f\u043e\u0434 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e \u0445\u0440\u0430\u043d\u043b\u0438\u0449\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e: InMemory \/ SharedPreferences \/ Database \/ WeakInMemory\u2026 \u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0438\u043c&nbsp;<strong>SO<\/strong>LID &#8212; \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0430\u043a\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043d\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f; open-closed principle \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u044b &#171;\u043f\u0440\u0438\u043a\u0440\u044b\u0432\u0430\u0435\u043c&#187; \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"kotlin\">\/\/ ... val result = remoteService.getConfig() if (result is Result.Success) {   val remoteConfig = result.value.clientConfig?.keys   for(localConfigKey: ConfigKey in configKeyProvider.getConfigKeys()) {     \tconfigurationStorage.put(         configKey = localConfigKey,          keyValue = remoteConfig[localConfigKey.key]       )   } } \/\/.... interface ConfigKeyStorage {    fun put(configKey: ConfigKey, keyValue: String?)    fun get(configKey: ConfigKey): String    fun getOrNull(configKey: ConfigKey): String? }  internal class InMemoryConfigKeyStorage : ConfigKeyStorage { \tprivate val storageMap: MutableMap&lt;ConfigKey, String?&gt; = mutableMapOf() \t   override fun put(configKey: ConfigKey, keyValue: String?) {     storageMap[configKey] = keyValue \t}    \toverride fun get(configKey: ConfigKey): String =        requireNotNull(storageMap[configKey]) \toverride fun getOrNull(configKey: ConfigKey): String? =        storageMap[configKey] }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0432 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0435 \u0441\u0442\u043e\u044f\u043b\u043e \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u043e \u0442\u0438\u043f\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c, \u0433\u0434\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0438 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u0438 \u0431\u044b\u043b\u0438 \u0431\u044b \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0442\u0438\u043f\u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 &#8212; \u044d\u0442\u043e \u043f\u043e\u0432\u043e\u0434 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043e\u043c\u043d\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043b\u0435\u0437\u0430\u0442\u044c \u0432 N \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0437\u0430\u043c\u0435\u043d\u044b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 DI\/IoC \u0438 \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e. \u0422\u0430\u043a \u0436\u0435, \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0449\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h2>\u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044f\u0432\u043d\u043e<\/h2>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u043b\u044e\u0434\u0438. \u042f \u043d\u0430\u0445\u043e\u0436\u0443 \u0432 \u044d\u0442\u043e\u043c \u0441\u0432\u043e\u0438 \u043f\u043b\u044e\u0441\u044b, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0435\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0441\u0441\u043b\u0430\u0431\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u043a\u0430\u0436\u0434\u043e\u043c\u0443(\u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438). \u0427\u0430\u0441\u0442\u043e, \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 &#8212; \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041d\u043e \u0432\u043e\u0442 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442. \u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0437\u0430\u0432\u0442\u0440\u0430\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u0447\u0440\u0435\u0432\u0430\u0442\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0434\u0435\u043b\u044e \u0442\u044b \u0431\u0443\u0434\u0435\u0448\u044c \u0441\u0442\u0430\u0445\u0430\u043d\u043e\u0432\u0446\u0435\u043c \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u043c\u0443\u0437\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/55f\/b63\/f13\/55fb63f13f1932b27099a0a77e3ea7d6.png\" width=\"1620\" height=\"1078\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f:<\/p>\n<blockquote>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d<\/p>\n<\/blockquote>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412\u044b\u0432\u0435\u0434\u0435\u043c&nbsp;<code>null<\/code>&nbsp;\u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043c\u044f. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u0438 \u043d\u0435 \u0448\u043b\u043e \u0440\u0435\u0447\u0438 \u043e \u0442\u043e\u043c, \u043e\u0442\u043a\u0443\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0434\u0435\u043b\u043e \u0437\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0435\u0439 \u0438 \u0437\u0430\u043e\u0434\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0430\u0438\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0437 remote.<\/p>\n<pre><code class=\"kotlin\">interface UsernameRepository {     suspend fun getUsername(): String? } class RemoteUsernameRepository(     private val remoteAPI: RemoteAPI ) : UsernameRepository {     override suspend fun getUsername(): String? = try {         remoteAPI.getUsername()     } catch (throwable: Throwable) {         null     } }<\/code><\/pre>\n<p>\u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0433\u0434\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u0441\u043fe\u0448\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435&nbsp;<code>String?<\/code>&nbsp;\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0432\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f&nbsp;<code>String?<\/code>. \u041f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430, \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c&nbsp;<code>getUsername() == null<\/code>&nbsp;\u0438 \u0432\u0441\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b. \u041f\u043e \u0444\u0430\u043a\u0442\u0443, \u043c\u044b \u043d\u0435 \u0438\u043c\u0435\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0430\u043b\u0430. \u041f\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443&nbsp;<code>SuccessState === FailState<\/code>.<\/p>\n<blockquote>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435.<\/p>\n<\/blockquote>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u044f, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u0432\u0438\u043b\u043a\u0443. \u0420\u0430\u0441\u043f\u0438\u0448\u0435\u043c \u0440\u0430\u0437\u0432\u0438\u043b\u043a\u0443 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e \u0438 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e:<\/p>\n<pre><code class=\"kotlin\">interface UsernameRepository {     suspend fun getUsername(): String? } class CommonUsernameRepository(   private val remoteRepository: UsernameRepository,   private val localRepository: UsernameRepository ) : UsernameRepository {     suspend fun getUsername(): String? {         return remoteRepository.getUsername() ?: localRepository.getUsername()     } }<\/code><\/pre>\n<p>\u0418 \u0432\u043e\u0442 \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0433\u0440\u0443\u0441\u0442\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443 3 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u0438 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0432\u0435\u0440\u043d\u043e \u043b\u0438 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442&nbsp;<code>null<\/code>&nbsp;&#8212; \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f? \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043c\u044b \u043d\u0435 \u0438\u043c\u0435\u0435\u043c. \u0412\u0441\u0435 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u0440\u043d\u043e \u043b\u0438 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442&nbsp;<code>null<\/code>&nbsp;&#8212; \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0437 \u043a\u044d\u0448\u0430?<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u0440\u043d\u043e \u043b\u0438 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442&nbsp;<code>null<\/code>&nbsp;&#8212; \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u043a\u044d\u0448\u0435?<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043d\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0433\u043e. \u0414\u0430 \u0438 \u043f\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u043e\u0442 \u043d\u0430\u0441 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442. \u0410 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0435\u0441\u043b\u0438 \u0432\u0430\u0436\u0435\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442? \u0421\u043c\u0435\u0436\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 &#8212; \u0440\u0443\u0441\u043b\u043e \u043d\u0435\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u0443\u0437\u043b\u0430 \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c. \u0418\u0437\u0431\u0435\u0433\u0430\u0439\u0442\u0435 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0438. \u041d\u043e\u0432\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 &#8212; \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0440\u0430\u0448\u043d\u043e. \u042d\u0442\u043e \u0447\u0440\u0435\u0432\u0430\u0442\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<blockquote>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438 &#8212; \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0446\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<\/blockquote>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435&nbsp;<code>enum<\/code>\/<code>sealed classes<\/code>\/<code>interfaces<\/code>\/<code>abstract classes<\/code>. \u0422\u0435\u0445\u043d\u0438\u043a\u0430 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0432\u0430\u0436\u043d\u0430 \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430\u0445 \u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f &#8212;&nbsp;<code>enum<\/code>\/<code>sealed classes<\/code>. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212;&nbsp;<code>interface<\/code>\/<code>abstract classes<\/code>.<\/p>\n<pre><code class=\"kotlin\">sealed class UsernameState { \tdata class Success(val username: CharSequence?) : UsernameState()   object Failed : UsernameState() }<\/code><\/pre>\n<h2>When \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442\u044c<\/h2>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u0441\u0442\u0430\u0440\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0433\u0434\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043a\u0440\u0430\u043d.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4ed\/f88\/482\/4edf88482d9c96f5879976544229fb5e.jpg\" width=\"1333\" height=\"1616\"><figcaption><\/figcaption><\/figure>\n<pre><code class=\"kotlin\">enum class NavigationFlow {   PIN_CODE,   MAIN_SCREEN,   ONBOARDING,   CHOOSE_LANGUAGE } fun detectNavigationFlow(): NavigationFlow {     return when {         authRepo.isAuthorized() -&gt; NavigationFlow.PIN_CODE         languageRepo.defaultLanguage != null -&gt; NavigationFlow.CHOOSE_LANGUAGE         onboardingStorage.isCompleted() -&gt; NavigationFlow.MAIN_SCREEN         else -&gt; NavigationFlow.ONBOARDING     } }<\/code><\/pre>\n<p>\u041c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0422\u0430\u043a \u043f\u0440\u043e\u0449\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0442\u043e\u0440. \u041d\u043e \u0432\u043e\u0442&nbsp;<code>detectNavigationFlow<\/code>&nbsp;\u0441\u0442\u0430\u043b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0442\u044c. \u0420\u0430\u0437\u043b\u043e\u043c\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043c\u043e\u0433\u0443\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0438\u043b\u0438 \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441\u0442\u0430\u043d\u0435\u0442 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c\u2026 \u041f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u0435\u043d, \u0430 \u0448\u0430\u0433\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<pre><code class=\"kotlin\">enum class NavigationFlow {     PIN_CODE,     MAIN_SCREEN,     ONBOARDING,     CHOOSE_LANGUAGE }  \/\/ \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044f\u0432\u043d\u043e sealed class State {     data class Found(val flow: NavigationFlow) : State()     object NotFound : State() }  interface NavigationFlowProvider {     \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0435 null NavigationFlow \u0447\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0434 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043a\u0440\u0430\u043d     fun getNavigation(): NavigationFlow }  \/\/ \u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0444\u043b\u043e\u0443 \u0434\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 interface NavigationFlowResolver {     fun resolveNavigation(): State }  internal class SplashScreenNavigationFlowProvider(     \/\/ Sequence - \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f.     \/\/ \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043b\u044f\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.     private val resolvers: Sequence&lt;NavigationFlowResolver&gt; ) : NavigationFlowProvider {      override fun getNavigation(): NavigationFlow = resolvers         .map(NavigationFlowResolver::resolveNavigation)         .filterIsInstance&lt;State.Found&gt;()         .firstOrNull()?.flow         \/\/ \u0415\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u0438 - \u043f\u0440\u043e\u0445\u043e\u0434 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438         ?: NavigationFlow.MAIN_SCREEN }<\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c N-\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439&nbsp;<code>when<\/code>&nbsp;\u043d\u0430&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Chain-of-responsibility_pattern\" rel=\"noopener noreferrer nofollow\">ChainOfResponsibililty<\/a>. \u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u043c: \u043a\u043e\u0434\u0430 \u0441\u0442\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c \u043f\u043b\u044e\u0441\u044b \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/p>\n<ol>\n<li>\n<p>\u0417\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u0437 \u041e\u041e\u041f<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c SOLID<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442 \u0432 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442 \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b, \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/p>\n<\/li>\n<\/ol>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 &#8212; \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u0435\u043d\u043e \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0435 \u0431\u043e\u044f\u0441\u044c \u0437\u0430 \u043e\u0431\u0449\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u0430 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u041d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043b\u0435\u0433\u043a\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430. \u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0436\u0438\u0437\u043d\u044c \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0435. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_inversion_principle\" rel=\"noopener noreferrer nofollow\">DIP<\/a>&nbsp;\u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u0449\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435.<\/p>\n<h2>\u041d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f<\/h2>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441 \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u043d\u0438 \u043e\u0434\u0438\u043d \u043c\u0438\u043b\u043b\u0438\u043e\u043d&nbsp;<a href=\"https:\/\/habr.com\/ru\/post\/325478\/\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437<\/a>. \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u0445, \u0434\u0435\u0442\u0430\u043b\u0438 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 google. \u0425\u043e\u0447\u0443 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044c \u0442\u0435\u043c\u0443 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f &#8212; &#171;\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430&#187;. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 Android.<\/p>\n<p><strong>BaseActivity<\/strong>. \u0417\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044f \u0432 \u0441\u0442\u0430\u0440\u044b\u0435 \u043f\u0440\u043e\u043a\u0442\u044b, \u0441 \u0443\u0436\u0430\u0441\u043e\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u044e, \u043a\u0430\u043a\u0443\u044e \u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 \u043c\u044b \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u043b\u0438. \u041f\u043e\u0434 \u043c\u0430\u0441\u043a\u043e\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043c\u0435\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438 \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0432 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0430\u043a\u0442\u0438\u0432\u0438\u0442\u0438. \u0428\u043b\u0438 \u043d\u0435\u0434\u0435\u043b\u0438, \u0430\u043a\u0442\u0438\u0432\u0438\u0442\u0438 \u043e\u0431\u0440\u0430\u0441\u0442\u0430\u043b\u0438 \u043e\u0431\u0449\u0438\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0431\u0430\u0440\u0430\u043c\u0438, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0438 \u043f\u0440. \u041f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043c\u0435\u0441\u044f\u0446\u044b, \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f &#8212; \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 N \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0431\u0430\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430 \u0432\u0441\u0435\u0445 \u0434\u0440\u0443\u0433\u0438\u0445\u2026 \u041e\u0442 \u043e\u0431\u0449\u0435\u0439 \u0430\u043a\u0442\u0438\u0432\u0438\u0442\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c, \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u043d\u0430 \u0437\u043d\u0430\u0435\u0442 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0431\u0430\u0440 \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 &#8212; \u0432\u044b\u0445\u043e\u0434, \u043d\u043e \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0443\u0434\u0438\u043c\u0435\u043d\u0442 \u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0447\u0435\u0441\u0442\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044e \u0432&nbsp;<code>BaseActivity<\/code>&nbsp;&#8212; \u043e\u0431\u0438\u0434\u0435\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u0438\u2026 \u0427\u0435\u0440\u0435\u0437 \u0432\u0440\u0435\u043c\u044f \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043c\u043e\u043d\u0441\u0442\u0440\u0430 \u0432 &gt; 1000 \u0441\u0442\u0440\u043e\u043a, \u0446\u0435\u043d\u0430 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a\u0430. \u0414\u0430 \u0438 \u043d\u0435 \u043f\u043e SOLID \u044d\u0442\u043e \u0432\u0441\u0435.<\/p>\n<blockquote>\n<p>\u0410\u0433\u0430\u043e\u043a, \u043d\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435\u0445 \u044d\u043a\u0440\u0430\u043d\u0430\u0445 \u043a\u0440\u043e\u043c\u0435 2\u0445. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c?<\/p>\n<\/blockquote>\n<p>\u041d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, Android SDK \u0435\u0449\u0435 \u0441 14 \u0432\u0435\u0440\u0441\u0438\u0438&nbsp;<a href=\"https:\/\/developer.android.com\/reference\/android\/app\/Application#registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks)\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c<\/a>.&nbsp;<code>Application.ActivityLifecycleCallbacks<\/code>&nbsp;\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0440 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043b\u044e\u0431\u043e\u0439&nbsp;<code>Activity<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0449\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438 \u0440\u0430\u0437\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441.<\/p>\n<pre><code class=\"kotlin\">class App : Application(), KoinComponent {     override fun onCreate() {         super.onCreate()         \/\/ ...          registerActivityLifecycleCallbacks(SetupKoinFragmentFactoryCallbacks())     }     \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c Koin FragmentFactory \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Koin     private class SetupKoinFragmentFactoryCallbacks : EmptyActivityLifecycleCallbacks {         override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {             if (activity is FragmentActivity) {                 activity.setupKoinFragmentFactory()             }         }     } }<\/code><\/pre>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u0438\u0442\u0438. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0439:<\/p>\n<pre><code class=\"kotlin\">abstract class BaseActivity(@LayoutRes contentLayoutId: Int = 0) : AppCompatActivity(contentLayoutId) {     \/\/ attachBaseContext \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e protected     override fun attachBaseContext(newBase: Context) {         \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c extension \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0442\u0443         super.attachBaseContext(newBase.applySelectedAppLanguage())     } }<\/code><\/pre>\n<p><strong>BaseFragment<\/strong>. \u0421 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u0441\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435. \u0418\u0437\u0443\u0447\u0430\u0435\u043c&nbsp;<a href=\"https:\/\/developer.android.com\/reference\/androidx\/fragment\/app\/FragmentManager\" rel=\"noopener noreferrer nofollow\">FragmentManager<\/a>, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c&nbsp;<a href=\"https:\/\/developer.android.com\/reference\/androidx\/fragment\/app\/FragmentManager.FragmentLifecycleCallbacks\" rel=\"noopener noreferrer nofollow\">registerFragmentLifecycleCallbacks<\/a>&nbsp;&#8212; \u043f\u0440\u043e\u0444\u0438\u0442. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c&nbsp;<code>FragmentLifecycleCallbacks<\/code>&nbsp;\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0441&nbsp;<code>Activty<\/code>. \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u0431\u0430\u0437\u0435 Koin &#8212;&nbsp;<a href=\"https:\/\/github.com\/InsertKoinIO\/koin\/search?q=KoinFragmentFactory\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b. \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438 DIP \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 &#8212; Dagger, Koin, \u0441\u0432\u043e\u0435 \u0438 \u0442.\u0434. \u0410 \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u043e\u0440\u043a\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0438\u0445 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u0427\u0422\u041e\u041e\u041e\u041e? \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f &#8212; \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430? \u0414\u043e&nbsp;<a href=\"https:\/\/developer.android.com\/jetpack\/androidx\/releases\/fragment#1.1.0-alpha01\" rel=\"noopener noreferrer nofollow\">5 \u043d\u043e\u044f\u0431\u0440\u044f 2018 \u0433\u043e\u0434\u0430 \u0431\u044b\u043b\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a<\/a>, \u0442\u0435\u043f\u0435\u0440\u044c \u0436\u0435 \u0435\u0441\u0442\u044c&nbsp;<a href=\"https:\/\/developer.android.com\/reference\/androidx\/fragment\/app\/FragmentFactory\" rel=\"noopener noreferrer nofollow\">FragmentFactory<\/a>&nbsp;\u0438 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p><strong>BaseApplication<\/strong>. \u0417\u0434\u0435\u0441\u044c \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0414\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445&nbsp;<code>Flavors<\/code>&nbsp;\u0438&nbsp;<code>BuildType<\/code>&nbsp;\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439&nbsp;<code>Application<\/code>&nbsp;\u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0431\u043e\u0440\u043e\u043a. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e,&nbsp;<code>&nbsp;Application<\/code>&nbsp;\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e 3rd party \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u044d\u0442\u043e\u043c\u0443 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u043e\u0438\u0445 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0438 \u0432\u043e\u0442 \u043c\u044b \u043d\u0430 \u043f\u043e\u0440\u043e\u0433\u0435 \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443.<\/p>\n<pre><code class=\"kotlin\">interface Bootstrapper {     \/\/ KoinComponent - entry point DIP \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u043c\u0435\u0442\u043e\u0434      fun init(component: KoinComponent) } interface BootstrapperProvider {     fun provide(): Set&lt;Bootstrapper&gt; } class BootstrapperLauncher(val provider: BootstrapperProvider) {     fun launch(component: KoinComponent) {         provider.provide().onEach { it.init(component) }     } } class App : Application() {   override fun onCreate() {         super.onCreate()         \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0431\u0443\u0442\u0441\u0442\u0440\u0430\u043f\u043f\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Koin         this.get&lt;BootstrapperLauncher&gt;().launch(component = this)     } }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043a\u0438\u043b\u043e\u0442\u043e\u043d\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435&nbsp;<code>Bootstrapper<\/code>&nbsp;\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u0434 \u0447\u0438\u0449\u0435. \u041b\u0438\u0431\u043e \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043e\u0442&nbsp;<a href=\"https:\/\/developer.android.com\/topic\/libraries\/app-startup\" rel=\"noopener noreferrer nofollow\">\u0437\u0435\u043b\u0435\u043d\u043e\u0433\u043e \u0440\u043e\u0431\u043e\u0442\u0430<\/a>.<\/p>\n<h2>\u0423\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438<\/h2>\n<p>\u0418\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u044f &#8212; \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u041e\u041e\u041f \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u0441\u043a\u043e\u0443\u043f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440. \u0423\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u042d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 (<s>\u0434\u0443\u0440\u0430\u043a\u0430<\/s>)\u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u043e\u0434 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u043d \u043d\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0441\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 &#8212; \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430?<\/p>\n<p>\u0412\u044b\u0434\u0435\u043b\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.<\/p>\n<pre><code class=\"kotlin\">interface Validator {     fun validate(contact: CharSequence): ValidationResult }  sealed class ValidationResult {     object Valid : ValidationResult()      data class Invalid(@StringRes val errorRes: Int) : ValidationResult() }  class PhoneNumberValidator : Validator {     override fun validate(contact: CharSequence): ValidationResult =         if (REGEX.matches(contact)) ValidationResult.Valid          else ValidationResult.Invalid(R.string.error)      companion object {         private val REGEX = \"[0-9]{16}\".toRegex()     } }<\/code><\/pre>\n<p>\u0410 \u0440\u0430\u0437\u0432\u0435 \u043f\u043b\u043e\u0445\u043e \u0438\u043c\u0435\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432\u0441\u0435\u043c? \u041d\u043e \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u043c. \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043b\u0438\u0447\u043d\u044b\u0445 \u043d\u0443\u0436\u0434 \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044f\u0441\u044c \u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f\u0445. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0438\u043b\u0438\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u044f\u0442 &#171;\u0441\u043b\u043e\u043c\u0430\u043d\u043d\u044b\u0439&#187; \u043a\u043e\u0434 \u0432 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0441\u0440\u0435\u0434\u0443, \u0436\u0434\u0438\u0442\u0435 \u0431\u0430\u0433\u0430.<\/p>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 N \u0432\u043c\u0435\u0441\u0442\u043e&nbsp;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/MSISDN\" rel=\"noopener noreferrer nofollow\">MSISDN<\/a>&nbsp;\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c&nbsp;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/E.164\" rel=\"noopener noreferrer nofollow\">E.164<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fa6\/b87\/f2d\/fa6b87f2d89bf6757dbb7fa409dc7ddd.png\" width=\"1002\" height=\"621\"><figcaption><\/figcaption><\/figure>\n<pre><code class=\"kotlin\">class PhoneNumberValidator : Validator {     override fun validate(contact: CharSequence): ValidationResult =         if (REGEX.matches(contact)) ValidationResult.Valid          else ValidationResult.Invalid(R.string.error)      companion object {         private val REGEX = \"+[0-9]{16}\".toRegex()     } }<\/code><\/pre>\n<p>\u0414\u0430 \u0432\u043e\u0442 \u0431\u0435\u0434\u0430, \u0442\u0430\u043a\u043e\u0435 \u043d\u0430\u0433\u043b\u043e\u0435 \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0432 \u0434\u0435\u043b\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u043e\u043c\u0430\u043b\u043e \u043d\u0430\u0448\u0435 \u0441\u0442\u0430\u0440\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u044d\u043a\u0440\u0430\u043d\u0430\u0445 \u0432\u0432\u043e\u0434\u0430, \u0442\u0430\u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u043a \u043f\u043b\u044e\u0441\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0447\u0438\u0442\u0430\u044e\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430. \u041e\u043d\u0430 \u043d\u0435 \u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u0434\u0443\u043c\u0430\u043d\u043d\u0430\u044f \u0438 \u043e\u0431\u043e\u0439\u0442\u0438 \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e:<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0441 \u0440\u0435\u0433\u0435\u043a\u0441\u043e\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u043d\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434<\/p>\n<\/li>\n<\/ul>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0431\u0435\u0442\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 MSISDN \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0438 \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u0431\u044b \u0435\u0433\u043e \u0432 \u0431\u0438\u043d\u0430\u0440\u044c.<\/p>\n<pre><code class=\"kotlin\">interface Validator {     fun validate(contact: CharSequence): ValidationResult }  sealed class ValidationResult {     object Valid : ValidationResult()      data class Invalid(@StringRes val errorRes: Int) : ValidationResult() } internal class MSISDNNumberValidator : Validator { \t\/\/... \u043a\u043e\u0434 \u0432\u044b\u0448\u0435 } internal class E164NumberValidator : Validator { \t\/\/... \u043a\u043e\u0434 \u0432\u044b\u0448\u0435 }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d \u0437\u0430\u043a\u0440\u044b\u0442. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"kotlin\">interface ValidatorFactory {     fun create(type: ValidatorType): Validator?      interface ValidatorType      companion object {         fun create() : ValidatorFactory {             return DefaultValidatorFactory()         }     } } object MSISDN : ValidatorFactory.ValidatorType object E164 : ValidatorFactory.ValidatorType private class DefaultValidatorFactory : ValidatorFactory {     override fun create(type: ValidatorFactory.ValidatorType): Validator? = when(type) {         is MSISDN -&gt; MSISDNValidator()         is E164 -&gt; E164Validator()         else -&gt; null     } }<\/code><\/pre>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u0443\u0431\u0438\u043a, \u043f\u0430\u043a\u0443\u0435\u043c \u0432 \u0431\u0438\u043d\u0430\u0440\u044c \u0438 \u043e\u0442\u0434\u0430\u0435\u043c \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435. \u041f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043e\u0434 \u043e\u0442\u043a\u0440\u044b\u0442 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442 \u0434\u043b\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e &#8212; \u0441\u043c\u0435\u043b\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c&nbsp;<code>ValidatorFactory<\/code>&nbsp;\u0441 \u0444\u043e\u043b\u0431\u044d\u043a\u043e\u043c \u043d\u0430&nbsp;<code>DefaultValidatorFactory<\/code>. \u0418\u043b\u0438 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0442\u0447.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c, \u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443\u044e\u0441\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c SOLID. \u041f\u0440\u043e \u044d\u0442\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043d\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u043b\u0435\u0442 \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0442\u044e\u0433\u0430, \u043d\u043e \u043e\u043d\u0438 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b. \u041c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0439. \u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0441\u0447\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0438\u0437\u0430\u0439\u043d\u0430 \u043a\u043e\u0434\u0430? \u0420\u0435\u0448\u0430\u0442\u044c \u0432\u0430\u043c. \u041e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u0442. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u0416\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e &#8212; \u043d\u0430 \u0437\u0430\u0447\u0430\u0442\u043e\u0447\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0436\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0442\u0438 &#8212; \u043f\u0438\u0448\u0438\u0442\u0435 \u0433\u0438\u0431\u043a\u0438\u0439 \u043a\u043e\u0434. \u041d\u0435 \u043e\u0431\u043c\u0430\u043d\u044b\u0432\u0430\u0439\u0442\u0435 \u0441\u0435\u0431\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u043e\u0432\u0435\u0440\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f. \u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 2-3 \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438 \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043d\u0435\u0442. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0434 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0432\u043e\u0448\u043b\u0430 \u0432 \u0440\u0430\u0437\u0440\u044f\u0434 enterprise. \u0411\u044b\u0442\u044c \u043c\u0430\u043d\u0435\u0432\u0440\u0435\u043d\u043d\u044b\u043c &#8212; \u0437\u043e\u043b\u043e\u0442\u043e\u0439 \u043d\u0430\u0432\u044b\u043a. \u0412\u0430\u0448 \u0431\u0438\u0437\u043d\u0435\u0441 \u043d\u0435 \u0437\u0430\u0431\u0443\u043a\u0441\u0443\u0435\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0438 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u043f\u043b\u0430\u043d\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0440\u0435\u0436\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c \u043e\u0442 \u0433\u0440\u0430\u0444\u0438\u043a\u0430.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/543830\/\"> https:\/\/habr.com\/ru\/post\/543830\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u044f \u043d\u0430\u0434 \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u044f \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u043a\u0430\u043a \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0435 \u0442\u0440\u0438 \u043c\u0435\u0441\u044f\u0446\u0430 \u043d\u0430\u0437\u0430\u0434 \u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u043c. \u0418\u043d\u0436\u0435\u043d\u0435\u0440\u0430\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 &#8212; \u0432\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u0430\u0440\u0443 \u043d\u043e\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u043f\u043e\u0431\u0435\u0436\u0430\u043b\u0438 \u0434\u0430\u043b\u044c\u0448\u0435. \u0418\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043a\u0430\u0441\u0430\u044e\u0442\u0441\u044f \u0443\u0436\u0435 \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 &#8212; \u0432\u0437\u043c\u0430\u0445 \u0441\u0438\u043d\u0435\u0439 \u0438\u0437\u043e\u043b\u0435\u043d\u0442\u043e\u0439 \u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0446\u0435\u043d\u0430 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0440\u043e\u0433\u0430 \u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 &#8212; \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435&#8230; \u0410 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u0435\u0433\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u043b\u0433\u0438\u0439 \u0441\u0440\u043e\u043a?<\/p>\n<p>\u042f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0443\u0436\u0435 \u0432\u044b\u0440\u0443\u0447\u0430\u043b\u0438 \u043d\u0430\u0441 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041f\u043e\u0434\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u043d\u0430 \u043f\u0443\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0432\u0441\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b PullRequest-\u043e\u0432.<br \/>\u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u041d\u0415 \u0432\u044b\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0435 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0436\u0438\u0432\u044b\u0445 \u043b\u044e\u0434\u044f\u0445. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u044e\u0434\u0435\u0439 \u043f\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u043b\u043e.<\/p>\n<h2>\u0417\u0430\u043c\u0435\u043d\u044f\u0439\u0442\u0435 if-else \u043d\u0430 when \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e<\/h2>\n<p>\u0414\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f Java \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Android. \u0417\u0430\u0442\u0435\u043c \u043d\u0430 \u0430\u0440\u0435\u043d\u0443 \u043f\u0440\u0438\u0448\u0435\u043b Kotlin, \u0434\u0430 \u0432\u043e\u0442 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0441\u0442\u0430\u0440\u044b\u0435.<\/p>\n<pre><code class=\"kotlin\">fun getNumberSign(num: Int): String = if (num &lt; 0) {     \"negative\" } else if (num &gt; 0) {     \"positive\" } else {     \"zero\" }<\/code><\/pre>\n<p>\u041a\u0440\u0430\u0441\u0438\u0432\u043e &#8212; 7 \u0441\u0442\u0440\u043e\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0449\u0435:<\/p>\n<pre><code class=\"kotlin\">fun getNumberSign(num: Int): String = when {     num &lt; 0 -&gt; \"negative\"     num &gt; 0 -&gt; \"positive\"     else -&gt; \"zero\" }<\/code><\/pre>\n<p>\u0422\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434, \u0430 \u0441\u0442\u0440\u043e\u043a 5.<\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0438 \u043f\u0440\u043e \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435&nbsp;<code>if-else<\/code>&nbsp;\u0438 \u0435\u0433\u043e \u043d\u0435\u0447\u0438\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u043e\u0431\u0430\u0437\u044b. \u0415\u0441\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c 2 \u042f\u041f(Kotlin + Java), \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u0437\u044f\u0442\u044c \u0435\u0433\u043e \u0441\u0435\u0431\u0435 \u043d\u0430 \u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u0435. \u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u0447\u0438\u043d \u0435\u0433\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#8212; &#171;\u041d\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u2026&#187;<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0435\u043b\u043e \u043d\u0435 \u0432 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u044f\u0445 \u0441\u0442\u0438\u043b\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u0438\u0441\u0430\u043d\u0438\u044f: \u0441\u0435\u043c\u0438\u0441\u0442\u043e\u043f\u043d\u044b\u0439 \u0434\u0430\u043a\u0442\u0438\u043b\u044c \u0438\u043b\u0438 \u043f\u044f\u0442\u0438\u0441\u0442\u043e\u043f\u043d\u044b\u0439 \u0445\u043e\u0440\u0435\u0439. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 Kotlin \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440&nbsp;<code>else-if<\/code>. \u0423\u043f\u0443\u0441\u043a\u0430\u044f \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443. \u0410 \u0432\u043e\u0442 \u0438 \u0441\u0430\u043c \u043f\u0430\u0437\u043b\u0435\u0440 \u21169 \u043e\u0442&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/338924\/\" rel=\"noopener noreferrer nofollow\">\u0410\u043d\u0442\u043e\u043d\u0430 \u041a\u0435\u043a\u0441\u0430<\/a>.<\/p>\n<p>\u042f \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c&nbsp;<code>when<\/code>&nbsp;\u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e. \u0412 Kotlin \u043d\u0435\u0442(<a href=\"https:\/\/discuss.kotlinlang.org\/t\/ternary-operator\/2116\/11\" rel=\"noopener noreferrer nofollow\">\u0438 \u043d\u0435<\/a>&nbsp;<a href=\"https:\/\/discuss.kotlinlang.org\/t\/announcement-about-closing-two-topics-and-a-code-of-conduct-reminder\/9160\" rel=\"noopener noreferrer nofollow\">\u0431\u0443\u0434\u0435\u0442<\/a>) \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0431\u0443\u043b\u0435\u0432\u044b \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0441\u0442\u043e\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0435. \u041a\u043e\u0433\u0434\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445, \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435\u0441\u044c \u0438 \u0441\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u043a\u043e\u0434 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0435\u0435.<\/p>\n<h2>\u041e\u0442\u0440\u044f\u0434 \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u0444\u043b\u0430\u0436\u043a\u043e\u0432<\/h2>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u0433\u043e \u0422\u0417 \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0435:<\/p>\n<blockquote>\n<p>1. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442<\/p>\n<\/blockquote>\n<pre><code class=\"kotlin\">data class Message(   \/\/ ...   val isDelivered: Boolean )<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u043b\u0438 \u0437\u0434\u0435\u0441\u044c \u0445\u043e\u0440\u043e\u0448\u043e? \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0430 \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c? \u0415\u0441\u0442\u044c \u043b\u0438 \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0438\u043f\u0430&nbsp;<code>Message<\/code>&nbsp;\u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u043e\u0432\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c? \u0418\u043c\u0435\u0435\u043c \u043b\u0438 \u043c\u044b \u043f\u0440\u0430\u0432\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0422\u0417 \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0441\u0442\u0443\u043b\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0440\u0443\u0448\u0438\u0442\u044c?<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<blockquote>\n<p>2. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442<\/p>\n<\/blockquote>\n<pre><code class=\"kotlin\">data class Message(   \/\/ ...   val isDelivered: Boolean,   val isRead: Boolean ) <\/code><\/pre>\n<p>\u041d\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u043c\u044b \u043c\u043e\u0440\u0433\u043d\u0443\u0442\u044c \u0433\u043b\u0430\u0437\u043e\u043c, \u043a\u0430\u043a ProductOwner \u043f\u0435\u0440\u0435\u0434\u0443\u043c\u0430\u043b \u0438 \u0432\u043d\u0435\u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f. \u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e? \u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 &#8212; \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 &#171;\u0440\u0435\u0448\u0438\u0442\u044c&#187; \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u041e\u0433\u043e\u0440\u0447\u0443, \u043d\u0435 \u0440\u0435\u0448\u0438\u0442\u044c &#8212; \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e\u0435. \u0418\u0437\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0437\u0434\u0435\u0441\u044c \u0438 \u0441\u0435\u0439\u0447\u0430\u0441 &#8212; must have \u043a\u0430\u0436\u0434\u043e\u0433\u043e IT \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430. \u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 &#8212; \u043e\u043f\u044b\u0442, \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430, \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e.<\/p>\n<p>\u041f\u043e\u0434 &#171;\u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e\u0435&#187; \u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e \u0444\u0430\u043a\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0435\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0430 \u0438 \u043f\u0440\u0438\u0434\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430. \u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 -&gt; \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 -&gt; \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0435 \u043f\u043e \u0441\u043c\u0435\u0442\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u0430 -&gt; \u043d\u0435\u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 -&gt; \u0443\u0432\u043e\u043b\u044c\u043d\u0435\u043d\u0438\u0435 -&gt; \u0434\u0435\u043f\u0440\u0435\u0441\u0441\u0438\u044f -&gt; \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 -&gt; \u0433\u043e\u043b\u043e\u0434 -&gt; \u0441\u043c\u0435\u0440\u0442\u044c. \u0412\u0441\u0435 \u0438\u0437-\u0437\u0430 Boolean \u0444\u043b\u0430\u0433\u0430?!!! COVID-19 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0441\u0442\u0440\u0430\u0448\u0435\u043d.<\/p>\n<p>\u0427\u0442\u043e \u043d\u0435 \u0442\u0430\u043a? \u0421\u0430\u043c \u0444\u0430\u043a\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0435 \u0435\u0441\u0442\u044c \u0433\u043b\u0443\u043f\u043e\u0441\u0442\u044c PO, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043c\u043e\u0433 \u0441\u0440\u0430\u0437\u0443 \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043c\u044b\u0441\u043b\u044c. \u041d\u0435 \u0432\u0441\u0435 \u0442\u043e, \u0447\u0442\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0440\u0430\u043d\u0435\u0435. \u0427\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043c\u0430\u043d\u0435\u0432\u0440, \u0442\u0435\u043c \u0432\u044b \u0446\u0435\u043d\u043d\u0435\u0435 \u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u0435\u0435. \u0414\u0430\u043b\u0435\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u044e \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0435\u0434\u0443\u0433\u0430\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0436\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440?<\/p>\n<blockquote>\n<p>3. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<p>4. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445 e.t.c.<\/p>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u043b\u043e\u0436\u0438\u043c \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u0432\u0441\u0435 \u043d\u043e\u0432\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442&nbsp;<code>Message<\/code>&nbsp;\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438: \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e, \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e, \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e\u2026 \u041d\u0430\u0431\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439&nbsp;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d<\/a>. \u041e\u043f\u0438\u0448\u0435\u043c \u0438\u0445 \u0438 \u0437\u0430\u043b\u043e\u0436\u0438\u043c \u0432 \u043d\u0430\u0448 \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<pre><code class=\"kotlin\">data class Message(   \/\/ ...   val state: State ) {     enum class State {         SENT,         DELIVERED,         SHOWN_IN_NOTIFICATION,         READ     } }<\/code><\/pre>\n<p>\u041d\u0430\u0431\u043e\u0440 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d. \u041c\u044b \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043c\u043e\u0436\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e, \u0442\u043e \u043e\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e\u2026 \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0437\u0430\u0431\u0435\u0433\u0443 \u0432\u043f\u0435\u0440\u0435\u0434, \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440, \u0433\u0434\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d \u044f\u0432\u043d\u043e. \u041d\u043e \u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u043e\u0441\u044c \u0432 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445? \u0412\u0435\u0434\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0430\u0436\u043d\u043e, \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c\u0438 \u0444\u043b\u0430\u0433\u0430\u043c\u0438:<\/p>\n<pre><code class=\"kotlin\">data class Message(   \/\/ ...   val states: Set&lt;State&gt; ) {   fun hasState(state: State): Boolean = states.contains(state) } \/\/ \u043b\u0438\u0431\u043e  data class Message(     \/\/ ...     val states: States ) {     enum class State(internal val flag: Int) {         SENT(1),         DELIVERED(1 shl 1),         READ(1 shl 2),         SHOWN_IN_NOTIFICATION(1 shl 3)     }      data class States internal constructor(internal val flags: Int) {         init {           check(flags and (flags+1)) { \"Expected value: flags=2^n-1\" }         }         constructor(vararg states: State): this(             states.map(State::flag).reduce { acc, flag -&gt; acc or flag }         )          fun hasState(state: State): Boolean = (flags and state.flag) == state.flag     } }<\/code><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434\u044b: \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0437\u0430\u0434\u0430\u0439\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u043c \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.&nbsp;<em>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c? \u041d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043b\u0438 \u043e\u043d \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c?<\/em>&nbsp;\u0415\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u044d\u0442\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0414\u0410-\u0414\u0410 &#8212; \u0441\u043c\u0435\u043b\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0431\u0443\u043b\u0435\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0445\u043e\u0442\u044c \u043d\u0430 \u043e\u0434\u0438\u043d \u0432\u043e\u043f\u0440\u043e\u0441 \u043e\u0442\u0432\u0435\u0442 \u041d\u0415\u0422 &#8212; \u0437\u0430\u043b\u043e\u0436\u0438\u0442\u0435 \u0434\u0435\u0442\u0435\u0440\u043c\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 &#8212; \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0439\u0442\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0431\u0443\u043b\u0435\u0432\u044b\u043c\u0438 \u0444\u043b\u0430\u0433\u0430\u043c\u0438:<\/p>\n<pre><code class=\"kotlin\">data class Message(   \/\/..   val isSent: Boolean,   val isDelivered: Boolean   val isRead: Boolean,   val isShownInNotification: Boolean )  \/\/... fun drawStatusIcon(message: Message) {   when {     message.isSent &amp;&amp; message.isDelivered &amp;&amp; message.isRead &amp;&amp; message.isShownInNotification -&gt;      \tdrawNotificationStatusIcon()     message.isSent &amp;&amp; message.isDelivered &amp;&amp; message.isRead -&gt; drawReadStatusIcon()     message.isSent &amp;&amp; message.isDelivered -&gt; drawDeliviredStatusIcon()     else -&gt; drawSentStatus()    } }<\/code><\/pre>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435(\u043e\u0448\u0438\u0431\u043a\u0443) \u0432 \u043a\u043e\u043d\u0435\u0446 \u0438 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432. \u0411\u0435\u0437 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0431\u0435\u0437 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.<\/p>\n<h2>\u041e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/h2>\n<p>\u041e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438. \u0420\u0435\u0434\u043a\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0444\u043e\u043a\u0443\u0441\u0430 \u043d\u0430\u0434 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<\/p>\n<pre><code class=\"kotlin\">data class User(     val username: String?     val hasUsername: Boolean )<\/code><\/pre>\n<p>\u041f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041d\u0430 GUI\u043d\u0435 \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u0417\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e&nbsp;<code>hasUsername<\/code>. \u041f\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f\u043c, \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<pre><code class=\"kotlin\">\/\/ OK val user1 = User(username = null, hasUsername = false)  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0435\u0441\u0442\u044c val user2 = User(username = \"user\", hasUsername = false)  \/\/ OK val user3 = User(username = \"user\", hasUsername = true)  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e, \u0430 \u0444\u043b\u0430\u0433 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u0431 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c val user4 = User(username = null, hasUsername = true)  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0443\u0441\u0442\u043e\u0435, \u0430 \u0444\u043b\u0430\u0433 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u0431 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c val user5 = User(username = \"\", hasUsername = true)  \/\/ \u041e\u0448\u0438\u0431\u043a\u0430, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0443\u0441\u0442\u043e\u0435, \u0430 \u0444\u043b\u0430\u0433 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u0431 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c val user6 = User(username = \" \", hasUsername = true) <\/code><\/pre>\n<p>\u0423\u0437\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430 \u0432 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0435\u0440\u0438 \u0434\u043b\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438. \u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 &#8212;&nbsp;<code>username<\/code>.<\/p>\n<pre><code class=\"kotlin\">data class User(     val username: String? ) {     fun hasUsername(): Boolean = !username.isNullOrBlank() }<\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u043c &#8212; \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0439\u0442\u0435 \u0435\u0433\u043e \u043f\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044e. \u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0443 \u043d\u0430 \u0440\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043b\u0438\u0431\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0443\u0441\u0430:<\/p>\n<ul>\n<li>\n<p>\u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043b\u0438\u0431\u043e \u0437\u0430\u043b\u0435\u043d\u0438\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"kotlin\">data class User(     val username: String? ) {     val hasUsername: Boolean = !username.isNullOrBlank()     val hasUsernameLazy: Boolean by lazy { !username.isNullOrBlank() } }<\/code><\/pre>\n<ul>\n<li>\n<p>\u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"kotlin\">class UsernameHelper {     private val cache: MutableMap&lt;User, Boolean&gt; = WeakHashMap()          fun hasUsername(user: User): Boolean = cache.getOrPut(user) {        !user.username.isNullOrBlank()      } }<\/code><\/pre>\n<h2>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 &#8212; \u043d\u0435 \u043b\u0438\u0448\u043d\u0435\u0435<\/h2>\n<p>\u042f \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u044e, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439. \u041a \u043d\u0430\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u2026 \u043f\u0440\u0438\u0431\u0438\u0432\u0430\u0435\u0442 \u0433\u0432\u043e\u0437\u0434\u044f\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443. \u0421\u043f\u0443\u0441\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043c \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c, \u0438 \u043d\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0432\u043b\u0435\u0437\u0430\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438 \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e.<\/p>\n<blockquote>\n<p>\u041a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f 3rd party services \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 backend. \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d&nbsp;<strong>\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c<\/strong>&nbsp;\u044d\u0442\u0438 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<\/blockquote>\n<pre><code class=\"kotlin\">\/\/ ... val result = remoteService.getConfig() if (result is Result.Success) {   val remoteConfig = result.value.clientConfig?.keys   for (localConfigKey: ConfigKey in configKeyProvider.getConfigKeys()) {   \t  sharedPreferences.edit { putString(localConfigKey.key, remoteConfig[localConfigKey.key]) }     } } \/\/... enum class ConfigKey(val key) {   FACEBOOK(\"facebook\"),   MAPBOX(\"mapbox\"),<\/code><\/pre>\n<\/p>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-318471","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/318471","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=318471"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/318471\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=318471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=318471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=318471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}