🔥 توابع مرتبهبالا (Higher-order functions) تو «کاتلین» یه ابزار قدرتمند برای نوشتن کد تمیز و قابل استفاده مجدد هستن. یعنی تابعی که یا تابع دیگهای رو به عنوان ورودی میگیره، یا یک تابع رو برمیگردونه. این کار کدت رو انعطافپذیر میکنه.
📌 توی پروژههای واقعی مثلاً میخوای عملیات تکراری مثل نمایش پیام خطا یا ذخیره اطلاعات رو با رفتارهای مختلف یکپارچه کنی. بهجای نوشتن چندین تابع جدا، میتونی یک تابع مرتبهبالا بنویسی که تابع مورد نظر رو بهش پاس بدی.
🧩 بیایم یه مثال ساده بزنیم:
📝 این کد یه تابع مرتبهبالا به اسم «performOperation» داره که دو عدد و یه تابع به اسم «operation» میگیره. بعد توی «main» دو بار با عملیات جمع و ضرب صدا زده شده. نتیجه: بدون تکرار کد، دو رفتار متفاوت داریم.
🎯 نکته مهم: ازش تو «Jetpack Compose» برای مدیریت رویدادها و ترکیبهای شرطی استفاده میکنن. مثلاً تو «StateFlow» و «Callback»ها خیلی به کار میاد.
💡 نتیجه: یادگیری توابع مرتبهبالا کدتو خشکتر و خواناتر میکنه. حتماً تمرین کن.
#Codeit #Android #Kotlin #Jetpack #HigherOrderFunctions #FunctionalProgramming #CleanCode #KotlinTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
📌 توی پروژههای واقعی مثلاً میخوای عملیات تکراری مثل نمایش پیام خطا یا ذخیره اطلاعات رو با رفتارهای مختلف یکپارچه کنی. بهجای نوشتن چندین تابع جدا، میتونی یک تابع مرتبهبالا بنویسی که تابع مورد نظر رو بهش پاس بدی.
🧩 بیایم یه مثال ساده بزنیم:
fun performOperation(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
fun main() {
val sum = performOperation(5, 3) { x, y -> x + y }
val product = performOperation(5, 3) { x, y -> x * y }
println("Sum: $sum, Product: $product")
}
📝 این کد یه تابع مرتبهبالا به اسم «performOperation» داره که دو عدد و یه تابع به اسم «operation» میگیره. بعد توی «main» دو بار با عملیات جمع و ضرب صدا زده شده. نتیجه: بدون تکرار کد، دو رفتار متفاوت داریم.
🎯 نکته مهم: ازش تو «Jetpack Compose» برای مدیریت رویدادها و ترکیبهای شرطی استفاده میکنن. مثلاً تو «StateFlow» و «Callback»ها خیلی به کار میاد.
💡 نتیجه: یادگیری توابع مرتبهبالا کدتو خشکتر و خواناتر میکنه. حتماً تمرین کن.
#Codeit #Android #Kotlin #Jetpack #HigherOrderFunctions #FunctionalProgramming #CleanCode #KotlinTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1🥰1
🔹آیا تابهحال تابعی نوشتهاید که فقط برای یک نوع داده کار کند و مجبور شدهاید بارها کد تکراری بنویسید؟
🔸«Generics» در «Kotlin» این مشکل را یکبار برای همیشه حل میکند.
💡 Generics چیست؟
به شما اجازه میدهد کلاسها، توابع و اینترفیسها را بدون وابستگی به یک نوع خاص تعریف کنید و همزمان «Type Safety» را حفظ کنید.
🛠️ مثال عملی:
یک کلاس جعبه (Box) میسازیم که بتواند هر نوع دادهای را ذخیره کند:
✅ این کد نشان میدهد که چگونه با یک کلاس «Generic»، هم از رشته و هم از عدد بدون خطا استفاده میکنیم.
🔐 «Type Safety» در زمان کامپایل تضمین میشود و نیازی به «Casting» دستی نیست.
🧠 نکته کلیدی:
از «Generics» در لیستها، «LiveData»، «Repository»، و حتی «ViewModel» هم استفاده میشود. مثلاً «MutableList<T>» یا «LiveData<T>».
📌 جمعبندی:
با «Generics» کدتان انعطافپذیرتر، قابل استفاده مجدد و امنتر میشود.
📅 امروز یک کلاس «Generic» بنویسید و قدرت آن را لمس کنید.
#Codeit #Android #Kotlin #Jetpack #Generics #TypeSafety #CleanCode #KotlinTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔸«Generics» در «Kotlin» این مشکل را یکبار برای همیشه حل میکند.
💡 Generics چیست؟
به شما اجازه میدهد کلاسها، توابع و اینترفیسها را بدون وابستگی به یک نوع خاص تعریف کنید و همزمان «Type Safety» را حفظ کنید.
🛠️ مثال عملی:
یک کلاس جعبه (Box) میسازیم که بتواند هر نوع دادهای را ذخیره کند:
class Box<T>(private val item: T) {
fun getContent(): T = item
}
fun main() {
val stringBox = Box<String>("Hello")
val intBox = Box<Int>(42)
println(stringBox.getContent()) // Hello
println(intBox.getContent()) // 42
}
✅ این کد نشان میدهد که چگونه با یک کلاس «Generic»، هم از رشته و هم از عدد بدون خطا استفاده میکنیم.
🔐 «Type Safety» در زمان کامپایل تضمین میشود و نیازی به «Casting» دستی نیست.
🧠 نکته کلیدی:
از «Generics» در لیستها، «LiveData»، «Repository»، و حتی «ViewModel» هم استفاده میشود. مثلاً «MutableList<T>» یا «LiveData<T>».
📌 جمعبندی:
با «Generics» کدتان انعطافپذیرتر، قابل استفاده مجدد و امنتر میشود.
📅 امروز یک کلاس «Generic» بنویسید و قدرت آن را لمس کنید.
#Codeit #Android #Kotlin #Jetpack #Generics #TypeSafety #CleanCode #KotlinTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🥰1
🔰 عادتهای روزانهی «Senior Developer»ها رو میدونی؟ 🧠
روزهایی که فقط کد میزنن و تموم میشه، گذشته… 🙌
یک «Senior Developer» واقعی هر روز چند کار ساده اما حیاتی انجام میده:
۱. صبحها کد قدیمی خودش رو مرور میکنه 👀
۲. قبل از نوشتن یک خط کد، معماری مسئله رو روی کاغذ میکشه ✍️
۳. روزش رو با مطالعهی مستندات «API»ها شروع میکنه 📚
۴. حتماً یک ساعت رو به یادگیری تکنولوژی جدید اختصاص میده (حتی ۱۵ دقیقه) ⏳
۵. کدش رو قبل از «Code Review» خودش بررسی میکنه 🔍
۶. با تیمش ارتباط شفاف داره و سوالات «بهظاهر احمقانه» رو میپرسه 🗣️
این عادتها باعث میشه اعتمادبهنفس و کیفیت کار به مرور زمان چند برابر بشه. 🚀
💡 نکتهی عملی:
همین امروز یک تایمر ۲۵ دقیقهای بذار و فقط روی مستندات یک «API» یا یک «Library» جدید تمرکز کن. بعد از ۲۵ دقیقه، یک یادداشت کوتاه ازش بنویس.
یادت باشه: «Senior» شدن با تعداد سالها اندازهگیری نمیشه، بلکه با عادتهای روزانهای که داری. 🎯
#Codeit #Android #Kotlin #Jetpack #DeveloperHabits #SeniorDeveloper #CleanCode #GrowthMindset
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
روزهایی که فقط کد میزنن و تموم میشه، گذشته… 🙌
یک «Senior Developer» واقعی هر روز چند کار ساده اما حیاتی انجام میده:
۱. صبحها کد قدیمی خودش رو مرور میکنه 👀
۲. قبل از نوشتن یک خط کد، معماری مسئله رو روی کاغذ میکشه ✍️
۳. روزش رو با مطالعهی مستندات «API»ها شروع میکنه 📚
۴. حتماً یک ساعت رو به یادگیری تکنولوژی جدید اختصاص میده (حتی ۱۵ دقیقه) ⏳
۵. کدش رو قبل از «Code Review» خودش بررسی میکنه 🔍
۶. با تیمش ارتباط شفاف داره و سوالات «بهظاهر احمقانه» رو میپرسه 🗣️
این عادتها باعث میشه اعتمادبهنفس و کیفیت کار به مرور زمان چند برابر بشه. 🚀
💡 نکتهی عملی:
همین امروز یک تایمر ۲۵ دقیقهای بذار و فقط روی مستندات یک «API» یا یک «Library» جدید تمرکز کن. بعد از ۲۵ دقیقه، یک یادداشت کوتاه ازش بنویس.
یادت باشه: «Senior» شدن با تعداد سالها اندازهگیری نمیشه، بلکه با عادتهای روزانهای که داری. 🎯
#Codeit #Android #Kotlin #Jetpack #DeveloperHabits #SeniorDeveloper #CleanCode #GrowthMindset
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
🔥 استثناها رو قورت نده! مدیریت حرفهای خطاها با «try» و «catch» در «Kotlin» 🚀
برنامهنویس حرفهای کسی نیست که بدون خطا کد بزنه، کسیست که میدونه چطور با خطاها برخورد کنه. توی «Kotlin» مدیریت استثناها با «try-catch» ساده و قدرتمنده.
❌ تصور کن کاربر متنی رو وارد کنه که عدد نیست و برنامه کرش کنه! این اصلاً حرفهای نیست.
✅ باید پیشبینی کنی که ممکنه خطا رخ بده و با «try-catch» کنترلش کنی.
📌 کاربرد واقعی: وقتی از کاربر ورودی میگیری، حتماً از «try-catch» برای تبدیل امن استفاده کن.
مثال عملی: عدد از کاربر بگیر و اگر اشتباه وارد کرد، خطا رو مدیریت کن:
این تابع اگر کاربر عدد وارد نکنه، به جای کرش، پیام خطا چاپ میکنه و null برمیگردونه. بعدش میتونی با شرط بررسی کنی.
💡 نکته مهم: همیشه «catch» رو برای نوع خاصی از استثنا بنویس، نه همه خطاها. از «Exception» عمومی فقط در مواقع ضروری استفاده کن.
🎯 نتیجه: کدت پایدارتر میشه، کاربر تجربه بهتری داره و دیباگ راحتتره.
#Codeit #Android #Kotlin #ExceptionHandling #TryCatch #CleanCode #ProgrammingTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
برنامهنویس حرفهای کسی نیست که بدون خطا کد بزنه، کسیست که میدونه چطور با خطاها برخورد کنه. توی «Kotlin» مدیریت استثناها با «try-catch» ساده و قدرتمنده.
❌ تصور کن کاربر متنی رو وارد کنه که عدد نیست و برنامه کرش کنه! این اصلاً حرفهای نیست.
✅ باید پیشبینی کنی که ممکنه خطا رخ بده و با «try-catch» کنترلش کنی.
📌 کاربرد واقعی: وقتی از کاربر ورودی میگیری، حتماً از «try-catch» برای تبدیل امن استفاده کن.
مثال عملی: عدد از کاربر بگیر و اگر اشتباه وارد کرد، خطا رو مدیریت کن:
fun readNumber(): Int? {
return try {
val input = readLine()
input?.toInt()
} catch (e: NumberFormatException) {
println("❌ ورودی معتبر نیست، لطفاً عدد وارد کنید.")
null
}
}
این تابع اگر کاربر عدد وارد نکنه، به جای کرش، پیام خطا چاپ میکنه و null برمیگردونه. بعدش میتونی با شرط بررسی کنی.
💡 نکته مهم: همیشه «catch» رو برای نوع خاصی از استثنا بنویس، نه همه خطاها. از «Exception» عمومی فقط در مواقع ضروری استفاده کن.
🎯 نتیجه: کدت پایدارتر میشه، کاربر تجربه بهتری داره و دیباگ راحتتره.
#Codeit #Android #Kotlin #ExceptionHandling #TryCatch #CleanCode #ProgrammingTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
کد خواناتر یعنی احترام به خودِ آیندهات 😎
خوانایی فقط ظاهر نیست؛ روی سرعت توسعه و دیباگ تأثیر مستقیم داره.
وقتی کدت رو برای دیگران (و خودت) روشن مینویسی، اشکالزدایی نصف میشه.
توی پروژههای تیمی، کد نامفهوم باعث سردرگمی و اتلاف وقت میشه.
با نامگذاری خوب و توابع کوتاه، همه برندهاند.
یک مثال ساده از تفاوت کد بد و خوب:
تابع اول با اسمهای تکحرفی و ساختار فشرده، فهمش سخته.
دومی با اسم معنادار و استفاده از «filter» و «sum» در یک خط، هدف رو واضح میکنه.
همیشه قبل از نوشتن کد به این فکر کن که آیا ۶ ماه بعد متوجهاش میشی؟
اگر نه، بازنویسی کن. همین یک عادت، کیفیت کارت رو چند برابر میکنه 🚀
#Codeit #Android #Kotlin #Jetpack #CleanCode #Readability #DeveloperMindset
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
خوانایی فقط ظاهر نیست؛ روی سرعت توسعه و دیباگ تأثیر مستقیم داره.
وقتی کدت رو برای دیگران (و خودت) روشن مینویسی، اشکالزدایی نصف میشه.
توی پروژههای تیمی، کد نامفهوم باعث سردرگمی و اتلاف وقت میشه.
با نامگذاری خوب و توابع کوتاه، همه برندهاند.
یک مثال ساده از تفاوت کد بد و خوب:
// کد غیرقابل خواندن
fun a(b: List<Int>): Int { var c = 0; for (d in b) { if (d > 0) c += d }; return c }
// کد خوانا
fun sumPositiveNumbers(numbers: List<Int>): Int {
return numbers.filter { it > 0 }.sum()
}
تابع اول با اسمهای تکحرفی و ساختار فشرده، فهمش سخته.
دومی با اسم معنادار و استفاده از «filter» و «sum» در یک خط، هدف رو واضح میکنه.
همیشه قبل از نوشتن کد به این فکر کن که آیا ۶ ماه بعد متوجهاش میشی؟
اگر نه، بازنویسی کن. همین یک عادت، کیفیت کارت رو چند برابر میکنه 🚀
#Codeit #Android #Kotlin #Jetpack #CleanCode #Readability #DeveloperMindset
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1👍1🔥1
🔒 تو کد نویسی، بعضی عملیاتها رو باید حتماً تموم کنی حتی اگه خطا بیاد!
«Finally block» در «Kotlin» دقیقاً همین کار رو میکنه.
📌 کاربرد اصلی: بستن فایل، قطع connection یا آزاد کردن حافظه
مهم نیست خطا رخ بده یا نه، کد داخل «finally» همیشه اجرا میشه.
💡 مثال واقعی: فرض کن داری فایل میخونی؛ اگه خطا هم بیاد، فایل باید بسته بشه.
یک نمونه ساده از ترکیب try-catch-finally:
🧠 این کد نشون میده که حتی در صورت خطا،
توی پروژههای واقعی، مثلاً
🎯 نکته مهم: اگر داخل
پس برای مدیریت مطمئن منابع، هیچ جایگزینی باحالتر از «finally block» نیست!
#Codeit #Android #Kotlin #Jetpack #ExceptionHandling #CleanCode #FinallyBlock
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
«Finally block» در «Kotlin» دقیقاً همین کار رو میکنه.
📌 کاربرد اصلی: بستن فایل، قطع connection یا آزاد کردن حافظه
مهم نیست خطا رخ بده یا نه، کد داخل «finally» همیشه اجرا میشه.
💡 مثال واقعی: فرض کن داری فایل میخونی؛ اگه خطا هم بیاد، فایل باید بسته بشه.
یک نمونه ساده از ترکیب try-catch-finally:
fun readFile(path: String): String? {
val file = File(path)
return try {
file.readText()
} catch (e: IOException) {
println("خطا در خواندن فایل: ${e.message}")
null
} finally {
println("✅ فایل حتماً بسته میشه (در عمل اینجا close داریم)")
}
}
🧠 این کد نشون میده که حتی در صورت خطا،
finally اجرا شده و پیام چاپ میشه. توی پروژههای واقعی، مثلاً
close() رو توی finally میذارن تا منبع نشتی نداشته باشه. 🎯 نکته مهم: اگر داخل
try یا catch از return استفاده کنی، بازم finally قبل از برگشت اجرا میشه. پس برای مدیریت مطمئن منابع، هیچ جایگزینی باحالتر از «finally block» نیست!
#Codeit #Android #Kotlin #Jetpack #ExceptionHandling #CleanCode #FinallyBlock
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2👍1🔥1
🔹 توی پروژههای واقعی، خطاها رو با «Exception» استاندارد جاوا مدیریت نکن! 🚫
🔸 بیا ببینیم چطور «Custom Exception»های اختصاصی توی «Kotlin» بسازیم که دیباگ و نگهداری کد رو خیلی راحتتر کنه.
🔹 فرض کن داری یک اپ پرداخت مینویسی. بهجای اینکه هر بار «IllegalArgumentException» پرت کنی، یک «InsufficientBalanceException» بساز که دقیقاً بگه مشکل چیه. ✅
🔸 این کار خوانایی خطاها رو بالا میبره و توی «Log»ها دقیقاً میفهمی کجا خطا رخ داده.
🔹 یک مثال ساده از «Custom Exception» در «Kotlin»:
🔸 این کد یک «Exception» سفارشی با دو ویژگی عددی میسازه و پیام خطا رو خودش تولید میکنه. توی تابع پرداخت هم اگر موجودی کم باشه، این خطا پرتاب میشه.
🔹 نکته مهم: میتونی توی «Custom Exception» متدها یا پراپرتیهای اضافه هم تعریف کنی. مثلاً یک متد برای لاگکردن جزئیات خطا.
🔸 حالا توی کد اصلی میتونی با «try-catch» دقیقاً این نوع خطا رو بگیر و پیام مناسب به کاربر نشون بدی.
🔹 خلاصه: «Custom Exception» بهت کمک میکنه کدت خواناتر، قابل نگهداریتر و حرفهایتر باشه. همین امروز توی پروژههات استفاده کن! 🚀
#Codeit #Android #Kotlin #Jetpack #CleanCode #Exceptions #KotlinTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔸 بیا ببینیم چطور «Custom Exception»های اختصاصی توی «Kotlin» بسازیم که دیباگ و نگهداری کد رو خیلی راحتتر کنه.
🔹 فرض کن داری یک اپ پرداخت مینویسی. بهجای اینکه هر بار «IllegalArgumentException» پرت کنی، یک «InsufficientBalanceException» بساز که دقیقاً بگه مشکل چیه. ✅
🔸 این کار خوانایی خطاها رو بالا میبره و توی «Log»ها دقیقاً میفهمی کجا خطا رخ داده.
🔹 یک مثال ساده از «Custom Exception» در «Kotlin»:
class InsufficientBalanceException(
val currentBalance: Double,
val requiredAmount: Double
) : Exception("موجودی کافی نیست. موجودی: $currentBalance، نیاز: $requiredAmount")
fun processPayment(amount: Double, balance: Double) {
if (amount > balance) {
throw InsufficientBalanceException(balance, amount)
}
println("پرداخت با موفقیت انجام شد")
}
🔸 این کد یک «Exception» سفارشی با دو ویژگی عددی میسازه و پیام خطا رو خودش تولید میکنه. توی تابع پرداخت هم اگر موجودی کم باشه، این خطا پرتاب میشه.
🔹 نکته مهم: میتونی توی «Custom Exception» متدها یا پراپرتیهای اضافه هم تعریف کنی. مثلاً یک متد برای لاگکردن جزئیات خطا.
🔸 حالا توی کد اصلی میتونی با «try-catch» دقیقاً این نوع خطا رو بگیر و پیام مناسب به کاربر نشون بدی.
🔹 خلاصه: «Custom Exception» بهت کمک میکنه کدت خواناتر، قابل نگهداریتر و حرفهایتر باشه. همین امروز توی پروژههات استفاده کن! 🚀
#Codeit #Android #Kotlin #Jetpack #CleanCode #Exceptions #KotlinTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
🚀 قدرت «Code Review» را دست کم نگیرید!
بازبینی کد فقط پیدا کردن باگ نیست؛ یک فرصت طلایی برای رشد فردی و تیمی است.
خیلی از توسعهدهندهها از «Code Review» فرار میکنند، اما حقیقت این است که این فرآیند، کیفیت کد و اعتماد به نفس تیمی را چند برابر میکند.
📌 چرا «Code Review» مهم است؟
- یادگیری سریعتر: با دیدن کد دیگران، تکنیکهای جدید یاد میگیرید.
- کاهش باگ: یک جفت چشم دیگر، اشتباهات را زودتر میگیرد.
- یکدست شدن کد: تیم به یک سبک واحد میرسد.
🎯 مثال واقعی:
یک تیم اندروید باگ بحرانیای در بخش پرداخت داشت. بعد از اضافه کردن «Code Review» اجباری، تعداد باگهای تولید ۷۰٪ کاهش یافت.
🧠 نکته ذهنی:
هنگام بازبینی، به جای «اشتباه کردی» بگویید «اینجا ممکنه مشکل ایجاد کنه، راه حل جایگزین فلان است؟». این کار فرهنگ بازخورد سازنده را میسازد.
💡 چطور شروع کنیم؟
- برای هر «Pull Request» حداقل ۱۵ دقیقه وقت بگذارید.
- سوال بپرسید، نه حکم.
- از تیکهای «LGTM» (Looks Good To Me) بیدلیل استفاده نکنید.
📈 نتیجه نهایی:
«Code Review» نه یک تشریفات، بلکه سرمایهگذاری روی کیفیت و یادگیری تیم است. اگر امروز شروع کنید، یک ماه دیگر تفاوت را حس میکنید.
#Codeit #Android #Kotlin #Jetpack #CodeReview #CleanCode #DeveloperGrowth #Teamwork
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
بازبینی کد فقط پیدا کردن باگ نیست؛ یک فرصت طلایی برای رشد فردی و تیمی است.
خیلی از توسعهدهندهها از «Code Review» فرار میکنند، اما حقیقت این است که این فرآیند، کیفیت کد و اعتماد به نفس تیمی را چند برابر میکند.
📌 چرا «Code Review» مهم است؟
- یادگیری سریعتر: با دیدن کد دیگران، تکنیکهای جدید یاد میگیرید.
- کاهش باگ: یک جفت چشم دیگر، اشتباهات را زودتر میگیرد.
- یکدست شدن کد: تیم به یک سبک واحد میرسد.
🎯 مثال واقعی:
یک تیم اندروید باگ بحرانیای در بخش پرداخت داشت. بعد از اضافه کردن «Code Review» اجباری، تعداد باگهای تولید ۷۰٪ کاهش یافت.
🧠 نکته ذهنی:
هنگام بازبینی، به جای «اشتباه کردی» بگویید «اینجا ممکنه مشکل ایجاد کنه، راه حل جایگزین فلان است؟». این کار فرهنگ بازخورد سازنده را میسازد.
💡 چطور شروع کنیم؟
- برای هر «Pull Request» حداقل ۱۵ دقیقه وقت بگذارید.
- سوال بپرسید، نه حکم.
- از تیکهای «LGTM» (Looks Good To Me) بیدلیل استفاده نکنید.
📈 نتیجه نهایی:
«Code Review» نه یک تشریفات، بلکه سرمایهگذاری روی کیفیت و یادگیری تیم است. اگر امروز شروع کنید، یک ماه دیگر تفاوت را حس میکنید.
#Codeit #Android #Kotlin #Jetpack #CodeReview #CleanCode #DeveloperGrowth #Teamwork
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥2
🎯 Destructuring Declarations در «Kotlin» یکی از اون قابلیتهاییه که کد رو خواناتر و مختصرتر میکنه. بیایید ببینیم چطور کار میکنه و کجا به کار میاد.
🔹 داستراکچرینگ یعنی میتونید یک شیء رو به چند متغیر جداگانه بشکنید بدون اینکه دستی به تک تک فیلدها دسترسی داشته باشید. این کار مخصوصاً با «Data Class»ها عالی جواب میده.
📦 مثال واقعی: فرض کنید یک «User» دارید با فیلدهای name و age. معمولاً مینویسید
🧩 کد مثال رو ببینید:
✅ کد بالا مقدار name و age رو مستقیماً به userName و userAge نسبت میده. نیازی به دسترسی تکی نیست.
🔄 نکته مهم: ترتیب متغیرها با ترتیب فیلدهای constructor یکی هست. اگر فقط بخشی رو میخواید، از
💡 کاربرد عملی: در «Jetpack Compose» برای دریافت «State»های مختلف از «ViewModel» یا در حلقههای روی لیستها خیلی به کار میاد.
📌 نتیجه: داستراکچرینگ باعث میشه کد کمتر و خواناتر داشته باشید. از امروز توی پروژههاتون استفاده کنید.
#Codeit #Android #Kotlin #Jetpack #Destructuring #KotlinTips #CleanCode
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔹 داستراکچرینگ یعنی میتونید یک شیء رو به چند متغیر جداگانه بشکنید بدون اینکه دستی به تک تک فیلدها دسترسی داشته باشید. این کار مخصوصاً با «Data Class»ها عالی جواب میده.
📦 مثال واقعی: فرض کنید یک «User» دارید با فیلدهای name و age. معمولاً مینویسید
val name = user.name ولی با داستراکچرینگ یک خطی انجامش میدید.🧩 کد مثال رو ببینید:
data class User(val name: String, val age: Int)
fun main() {
val user = User("Ali", 28)
val (userName, userAge) = user
println("$userName is $userAge years old")
}
✅ کد بالا مقدار name و age رو مستقیماً به userName و userAge نسبت میده. نیازی به دسترسی تکی نیست.
🔄 نکته مهم: ترتیب متغیرها با ترتیب فیلدهای constructor یکی هست. اگر فقط بخشی رو میخواید، از
_ استفاده کنید مثلاً val (name, _) = user.💡 کاربرد عملی: در «Jetpack Compose» برای دریافت «State»های مختلف از «ViewModel» یا در حلقههای روی لیستها خیلی به کار میاد.
📌 نتیجه: داستراکچرینگ باعث میشه کد کمتر و خواناتر داشته باشید. از امروز توی پروژههاتون استفاده کنید.
#Codeit #Android #Kotlin #Jetpack #Destructuring #KotlinTips #CleanCode
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
📦 عملگرها در «Kotlin» فقط برای اعداد نیستند!
میتونی به کلاسهای خودت یاد بدی که با علامت
✅ چرا به کار میاد؟
وقتی با مفاهیمی مثل مختصات، ماتریس یا تاریخ کار میکنی، استفاده از عملگرها کد رو خواناتر و طبیعیتر میکنه. دیگه نیازی به نوشتن
💡 مثال عملی:
فرض کن یک کلاس
📝 توضیح:
با کلیدواژه
🎯 کاربرد واقعی:
این قابلیت تو کتابخونههایی مثل «Jetpack Compose» برای مدیریت مقادیر «Dp» یا «Offset» استفاده میشه. مثلاً
🔑 نکته:
میتونی عملگرهای دیگه مثل
#Codeit #Android #Kotlin #Jetpack #OperatorOverloading #CleanCode #Programming
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
میتونی به کلاسهای خودت یاد بدی که با علامت
+ یا == رفتار خاصی داشته باشن. به این میگن «Operator Overloading» 🤯✅ چرا به کار میاد؟
وقتی با مفاهیمی مثل مختصات، ماتریس یا تاریخ کار میکنی، استفاده از عملگرها کد رو خواناتر و طبیعیتر میکنه. دیگه نیازی به نوشتن
point1.add(point2) نیست؛ کافیه بنویسی point1 + point2 ✨💡 مثال عملی:
فرض کن یک کلاس
Point داری که مختصات x و y رو ذخیره میکنه. میخوای دو نقطه رو با + جمع بزنی و نقطه جدیدی بدست بیاری.data class Point(val x: Int, val y: Int) {
operator fun plus(other: Point): Point {
return Point(x + other.x, y + other.y)
}
}
fun main() {
val p1 = Point(2, 3)
val p2 = Point(4, 5)
val result = p1 + p2 // فراخوانی plus
println(result) // Point(x=6, y=8)
}
📝 توضیح:
با کلیدواژه
operator به «Kotlin» میفهمونی که تابع plus برای عملگر + استفاده بشه. حالا هر جا p1 + p2 بنویسی، معادل p1.plus(p2) اجرا میشه.🎯 کاربرد واقعی:
این قابلیت تو کتابخونههایی مثل «Jetpack Compose» برای مدیریت مقادیر «Dp» یا «Offset» استفاده میشه. مثلاً
offset1 + offset2 دو مختصات رو جمع میزنه.🔑 نکته:
میتونی عملگرهای دیگه مثل
-، *، []، == و in رو هم overload کنی. فقط کافیه تابع operator مناسب رو بنویسی.#Codeit #Android #Kotlin #Jetpack #OperatorOverloading #CleanCode #Programming
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
🚀 تو کاتلین یه قابلیت باحال به اسم «Infix Functions» داری که میتونه کدت رو روانتر و خواناتر کنه.
بدون اینکه نقطهای قبل از تابع بزاری، مستقیم میتونی صداش کنی. انگار داری با یه عملگر داخلی کار میکنی.
💡 کی به کارت میاد؟
وقتی میخوای یه عملیات ساده رو روی یه شیء انجام بدی و کدت شبیه به جملات طبیعی بشه. مثلاً توی دیتابیس یا DSLهای سفارشی.
📌 چطور تعریفش میکنی؟
فقط کافیه تابع رو با کلمه کلیدی
👇 یه مثال عملی ببین:
✅ اینجا تابع
⚠️ نکات مهم:
- فقط یه پارامتر میگیره.
- پارامتر نباید
- حتماً باید
💡 کجا بیشتر میبینی؟
توی «Kotlin Standard Library» کلی ازش استفاده شده:
📌 تسک نهایی:
برای یه کلاس
خلاصه:
«Infix Functions» یه ابزار ساده ولی قدرتمنده برای خونداییتر کردن کدهات. فقط یادت باشه ازش در جاهای درست استفاده کنی.
#Codeit #Android #Kotlin #InfixFunctions #CleanCode #DSL #ProgrammingTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
بدون اینکه نقطهای قبل از تابع بزاری، مستقیم میتونی صداش کنی. انگار داری با یه عملگر داخلی کار میکنی.
💡 کی به کارت میاد؟
وقتی میخوای یه عملیات ساده رو روی یه شیء انجام بدی و کدت شبیه به جملات طبیعی بشه. مثلاً توی دیتابیس یا DSLهای سفارشی.
📌 چطور تعریفش میکنی؟
فقط کافیه تابع رو با کلمه کلیدی
infix مشخص کنی، حتماً یه پارامتر داشته باشه (بدون مقدار پیشفرض) و یه member function یا extension function باشه. 👇 یه مثال عملی ببین:
data class Player(val name: String, val score: Int)
infix fun Player.addScore(points: Int): Player {
return this.copy(score = this.score + points)
}
fun main() {
val player = Player("Ali", 100)
val updatedPlayer = player addScore 50 // بدون نقطه و پرانتز!
println(updatedPlayer) // Player(name=Ali, score=150)
}
✅ اینجا تابع
addScore رو با infix تعریف کردیم. حالا بهجای player.addScore(50) مینویسم player addScore 50. کد روانتر و شبیه به انگلیسی ساده شده. ⚠️ نکات مهم:
- فقط یه پارامتر میگیره.
- پارامتر نباید
vararg باشه. - حتماً باید
member یا extension باشه. 💡 کجا بیشتر میبینی؟
توی «Kotlin Standard Library» کلی ازش استفاده شده:
map, filter, to (مثلاً "key" to "value"). 📌 تسک نهایی:
برای یه کلاس
Matrix یه تابع infix بنویس که دو ماتریس رو جمع بزنه. اینجوری کدت خواناتر و جذابتر میشه. خلاصه:
«Infix Functions» یه ابزار ساده ولی قدرتمنده برای خونداییتر کردن کدهات. فقط یادت باشه ازش در جاهای درست استفاده کنی.
#Codeit #Android #Kotlin #InfixFunctions #CleanCode #DSL #ProgrammingTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
📝 قراردادهای کدنویسی کاتلین
کد خواناتر = تیم بهتر = پروژه موفقتر 🚀
«Kotlin» کلی قرارداد رسمی داره که توی «Coding Conventions» اومده.
بیایید ۳ تا از مهمهاش رو با هم مرور کنیم:
✅ نحوه نامگذاری
- کلاسها و آبجکتها: «PascalCase»
- توابع و متغیرها: «camelCase»
- ثابتها: «SCREAMINGSNAKECASE»
✅ ترجیح «val» به «var»
هرجا مقدار تغییر نمیکنه، از «val» استفاده کن. کد ایمانتر و خواناتر میشه.
✅ فاصلهگذاری و «Braces»
آکولاد باز را در انتهای خط بگذار، نه خط جدا.
📌 حالا یه مثال کاربردی از یک کلاس ساده:
این کد از قراردادهای نامگذاری پیروی میکنه، از «val» بهجای «var» استفاده کرده و «Braces» رو درست گذاشته.
🔥 نتیجه: رعایت این قراردادها باعث میشه کدت مثل آب روان باشه و توی پروژههای تیمی هیچکس سردرگم نشه.
#Codeit #Android #Kotlin #Jetpack #CodingConventions #CleanCode
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
کد خواناتر = تیم بهتر = پروژه موفقتر 🚀
«Kotlin» کلی قرارداد رسمی داره که توی «Coding Conventions» اومده.
بیایید ۳ تا از مهمهاش رو با هم مرور کنیم:
✅ نحوه نامگذاری
- کلاسها و آبجکتها: «PascalCase»
- توابع و متغیرها: «camelCase»
- ثابتها: «SCREAMINGSNAKECASE»
✅ ترجیح «val» به «var»
هرجا مقدار تغییر نمیکنه، از «val» استفاده کن. کد ایمانتر و خواناتر میشه.
✅ فاصلهگذاری و «Braces»
آکولاد باز را در انتهای خط بگذار، نه خط جدا.
📌 حالا یه مثال کاربردی از یک کلاس ساده:
class User(private val name: String, private val age: Int) {
fun isAdult(): Boolean = age >= 18
fun greeting(): String {
return "Hello, my name is $name"
}
}
این کد از قراردادهای نامگذاری پیروی میکنه، از «val» بهجای «var» استفاده کرده و «Braces» رو درست گذاشته.
🔥 نتیجه: رعایت این قراردادها باعث میشه کدت مثل آب روان باشه و توی پروژههای تیمی هیچکس سردرگم نشه.
#Codeit #Android #Kotlin #Jetpack #CodingConventions #CleanCode
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥2
🔄 کی کد رو ریفکتور کنیم؟
رفکتورینگ مثل مرتبکردن کمد لباس میمونه؛ اگه مرتب نکنی، پیدا کردن یه تیشرت ساده هم ساعتها طول میکشه.
تو پروژههای اندروید با «Kotlin» و «Jetpack Compose» کدها سریع پیچیده میشن.
اما هر تغییر کوچیکی رو نباید ریفکتور کرد. باید بدونیم کی واقعاً لازمه.
📌 نشونههایی که وقت ریفکتور رسیده:
1️⃣ بوی بد کد: متدهای بلند، نامهای نامفهوم، یا تکرار یک «ViewModel» مشابه در چند کلاس.
2️⃣ تستنشدن: وقتی اضافه کردن یه فیچر ساده، تست قبلی رو میشکونه، یعنی ساختار کد نیاز به بازبینی داره.
3️⃣ یادگیری تیم: اگر اعضای جدید مدام سردرگم میشن، پس معماری شفاف نیست.
4️⃣ تغییر تکنولوژی: مثلاً از «LiveData» به «StateFlow» کوچ میکنید – عالی، ولی بدون ریفکتور ممکنه کد دوگانه بشه.
✅ چه وقت ریفکتور نکنیم؟
- وقتی ددلاین نزدیکه و ریسک خرابی بالاست.
- وقتی کد کار میکنه و هیچ باگی نداره (اصل «If it ain't broke, don't fix it»).
- وقتی تیم در میانه یه فیچر بزرگ هست.
🛠 یک قانون عملی:
در هر اسپرینت ۲۰٪ وقت رو به «ریفکتور» اختصاص بدین.
مثلاً توی «Jetpack Compose» اگر دیدید یه composable بیش از ۸۰ خط شده، بیخیال نشید.
یک تابع «extract» بزنید و بخشهای تکراری رو به composableهای جدا تبدیل کنید.
💡 نتیجه:
رفکتورینگ هوشمندانه باعث میشه سرعت توسعه آینده چند برابر بشه.
از کدی که گربهشو ازش خبر نداره فرار کنید 🐈
#Codeit #Android #Kotlin #Jetpack #Refactoring #CleanCode #MobileDev #SoftwareEngineering
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
رفکتورینگ مثل مرتبکردن کمد لباس میمونه؛ اگه مرتب نکنی، پیدا کردن یه تیشرت ساده هم ساعتها طول میکشه.
تو پروژههای اندروید با «Kotlin» و «Jetpack Compose» کدها سریع پیچیده میشن.
اما هر تغییر کوچیکی رو نباید ریفکتور کرد. باید بدونیم کی واقعاً لازمه.
📌 نشونههایی که وقت ریفکتور رسیده:
1️⃣ بوی بد کد: متدهای بلند، نامهای نامفهوم، یا تکرار یک «ViewModel» مشابه در چند کلاس.
2️⃣ تستنشدن: وقتی اضافه کردن یه فیچر ساده، تست قبلی رو میشکونه، یعنی ساختار کد نیاز به بازبینی داره.
3️⃣ یادگیری تیم: اگر اعضای جدید مدام سردرگم میشن، پس معماری شفاف نیست.
4️⃣ تغییر تکنولوژی: مثلاً از «LiveData» به «StateFlow» کوچ میکنید – عالی، ولی بدون ریفکتور ممکنه کد دوگانه بشه.
✅ چه وقت ریفکتور نکنیم؟
- وقتی ددلاین نزدیکه و ریسک خرابی بالاست.
- وقتی کد کار میکنه و هیچ باگی نداره (اصل «If it ain't broke, don't fix it»).
- وقتی تیم در میانه یه فیچر بزرگ هست.
🛠 یک قانون عملی:
در هر اسپرینت ۲۰٪ وقت رو به «ریفکتور» اختصاص بدین.
مثلاً توی «Jetpack Compose» اگر دیدید یه composable بیش از ۸۰ خط شده، بیخیال نشید.
یک تابع «extract» بزنید و بخشهای تکراری رو به composableهای جدا تبدیل کنید.
💡 نتیجه:
رفکتورینگ هوشمندانه باعث میشه سرعت توسعه آینده چند برابر بشه.
از کدی که گربهشو ازش خبر نداره فرار کنید 🐈
#Codeit #Android #Kotlin #Jetpack #Refactoring #CleanCode #MobileDev #SoftwareEngineering
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1🥰1
🔹 الگوی «Delegation» در «Kotlin» یکی از قدرتمندترین ابزارهای طراحی است که به شما اجازه میدهه بدون ارثبری مستقیم، قابلیتهای یک کلاس رو به کلاس دیگه واگذار کنی!
🔹 «Delegation» یعنی به جای اینکه کلاس A همه متدهای کلاس B رو پیادهسازی کنه، اونها رو به یک شیء از کلاس B بسپاره.
🔹 «Kotlin» با کلیدواژه «by» این کار رو خیلی راحت کرده. کافیه توی تعریف کلاس از «by» استفاده کنی تا پیادهسازی متدها به طور خودکار از شیء delegat گرفته بشه.
🔹 مزیت اصلی: کاهش وابستگی به «Inheritance» و افزایش ترکیبپذیری کد. دیگه لازم نیست با سلسلهمراتب پیچیده ارثبری کلنجار بری.
🔹 کاربرد واقعی: مثلاً فرض کن یک «Interface» به نام «Logger» داری که متد «log» رو تعریف میکنه. میتونی دو پیادهسازی مختلف براش بنویسی: یکی برای چاپ در کنسول و یکی برای ذخیره در فایل. بعد با «Delegation» کلاس اصلی رو به یکی از این پیادهسازیها وصل کنی.
🔹 کد زیر رو ببین:
🔹 اینجا «UserService» واسط «Logger» رو از طریق شیء ورودی (مثلاً «ConsoleLogger») پیادهسازی میکنه. هر وقت توی «UserService» متد «log» صدا زده بشه، به طور خودکار به «ConsoleLogger» برونسپاری میشه.
🔹 با این روش میتونی رفتار «UserService» رو بدون تغییر کد اصلی، عوض کنی. مثلاً یه «FileLogger» بدی بهش تا لاگها توی فایل ذخیره بشه.
🔹 نکته: «Delegation» مخصوصاً در الگوهای طراحی مثل «Strategy»، «Decorator» و حتی «Dependency Injection» کاربردی داره. یادش بگیر تا کدت خیلی تمیزتر و تستپذیرتر بشه.
🔹 برای پیشرفتهترها: ترکیب «Delegation» با «Property Delegates» تو «Kotlin» (مثل «lazy»، «observable») یه دنیا امکانات در اختیارت میذاره.
#Codeit #Android #Kotlin #Jetpack #DelegationPattern #CleanCode #SoftwareDesign #OOP
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔹 «Delegation» یعنی به جای اینکه کلاس A همه متدهای کلاس B رو پیادهسازی کنه، اونها رو به یک شیء از کلاس B بسپاره.
🔹 «Kotlin» با کلیدواژه «by» این کار رو خیلی راحت کرده. کافیه توی تعریف کلاس از «by» استفاده کنی تا پیادهسازی متدها به طور خودکار از شیء delegat گرفته بشه.
🔹 مزیت اصلی: کاهش وابستگی به «Inheritance» و افزایش ترکیبپذیری کد. دیگه لازم نیست با سلسلهمراتب پیچیده ارثبری کلنجار بری.
🔹 کاربرد واقعی: مثلاً فرض کن یک «Interface» به نام «Logger» داری که متد «log» رو تعریف میکنه. میتونی دو پیادهسازی مختلف براش بنویسی: یکی برای چاپ در کنسول و یکی برای ذخیره در فایل. بعد با «Delegation» کلاس اصلی رو به یکی از این پیادهسازیها وصل کنی.
🔹 کد زیر رو ببین:
interface Logger {
fun log(message: String)
}
class ConsoleLogger : Logger {
override fun log(message: String) {
println("Console: $message")
}
}
class FileLogger : Logger {
override fun log(message: String) {
// ذخیره در فایل
}
}
class UserService(logger: Logger) : Logger by logger {
fun createUser(name: String) {
log("Creating user $name")
// منطق ساخت کاربر
}
}
🔹 اینجا «UserService» واسط «Logger» رو از طریق شیء ورودی (مثلاً «ConsoleLogger») پیادهسازی میکنه. هر وقت توی «UserService» متد «log» صدا زده بشه، به طور خودکار به «ConsoleLogger» برونسپاری میشه.
🔹 با این روش میتونی رفتار «UserService» رو بدون تغییر کد اصلی، عوض کنی. مثلاً یه «FileLogger» بدی بهش تا لاگها توی فایل ذخیره بشه.
🔹 نکته: «Delegation» مخصوصاً در الگوهای طراحی مثل «Strategy»، «Decorator» و حتی «Dependency Injection» کاربردی داره. یادش بگیر تا کدت خیلی تمیزتر و تستپذیرتر بشه.
🔹 برای پیشرفتهترها: ترکیب «Delegation» با «Property Delegates» تو «Kotlin» (مثل «lazy»، «observable») یه دنیا امکانات در اختیارت میذاره.
#Codeit #Android #Kotlin #Jetpack #DelegationPattern #CleanCode #SoftwareDesign #OOP
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2
🎯 وقتی بحث «Property Delegation» در «Kotlin» میشه، خیلیها فقط یاد
📌 «Property Delegation» یعنی چرخه get و set یک property رو به یک کلاس جداگانه بسپاریم. به این کلاس میگن «Delegate». خود «Kotlin» چندتا delegate آماده داره:
🧠 کاربرد واقعی: وقتی میخوایم یه property رو به صورت lazy مقداردهی کنیم (مثل وابستگیهای سنگین)، یا تغییراتش رو رصد کنیم (مثل ذخیره خودکار در «SharedPreferences»)، یا اعتبارسنجی قبل از مقداردهی انجام بدیم. اینجا دیگه نیازی به تکرار کد توی هر کلاس نیست.
💡 مثال: یه delegate سفارشی بسازیم که مقدار property رو در «SharedPreferences» ذخیره کنه. کد زیر رو ببین:
✅ این delegate رو میتونیم برای هر property از نوع String استفاده کنیم. مقدارش خودکار از «SharedPreferences» خوند و نوشته میشه. دیگه نیازی به
🚀 نکته کلیدی: با پیادهسازی اینترفیس
✅ حالا برو و delegateهای خودت رو بساز! با این کار کدت تمیزتر، قابلبازبینی و تستپذیرتر میشه.
#Codeit #Android #Kotlin #Jetpack #PropertyDelegation #AdvancedKotlin #CleanCode
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
lazy میافتن! اما این قابلیت خیلی عمیقتر از این حرفast. 😎📌 «Property Delegation» یعنی چرخه get و set یک property رو به یک کلاس جداگانه بسپاریم. به این کلاس میگن «Delegate». خود «Kotlin» چندتا delegate آماده داره:
lazy، observable، vetoable و notNull. اما میتونیم delegate شخصیسازیشده هم بنویسیم.🧠 کاربرد واقعی: وقتی میخوایم یه property رو به صورت lazy مقداردهی کنیم (مثل وابستگیهای سنگین)، یا تغییراتش رو رصد کنیم (مثل ذخیره خودکار در «SharedPreferences»)، یا اعتبارسنجی قبل از مقداردهی انجام بدیم. اینجا دیگه نیازی به تکرار کد توی هر کلاس نیست.
💡 مثال: یه delegate سفارشی بسازیم که مقدار property رو در «SharedPreferences» ذخیره کنه. کد زیر رو ببین:
import android.content.SharedPreferences
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class PrefStringDelegate(
private val prefs: SharedPreferences,
private val key: String,
private val default: String = ""
) : ReadWriteProperty<Any?, String> {
override fun getValue(thisRef: Any?, property: KProperty<*>): String {
return prefs.getString(key, default) ?: default
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
prefs.edit().putString(key, value).apply()
}
}
✅ این delegate رو میتونیم برای هر property از نوع String استفاده کنیم. مقدارش خودکار از «SharedPreferences» خوند و نوشته میشه. دیگه نیازی به
edit() تکراری نداری.🚀 نکته کلیدی: با پیادهسازی اینترفیس
ReadWriteProperty (یا ReadOnlyProperty برای valها) هر propertyای میتونه رفتار دلخواه داشته باشه. این تکنیک برای «Dependency Injection»، «Validation» و «Caching» هم عالیه.✅ حالا برو و delegateهای خودت رو بساز! با این کار کدت تمیزتر، قابلبازبینی و تستپذیرتر میشه.
#Codeit #Android #Kotlin #Jetpack #PropertyDelegation #AdvancedKotlin #CleanCode
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
✨ الگوی Builder با «Kotlin DSL» رو قورت بده! 🚀
الگوی Builder یکی از پرکاربردترین الگوهای طراحی واسه ساختن آبجکتهای پیچیده ست. توی جاوا کلی boilerplate داشت، ولی توی «Kotlin» با «DSL» میتونیم خیلی تمیزتر و خواناتر پیادهاش کنیم. 🎯
مثلاً فرض کن یه کلاس «Config» داری با کلی پارامتر optional. بدون «Builder» مجبوری overload یا constructor با arguments زیاد بنویسی. با «DSL» میتونی مثل یه زبان اختصاصی براش کد بزنی.
حالا بیا یه مثال ببینیم:
این کد بهت اجازه میده با یه «DSL block» تنظیمات رو بنویسی:
خودت ببین چقدر خواناتر شد! دیگه نیازی به زنجیرهای از متدهای set نیست. «Kotlin DSL» قدرت kotlin رو توی type-safe builderها نشون میده. 💪
نتیجه: هر جا که تعداد پارامترها زیاده، از «DSL builder» استفاده کن تا کدت هم مختصر بمونه هم readable. حرفهایها اینطوری کد میزنن. 😎
#Codeit #Android #Kotlin #Jetpack #DesignPatterns #DSL #CleanCode #KotlinTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
الگوی Builder یکی از پرکاربردترین الگوهای طراحی واسه ساختن آبجکتهای پیچیده ست. توی جاوا کلی boilerplate داشت، ولی توی «Kotlin» با «DSL» میتونیم خیلی تمیزتر و خواناتر پیادهاش کنیم. 🎯
مثلاً فرض کن یه کلاس «Config» داری با کلی پارامتر optional. بدون «Builder» مجبوری overload یا constructor با arguments زیاد بنویسی. با «DSL» میتونی مثل یه زبان اختصاصی براش کد بزنی.
حالا بیا یه مثال ببینیم:
class Config private constructor(
val host: String,
val port: Int,
val debug: Boolean
) {
class Builder {
var host: String = "localhost"
var port: Int = 8080
var debug: Boolean = false
fun build(): Config = Config(host, port, debug)
}
companion object {
fun build(block: Builder.() -> Unit): Config =
Builder().apply(block).build()
}
}
این کد بهت اجازه میده با یه «DSL block» تنظیمات رو بنویسی:
val config = Config.build {
host = "api.example.com"
port = 443
debug = true
}
خودت ببین چقدر خواناتر شد! دیگه نیازی به زنجیرهای از متدهای set نیست. «Kotlin DSL» قدرت kotlin رو توی type-safe builderها نشون میده. 💪
نتیجه: هر جا که تعداد پارامترها زیاده، از «DSL builder» استفاده کن تا کدت هم مختصر بمونه هم readable. حرفهایها اینطوری کد میزنن. 😎
#Codeit #Android #Kotlin #Jetpack #DesignPatterns #DSL #CleanCode #KotlinTips
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔴 وقتی کد جاوا رو در پروژه «Kotlin» استفاده میکنی، چطور از «Null Safety» مطمئن بشی؟
🔵 جواب: با «Nullability Annotations» در سمت جاوا، و «Type System» قدرتمند «Kotlin» میشه مرز Null رو دقیق مشخص کرد.
🔹 «Java» به صورت پیشفرض «Nullable» و «Non‑Null» رو تشخیص نمیده.
🔹 «Kotlin» برای «Interop» با جاوا از «Platform Types» استفاده میکنه که هم خطرناکه هم غیرقابل پیشبینی.
🔹 راه حل: استفاده از «JSR 305»، «Android Annotation Support» یا «JetBrains Annotations» مثل
🔸 مثال عملی:
فرض کن یک کلاس جاوا داری که یک اسم رو برمیگردونه:
حالا در سمت «Kotlin» به صورت خودکار نوع
🔹 اگر
🔸 نکته: در «Kotlin» با استفاده از «Annotation»های «IntelliJ IDEA» یا «Android» (مثل
🚀 خروجی نهایی: با افزودن «@Nullable / @NonNull» به متدها و پارامترهای جاوا، کد «Kotlin» هم تمیزتر و هم ایمنتر میشه.
🔹 بعد از اضافه کردن این «Annotation»ها، حتماً «Recompile» کن و از «IDE» استفاده کن تا خطاهای احتمالی رو ببینی.
📌 برای پروژههای ترکیبی، این یکی از مهمترین تکنیکهای حفظ «Null Safety» است.
#Codeit #Android #Kotlin #Jetpack #JavaInterop #NullSafety #Annotations #CleanCode
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔵 جواب: با «Nullability Annotations» در سمت جاوا، و «Type System» قدرتمند «Kotlin» میشه مرز Null رو دقیق مشخص کرد.
🔹 «Java» به صورت پیشفرض «Nullable» و «Non‑Null» رو تشخیص نمیده.
🔹 «Kotlin» برای «Interop» با جاوا از «Platform Types» استفاده میکنه که هم خطرناکه هم غیرقابل پیشبینی.
🔹 راه حل: استفاده از «JSR 305»، «Android Annotation Support» یا «JetBrains Annotations» مثل
@Nullable و @NonNull.🔸 مثال عملی:
فرض کن یک کلاس جاوا داری که یک اسم رو برمیگردونه:
// Java
public class User {
private String name;
public @Nullable String getName() {
return name;
}
}
حالا در سمت «Kotlin» به صورت خودکار نوع
String? شناسایی میشه و مجبور به مدیریت «Null» هستی.// Kotlin
fun printName(user: User) {
val name: String? = user.name
println(name?.uppercase() ?: "نام ندارد")
}
🔹 اگر
@NonNull استفاده کنی، «Kotlin» نوع رو String در نظر میگیره و نیازی به بررسی «Null» نیست.// Java
public class User {
private String name = "default";
public @NonNull String getName() {
return name;
}
}
// Kotlin
fun printName(user: User) {
println(user.name.uppercase()) // مستقیم! بدون null check
}
🔸 نکته: در «Kotlin» با استفاده از «Annotation»های «IntelliJ IDEA» یا «Android» (مثل
androidx.annotation.Nullable)، میتونی حتی توابع جاوا رو هم «Null‑Safe» کنی.🚀 خروجی نهایی: با افزودن «@Nullable / @NonNull» به متدها و پارامترهای جاوا، کد «Kotlin» هم تمیزتر و هم ایمنتر میشه.
🔹 بعد از اضافه کردن این «Annotation»ها، حتماً «Recompile» کن و از «IDE» استفاده کن تا خطاهای احتمالی رو ببینی.
📌 برای پروژههای ترکیبی، این یکی از مهمترین تکنیکهای حفظ «Null Safety» است.
#Codeit #Android #Kotlin #Jetpack #JavaInterop #NullSafety #Annotations #CleanCode
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1