۱۰ اکستنشن رشته ای مفید کاتلین – به زبان ساده


کاتلین یک زبان برنامهنویسی نسبتاً جدید محسوب میشود. این زبان بر مبنای جاوا ساخته شده است و کد کاتلین روی JVM کار میکند. کد کاتلین میتواند به صورت اپلیکیشنهای نیتیو (Kotlin Native) و اپلیکیشنهای نیتیو جاوا اسکریپت ( Kotlin JS) کامپایل شود. در این مقاله با 10 اکستنشن رشته ای مفید کاتلین آشنا خواهیم شد.
گوگل در سال 2017 کاتلین را به عنوان زبان رسمی برای توسعه اندروید معرفی کرد. در سال 2019 اعلام شد که اندروید یک پلتفرم Kotlin-first است. اما چرا کاتلین بهتر از جاوا است؟
- کاتلین از optional-ها پشتیبانی میکند. Optional-ها به جلوگیری از بروز کرش کمک میکنند.
- کاتلین منسجمتر است. هسته آن کوچکتر است، خواناییاش بالاتر است و نگهداری آن آسانتر محسوب میشود.
- کاتلین از اکستنشنها پشتیبانی میکند.
در این مقاله به توضیح اکستنشنهای رشتهای میپردازیم که موجب کوتاهتر، امنتر و بهبود کلی کد میشوند.
اکستنشنهای رشتهای در نسخه 1.3.7.0 کاتلین معرفی شدهاند، اما با نسخههای دیگر نیز سازگار هستند. این اکستنشنها که در این مقاله معرفی خواهیم کرد، در محیط Kotlin/Native و Kotlin/JS نیز کار میکنند.
1. محاسبهگر هش MD5/SHA
شاید از خود بپرسید چه لزومی به محاسبه MD5 یک رشته وجود دارد؟ این کار به دلایل مختلفی ممکن است لازم باشد. برای نمونه ممکن است بخواهید یک رمز عبور را در پایگاه داده ذخیره کنید، یا برخی تغییرها از طریق یک کانال غیر امن اجرا کنید و یا بررسی کنید آیا یک فایل به درستی محاسبه شده یا نه. همین موضوع در مورد هشهای SHA نیز صدق میکند.
کار خود را با MD5 آغاز میکنیم:
md5 یک مشخصه محاسبهشده دارد. ابتدا از java.security.MessageDigest برای محاسبه هش MD5 به صورت آرایه بایتی استفاده میکنیم. سپس آرایه بایتی را به رشته hex تبدیل میکنیم.
SHA-1 اختصاری برای عبارت «الگوریتم هش امن -1» (Secure Hash Algorithm — 1) است. به طور کلی SHA به گروهی از الگوریتمها گفته میشود. تفاوتی بین آنها از نظر برنامهنویسی وجود ندارد و تنها نام الگوریتم در فراخوانی ()MessageDigest.getInstance عوض میشود:
شیوه استفاده
برای استفاده از این محاسبهگرهای هش از کدی مانند زیر استفاده میکنیم:
2. بررسی این که یک رشته، نشانی ایمیل معتبری باشد
بررسی اعتبارسنجی یک نشانی ایمیل قابلیت بسیار رایجی محسوب میشود. تقریباً اغلب اپلیکیشنهای اندروید کاربر را ملزم به ثبت نام میکنند. اغلب آنها هم از روش ثبت نام با ایمیل و رمز عبور استفاده میکنند. بنابراین بهتر است که نشانی ایمیل وارد شده از سوی کاربر را پیش از ارسال به سرور و به هدر دادن پهنای باند و تحویل یک فراخوانی ثبت نام/ورود ناموفق، در خود اپلیکیشن مورد اعتبارسنجی قرار دهیم. اگر یک توسعهدهنده بکاند باشید، اعتبارسنجی نشانی ایمیل پیش از ذخیره آن در پایگاه داده اهمیتی حیاتی دارد.
سادهترین روش برای اعتبارسنجی یک ایمیل، استفاده از «عبارتهای منظم» (regular expressions) است.. بسته به نیازهایتان میتوانید یک عبارت منظم تهیه کنید. ما استفاده از عبارت منظم زیر را پیشنهاد میکنیم:
این عبارت یک تابع ارائه میکند، اما مشخصه محاسبهشده نیز یک گزینه محسوب میشود.
شیوه استفاده
برای استفاده از عبارت منظم فوق جهت اعتبارسنجی نشانی ایمیل میتوانید به صورت زیر عمل کنید:
3. اعتبارسنجی و قالببندی شماره تلفن
شماره تلفن نیز همانند ایمیل یک روش متداول برای ثبت نام کاربر است که باید اعتبار سنجی شود و بررسی قالببندی آن شاید حتی اهمیت بیشتری داشته باشد. شماره تلفن تنها بر حسب شماره کد کشور یکتا است، اما کاربران معمولاً کد کشور را وارد نمیکنند، چون غالباً از روش وارد کردن نام کشور یا تعیین پرچم آن استفاده میکنند. بنابراین این روش متفاوت از ایمیل است.
همچنین شمارههای تلفن کشورهای مختلف، قالببندیهای متفاوتی دارند. به همین جهت است که برای انجام این کار به یک کتابخانه اکسترنال نیاز داریم.
برای کد JVM یک کتابخانه از سوی گوگل به نام libphonenumber ارائه شده است. برای اندروید یک نسخه خاص از آن به نام libphonenumber-android وجود دارد که تقریباً مشابه نسخه اصلی است.
نسخه JVM
این تابع یک شماره تلفن قالببندیشده بازگشت میدهد که با علامت + آغاز میشود و سپس کد کشور میآید اگر اپلیکیشن صرفاً برای یک کشور عرضه شده باشد، میتوان این مقدار را هاردکد کرد.
شیوه استفاده
در کد زیر روش استفاده از این کتابخانه نمایش یافته است:
نسخه اندروید
این تابع در صورتی که شماره تلفن معتبر باشد، آن شماره تلفن قالببندیشده را با علامت بعلاوه و کد کشور آغاز میشود، بازگشت میدهد. در غیر این صورت مقدار nill بازگشت خواهد یافت. آرگومان نخست Context اندروید برای مثال Activity است.
شیوه استفاده
در کد زیر روش استفاده از کتابخانه فوق را در کد اندروید میبینید:
4. بررسی موارد داخلی
شاید برایتان پیش آمده باشد که بخواهید بدانید داخل یک رشته چیست؟ برای مثال آیا داخل رشته، یک عدد، یک کلمه یا یک رمز عبور با کاراکترهای خاص قرار دارد. برخی اوقات برای این که بدانیم در ادامه باید چه کار کنیم باید ابتدا این اطلاعات را در اختیار داشته باشیم. به این منظور یک اکستنشن مینویسیم:
شیوه استفاده
در مثال زیر روش استفاده از این اکستنشن را میبینید:
فرض کنید میخواهیم بررسی کنیم آیا یک رمز عبور معتبر است یا نه. این کار در مورد تعیین رمزهای عبور جدید ضروری است. رمز عبور جدید باید یک رقم، یک حرف لاتین و یک کاراکتر غیر حرف و عدد داشته باشد. ضمناً نباید فاصله به جز در مورد کاراکترهای اول و آخر داشته باشد، چون این موارد را میتوانیم حذف کنیم. آخرین الزام اعتبارسنجی، طول رمز عبور است که باید بین شش تا 20 کاراکتر باشد.
در این حالت از کد زیر استفاده میکنیم:
5. ذخیرهسازی و بازیابی تنظیمات لوکال
این اکستنشن خاص اندروید است. کاتلین یک زبان رسمی برای توسعه اندروید محسوب میشود. امروزه اغلب اپلیکیشنهای پلی استور از کاتلین استفاده میکنند. زمان توسعه کوتاهتر شده و کیفیت افزایش یافته و همزمان سازگاری و تفسیرپذیری کاملی با جاوا دارد. اپلیکیشنهای اندرویدی چند روش برای ذخیرهسازی تنظیمات لوکال دارند، اما سادهترین روش استفاده از SharedPreferences است:
آرگومان نخست applicationContext: Context است. اگر تابع را از Activity اجرا کنید، خودش را و شاید بهتر از آن applicationContext ارسال میکند. آرگومان دوم value: Map<String, Any> است. مپها در کاتلین به سادگی ایجاد شده و به آسانی استفاده میشوند. در این اکستنشن Any میتواند یک مقدار غیر تهی داشته باشد، اما تنها پنج نوع Int, Float, Long, Boolean و String ذخیره میشوند.
در صورتی که همه فیلدهای SharedPreferences که در value نیستند را بخواهیم از SharedPreferences پاک کنیم، آرگومان clear باید مقدار true داشته باشد. نکته دیگر در مورد SharedPreferences به ذخیرهسازی پسزمینه مربوط است. دو روش برای ذخیره به صورتهای SharedPreferences: commit و apply وجود دارند. تفاوت در این است که commit تغییرها را بیدرنگ اعمال میکند، اما ذخیره بیدرنگ را تضمین نمیکند. در اغلب موارد بهتر است از apply استفاده کنید، به همین دلایل است که آرگومان now باید تقریباً همیشه مقدار false داشته باشد.
شیوه استفاده
در مثال زیر شیوه استفاده از این اکستنشن برای ذخیرهسازی تنظیمات یک بازی را میبینید:
توجه کنید که در کد فوق SharedPreferences با apply ذخیره شده است. همزمان میتوان بیدرنگ از آن استفاده کرد. دلیل این امر آن است که SharedPreferences در حافظه گوشی ذخیره میشود. اگر اپلیکیشن در همین لحظه کرش کند؛، این احتمال به خصوص در مواردی که مقدار حجیمی باشد، وجود دارد که مقدار ذخیره نشده باشد.
6. تجزیه JSON از یک رشته
جاوا و کاتلین امکان تجزیه یک JSON را به صورت کلاسهای JSONObject یا JSONArray فراهم ساختهاند.
در این بخش یک ویرایش جزئی روی اینها انجام میدهیم تا سریعتر و بدون استثنا کار کنند. اگر string شامل یک JSON معتبر باشد، تابع زیر JSONObject یا JSONArray و در غیر این صورت مقدار null بازگشت میدهد.
شیوه استفاده
در مثال زیر روش تجزیه یک رشته JSON و تبدیل مجدد آن به Striong را میبینید:
7. کامپوننت آخرین مسیر
Apple Foundation یک مشخصه بسیار مفید به نام lastPathComponent دارد. اگر String شامل یک مسیر یا URL باشد، کامپوننت آخر (یعنی پس از /) بازگشت مییابد. در این بخش این قابلیت را در کاتلین ایجاد میکنیم:
اما قبل از آن باید دو نکته را مورد اشاره قرار دهیم:
- مسیر میتواند با اسلش پایانی خاتمه یابد. تابع اکستنشن باید کامپوننت مسیر قبل از آن را بازگشت دهد، چون در غیر این صورت URL-ها پردازش نمیشوند.
- برخی سیستمها (مانند ویندوز مایکروسافت) به جای اسلش از بکاسلش استفاده میکنند. این مورد را نیز باید مدیریت کنیم:
شیوه استفاده
در مثال زیر روش استفاده از این اکستنشن را میبینید:
8. استخراج رنگ از رشته
رنگ در محیطهای مختلف به روش متفاوتی نمایش مییابد. اندروید از اعداد صحیح ساده استفاده میکند. اندروید یک کلاس Color دارد، اما این کلاس صرفاً شامل تابعهای کمکی است. بازنمایی رنگ، دیگر کلاس Color مربوط به AWT است که چهار مقدار صحیح را برای اجزای قرمز، سبز، آبی و آلفای رنگها شامل میشود.
تجزیه رشته hex به رنگ AWT
شیوه استفاده
در مثال زیر روش استفاده از این اکستنشن توضیح داده شده است:
تجزیه رشته به رنگ Android
این کلاس یک Int بازگشت میدهد، زیرا اندروید در نماهای خود از مقادیر Int استفاده میکند.
شیوه استفاده
ممکن است بپرسید حال که قرار است یک خط کد را با خط دیگری جایگزین کنیم، چرا باید از اکستنشن استفاده کنیم؟ به مثال زیر توجه کنید:
دو تفاوت وجود دارد:
- اکستنشن asColor میتواند به صورت زنجیرهای برای مثال مانند زیر مورد استفاده قرار گیرد:
()hexString.asColor?.toString - به جای استثنا از null استفاده میکنیم. دیگر لازم نیست از بلوک try-catch استفاده کنید، چون در صورتی که مقدار رنگ معتبر نباشد، صرفاً مقدار null ارائه میشود.
9. قالببندی رشته به صورت شماره کارت بانکی
برخی اپلیکیشنهای اندرویدی محصولها یا سرویسهایی را میفروشند که امکان فروش به صورت خرید درونبرنامهای ندارند. سرور اپ استور برای جاوا اقدام به استفاده و نمایش شماره کارت بانکی به کاربر میکند. به طور معمول اپلیکیشنها این شماره کارت بانکی را به صورت String بدون فاصله ذخیره میکنند. اما خواندن یک شماره 16 رقمی بدون جداسازی ارقام برای کاربران آسان نیست. یک اکستنشن ساده میتواند پس از هر چهار کاراکتر رشته یک فاصل اضافه کند:
شیوه استفاده
در مثال زیر روش استفاده از این اکستنشن را میبینید:
10. کار امن با JSON
JSON و XML دو قالب رایج برای بارگذاری، ذخیره و تبادل دادهها هستند. تصور فراخوانی یک API بدون استفاده از این قالبها کار دشواری است. جاوا کلاسهای نسبتاً خوبی برای کار با این قالبها ارائه کرده است که شامل JSONObject و JSONArray میشود. کاتلین میتواند از هر کلاس جاوا استفاده کند، بنابراین روش کاتلین برای تجزیه و نوشتن JSON نیز چنین است. JSONObject و JSONArray روی اندروید در اختیار ما هستند.
شاید بپرسید چرا باید این کلاس را بسط دهیم؟ مشکل اینجا است که این کلاسها، اگر چیزی نادرست باشد، یک استثنا ایجاد میکنند. برای نمونه اگر تلاش کنید نوع داده نادرستی را به دست آورید، یا اگر به فیلدی که وجود ندارد، ارجاع دهید، چنین مشکلی پیش میآید.
البته استثناها ذاتاً مشکلی ندارند. استثنا یک روش خوب برای مدریت چنین موقعیتهایی محسوب میشود. اما گاهی اوقات لازم است که تنها فیلدهای موجود را به دست آوریم و فیلدهایی که در پاسخ API وجود ندارند را نادیده بگیریم. بدون استفاده از اکستنشن این کار به صورت زیر انجام مییابد:
چنان که میبینید کدی طولانی است. اکنون تصور کنید سرور به جای null مقدار "null" بازگشت دهد. کد برای هر فیلد افزایش مییابد.
این موقعیت با استفاده از یک اکستنشن مانند زیر حل میشود:
این اکستنشن برخی قابلیتهای جانبی مانند حذف فاصلههای ابتدایی و انتهایی رشتهها را نیز دارد. بهتر است این اکستنشن را قبل از کپی کردن به پروژه به دقت بررسی کنید. قابلیتهای مانند جایگزینی "null" به جای null را میتوان به صورت زیر اضافه کرد:
شیوه استفاده
نکته: یک روش جایگزین برای تجزیه JSON، استفاده از کتابخانههای اکسترنال مانند GSON یا Moshi است.
سخن پایانی
شما چه یک توسعهدهنده JVM، توسعهدهنده اندروید و یا توسعهدهنده کاتلین نیتیو باشد، در هر حال مطالبی که در این راهنما در خصوص اکستنشنهای رشتهای کاتلین ارائه شد، برای شما مفید خواهند بود.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش مقدماتی زبان برنامه نویسی کاتلین (Kotlin) برای توسعه اندروید (Android)
- مجموعه آموزشهای برنامهنویسی اندروید
- زبان برنامه نویسی کاتلین (Kotlin) — راهنمای کاربردی
- کلاس inline در کاتلین — از صفر تا صد
==