Kotlin kutubxonangizni qanday porlashi haqida 7 ta maslahat

Kirish

Biz yangi tilda dasturlashni boshlaganimizda, dastlab biz allaqachon biladigan tilda dasturlash paytida hosil bo'lgan paradigma va odatlarga yopishib olamiz. Garchi boshida yaxshi ko'rinishi mumkin bo'lsa-da, siz bir muncha vaqt o'z tilingizda dastur tuzmoqchi bo'lgan odamlar uchun bu qo'pollik yaqqol ko'rinib turibdi.

Men bundan ikki yil oldin Java-dan Kotlin-ga o'tganimda, men asosan "Java dasturlash lekin Kotlinda" bilan shug'ullanardim. Kotlin menga toza havo nafasi kabi tuyulgan bo'lsa ham, Android muhandisi sifatida men hamma yaxshilanmaydigan va kengaytiriladigan ma'lumot sinflaridan foydalanardim va har doim ham mos kelmasdim. Men mavjud Java kodni Kotlin-ga o'zgartirgan edim va bir muncha vaqt o'tgach, Kotlindagi turli xil qayta ishlatiladigan komponentlar yoki kutubxonalar uchun API-ni ishlab chiqqanimda bir nechta fikrlarni yodda saqlashga yordam berdi.

Bu erda biz BUXda ikkita dastur ustida ishlamoqdamiz, ular bir nechta umumiy kutubxonalarga ega. Stoklar ilovasi (hali e'lon qilinmagan) Kotlin-da boshidanoq yozilgan bo'lsa-da, birinchi CFD dasturi Java-da yozilgan va keyin biroz vaqt o'tgach Kotlin-ga aylantirilgan. Ayni paytda CFD dasturi 78,7% Kotlinni anglatadi, demak biz hozirda ishlamoqdamiz va shuning uchun Java va Kotlinni bir vaqtning o'zida ishlatadigan ikkita guruh tomonidan olib boriladigan kutubxona API-lariga e'tibor berish juda muhimdir.

Agar sizda Kotlinify-da mavjud Kotlin yoki Java-ning kutubxonasi bo'lsa yoki Kotlin-dan noldan foydalanadigan API-ni ishlab chiqayotgan bo'lsangiz, kutubxonangiz foydalanuvchilarining hayotini osonlashtirish uchun nima qilishingiz mumkinligi haqida men bilan birga bo'ling.

1. Kengaytma funktsiyalari

Ko'pincha, mavjud sinfni yangi funktsionalligi bilan kengaytirish kerak bo'lganda, siz biron bir kompozitsiyani ishlatasiz yoki yangi sinfni olasiz (agar u juda ko'p ishlatilsa, sinf ierarxiyasini IKEA dan shisha stakan singari mo'rtlashtirishi mumkin). Sizning afzal ko'rganingiz qanday bo'lishidan qat'i nazar, Kotlin o'zining kengaytma funktsiyalari deb nomlangan javobiga ega. Xulosa qilib aytganda, bu sizga mavjud sinfga juda yaxshi sintaksis yordamida yangi funktsiyani qo'shish imkonini beradi. Masalan, Android-da, View sinfining yangi usulini quyidagicha aniqlashingiz mumkin:

Shuni yodda tutgan holda, mavjud sinflar uchun qo'shimcha funktsiyalarni ta'minlaydigan ko'plab kutubxonalar (masalan, View, Kontekst va hokazo) dekorativlar, statik zavod usullari yoki boshqa biron bir narsadan foydalanish o'rniga kengaytma funktsiyalari sifatida ularning funktsional imkoniyatlarini uzluksiz taqdim etishdan foyda ko'rishi mumkin. funktsional imkoniyatlar boshlang'ich sinflarda mavjud bo'lar edi.

2. Asl argument qiymatlari

Dastlab Kotlin Java-ning ixcham, ozoda va toza versiyasi uchun yaratilgan va u standart vazifa argumentlari qiymatlari bilan buni juda yaxshi bajaradi. API provayderi rad qilinishi mumkin bo'lgan argumentlar uchun standart qiymatlarni belgilashi mumkin. Agar siz Android-da SQLite bilan ishlayotganda shunga o'xshash kodni ko'rmagan bo'lsangiz, men juda hayron bo'laman:

Bu usulning oxiridagi chirkinlardan ko'ra ko'proq kamchiliklar mavjud bo'lsa ham, men bu erda hukm qilmayman, balki bu vaqtlar o'tib ketdi va Kotlinda shunday yozilgan kodni jiddiy ravishda so'roq qilaman. Bunga o'xshash ko'plab misollar mavjud, ammo, xayriyatki, biz hozir yanada yaxshilanishimiz mumkin va agar siz tashqi API-ni Builder-ning o'rniga yoki qo'shimcha ravishda taqdim etish parametrlari bilan ta'minlasangiz, standart dalillar qiymatlaridan foydalanishni o'ylab ko'ring. Bu kamida ikkita ustunlikka ega bo'ladi: birinchidan, siz foydalanuvchini ixtiyoriy parametrlarni yoki oldindan aytib berishingiz mumkin bo'lgan narsani ko'rsatishga majburlamaysiz, ikkinchidan, foydalanuvchi odatiy konfiguratsiyaga ega bo'ladi, u shunchaki ishlamaydi -box:

Bundan tashqari, bu erda eslatib o'tadigan yaxshi narsa, agar siz ushbu dalillarni oxirida standart qiymatlarga ega bo'lsangiz, foydalanuvchi majburiy parametrlar uchun nomlarni ko'rsatishi shart emas.

3. Ob'ektlar

Singlton naqshini Java-ga o'zingiz kiritganmisiz? Ehtimol sizda bo'lgan va agar shunday bo'lsa, ba'zida bu qanchalik qiyin bo'lishi mumkinligini bilishingiz kerak:

Har birining o'ziga xos va afzalliklari bor har xil dasturlar mavjud. Kotlin Singleton naqshini amalga oshirishning barcha 50 ta soyasini ob'ekt deklaratsiyasi deb nomlangan yagona tuzilishga murojaat qiladi. Qarang, "ikkita tekshiruvsiz qulflash" yo'q:

Sintaksisdan tashqari yana bir yoqimli jihati shundaki, ob'ekt deklaratsiyasini initsializatsiyalash birinchi marotaba kirishda ham xavfsiz, ham xavfsizdir.

Fabric, Glide, Picasso yoki boshqa kutubxonalar uchun ob'ektning bitta nusxasini umumiy kutubxona API-ning asosiy kirish nuqtasi sifatida ishlatadigan har qanday boshqa kutubxonalar uchun bu endi borishning tabiiy usuli va eski Java yo'lidan foydalanish uchun hech qanday sabab yo'q. xuddi shu narsani bajaring.

4. Manba fayllari

Xuddi shu tarzda, Kotlin har kuni duch keladigan ko'plab sintaktik muammolarni qayta ko'rib chiqadi, shuningdek biz yaratgan kodni tartibga solish usulini qayta ko'rib chiqadi. Kotlin manbali fayllari bir-biriga semantik ravishda yaqin bo'lgan bir nechta deklaratsiyalar uchun uy vazifasini o'taydi. Ma'lum bo'lishicha, ular bir xil sinfga tegishli ba'zi kengaytma funktsiyalarini aniqlash uchun eng zo'r joy. Ushbu soddalashtirilgan parchani Kotlin boshlang'ich kodidan tekshiring, bu erda matnni boshqarish uchun ishlatiladigan barcha kengaytma funktsiyalari bir xil "Strings.kt" faylida joylashgan:

Undan foydalanishning yana bir mos misoli - bitta manbali fayllardagi ma'lumotlar sinflari va interfeyslar bilan birgalikda sizning API bilan aloqa protokoli. Bu foydalanuvchiga oqimni kuzatayotganda turli xil fayllarni almashtirish orqali e'tiborini yo'qotmaslik imkonini beradi:

Ammo bu bilan haddan oshib ketmang, chunki siz fayl hajmi bilan foydalanuvchini engib, ~ 13.000 satr bilan RecyclerView sinfiga aylantirish xavfi bor.

5. Koroutinlar

Agar sizning kutubxonangiz tarmoqqa kirish yoki boshqa uzoq vaqt ishlaydigan boshqa tarmoqlarni ochish uchun bir nechta tarmoqlardan foydalansa, to'xtatib turish funktsiyalari bilan API-ni ta'minlashni o'ylab ko'ring. Kotlin 1.3 dan boshlab krointinlar endi eksperimental emas, bu siz oldin shubhangiz bo'lsa, ularni ishlab chiqarishda ishlatishni boshlash uchun ajoyib imkoniyatdir. Ba'zi bir holatlarda kroutinlar RxJava-dan Oscervable va asenkron qo'ng'iroqlar bilan ishlashning boshqa usullariga yaxshi alternativ bo'lishi mumkin. Siz ilgari ko'rgan bo'lishingiz mumkin, natija qo'ng'irog'iga ega bo'lgan yoki bitta yoki tugallanadigan Rx hype paytida API bilan to'liq usul:

Ammo biz hozir Kotlin davrida yashayapmiz, shuning uchun uni korautinlardan foydalanish foydasiga o'ylab topishimiz mumkin:

Koruintinalar yengil bo'lish nuqtai nazaridan yaxshi eski Java iplaridan yaxshiroq ishlashiga qaramay, ular kodlarni o'qishga sezilarli hissa qo'shadilar:

6. Shartnomalar

Turg'un korrintinlar bilan bir qatorda, Kotlin 1.3 ishlab chiquvchilarga kompilyator bilan o'zaro ishlash usullarini ham taklif qiladi. Shartnoma - bu yangi xususiyat bo'lib, u bizga kutubxona ishlab chiqaruvchilari sifatida olingan effektlarni ko'rsatib, o'z bilimlarimizni kompilyator bilan bo'lishishga imkon beradi. Effekt nima ekanligini tushunishni osonlashtirish uchun Java-dan eng yaqin analogiyasini keltiraylik. Ko'pchiligingiz Guava shahridan oldingi sinfni ko'rgansiz yoki undan foydalangansiz, ammo Dagger kabi kutubxonalarda uni to'liq kutubxonaga olib kirishni xohlamagan holda ko'plab tasdiqlar va moslashuvlar bilan foydalangansiz:

Agar berilgan havola ob'ekti nolga teng bo'lsa, unda usul istisno qiladi va ushbu usuldan keyin qolgan kod mavjud bo'lmaydi, shuning uchun biz u erda ishlamay qolishini taxmin qilishimiz mumkin. Bu erda muammo yuzaga keladi - bizda bu ma'lumot mavjud bo'lsa ham, bu kompilyatorga xuddi shu taxminni bajarishda yordam bermaydi. Bu erda @ Nullable va @ NotNull izohlari voqea joyiga keladi, chunki ular faqat kompilyator shartlarini tushunishga yordam berish uchun mavjud. Haqiqatan ham effekt bu - bu kompilyatorga murakkab kodlarni tahlil qilishda yordam beradigan ko'rsatma. Siz allaqachon Kotlinda ko'rgan effekt - bu blokning ma'lum turini uning turini tekshirgandan so'ng aqlli quyish:

Kotlin kompilyatori allaqachon aqlli va kelgusida yanada yaxshilanishiga shubha qilmaydi, ammo Shartnomalar kiritilishi bilan Kotlin ishlab chiquvchilari bizga kutubxona ishlab chiqaruvchisi sifatida o'z aqlli dasturlarimizni yozib, foydalanuvchilarimizga yordam beradigan effektlarni yaratish orqali uni kuchaytirish imkoniyatini berishdi. tozalovchi kodni yozing. Keling, kontraktlardan foydalanib, o'z imkoniyatlarini namoyish etish uchun KotNondagi checkNotNul usulini qayta yozaylik:

Turli xil effektlar ham mavjud, ammo bu kontraktlar bilan to'liq tanishish emas va umid qilamanki, bu sizga qanday foyda ko'rish mumkinligi haqida tushuncha berdi. Bunga qo'shimcha ravishda, Github-dagi stdlib omborida tekshirishga arziydigan ko'plab kontrakt namunalari mavjud.

Katta kuch bilan katta mas'uliyat keladi va shartnomalar bundan mustasno emas. Shartnomangizda nimaiki yozsangiz, tuzuvchi uni Muqaddas Kitob sifatida qabul qiladi. Texnik jihatdan kompilyator u erda yozgan narsalaringizni so'roq qilmaydi yoki tasdiqlamaydi, shuning uchun o'zingizning kodingizni diqqat bilan tekshirishingiz va biron bir nomuvofiqliklar kiritmasligingizga ishonch hosil qilishingiz kerak.

Siz @ExperimentalContracts izohidan xabardor bo'lishingiz mumkin, kontraktlar hali ham eksperimental bosqichda, shuning uchun vaqt o'tishi bilan nafaqat API o'zgarishi mumkin, balki ba'zi yangi funktsiyalar ham takomillashib borgan sari undan kelib chiqishi mumkin.

7. Java-ning o'zaro ishlashi

Kotlindagi kutubxonani yozishda muhim bo'lgan narsa Java-ni ishlatadigan hamkasblaringizga yaxlit integratsiya tajribasini taqdim etish orqali auditoriyani kengroq qilishdir. Bu juda muhim, chunki Java-ga yopishib olgan va turli sabablarga ko'ra mavjud kodni qayta yozishni istamaydigan ko'plab loyihalar mavjud. Biz Kotlin hamjamiyatining tezroq o'sishini istaganimiz sababli, ushbu loyihalarni bosqichma-bosqich amalga oshirishga imkon berish yaxshiroqdir. Albatta, devorning bu tomonida quyoshli emas, ammo ba'zi narsalar siz kutubxona mutaxassisi sifatida qila olasiz.

Birinchidan, Java-dagi Kotlin kengaytma funktsiyalari yomon statik usullarga yig'iladi, bu erda usulning birinchi dalili qabul qiluvchi turi hisoblanadi:

Haqiqatan ham bu erda siz juda ko'p boshqaruvga ega bo'lmasangiz, hech bo'lmaganda yuqoridagi paketlar funktsiyalari mavjud manba faylining boshiga quyidagi qatorni qo'shib, yaratilgan sinf nomini o'zgartirishingiz mumkin:

Yaratilgan kodga ozgina ta'sir ko'rsatishingizning yana bir misoli sheriklik ob'ekti usullaridan foydalanish bilan bog'liq:

Siz Kotlinni @JvmStatic izohidan foydalanib, sherik ob'ektida belgilangan funktsiyalar o'rniga statik sinflar yaratishga majbur qilishingiz mumkin:

Kotlin bilan taqqoslaganda, Java-da bir xil nomga ega bo'lgan ikkita funktsiyani, ammo har xil umumiy turlarni tip o'chirilishi sababli birgalikda aniqlash mumkin emas, shuning uchun Java foydalanuvchilari uchun bu shou-stoper bo'lishi mumkin. Usulning imzosini boshqa izoh bilan o'zgartirib, undan qochishingiz mumkin deb umid qilaman.

Va eng muhimi, Java foydalanuvchilari uchun funktsiyalarda tekshirilgan istisnolarni aniqlash qobiliyati, ammo ular Kotlinda to'g'ridan-to'g'ri mavjud emas. Bu qulay bo'lishi mumkin, chunki Java va Kotlinda istisno deklaratsiyasining paradigmasi boshqacha:

Bu erda ko'p narsalar ixtiyoriy, ammo ular sizning Java foydalanuvchilaringiz kutubxonangiz uchun kudos manbai bo'lishi mumkin.

Pastki chiziq

Kotlin - bu doimiy ravishda olg'a siljigan ajoyib til va kutubxonadan unumli foydalanish uchun ko'p ish qilishingiz mumkin. Yuqoridagi g'oyalardan foydalangan narsalaringiz orasida, birinchi navbatda, foydalanuvchi bo'lishga harakat qiling va uni qanday bo'lishini va undan qanday foydalanishni o'ylab ko'ring. Iblis tafsilotlaridadir va umid qilamanki, siz qo'llaydigan bu kichik narsalar foydalanuvchilaringizga foyda keltiradi va ularning tajribalarini yaxshilaydi. Xursand bo'ling!