Codeit Mobile
94 subscribers
3 photos
1 video
244 links
📱 آموزش برنامه‌نویسی موبایل

Kotlin • Android

🚀 آموزش ساده، کاربردی و پروژه‌محور
💡 مخصوص توسعه‌دهندگان موبایل
Download Telegram
🔥 توابع مرتبه‌بالا (Higher-order functions) تو «کاتلین» یه ابزار قدرتمند برای نوشتن کد تمیز و قابل استفاده مجدد هستن. یعنی تابعی که یا تابع دیگه‌ای رو به عنوان ورودی می‌گیره، یا یک تابع رو برمی‌گردونه. این کار کدت رو انعطاف‌پذیر می‌کنه.

📌 توی پروژه‌های واقعی مثلاً می‌خوای عملیات تکراری مثل نمایش پیام خطا یا ذخیره اطلاعات رو با رفتارهای مختلف یکپارچه کنی. به‌جای نوشتن چندین تابع جدا، می‌تونی یک تابع مرتبه‌بالا بنویسی که تابع مورد نظر رو بهش پاس بدی.

🧩 بیایم یه مثال ساده بزنیم:

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) می‌سازیم که بتواند هر نوع داده‌ای را ذخیره کند:

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
1🔥1
🔥 استثناها رو قورت نده! مدیریت حرفه‌ای خطاها با «try» و «catch» در «Kotlin» 🚀

برنامه‌نویس حرفه‌ای کسی نیست که بدون خطا کد بزنه، کسی‌ست که می‌دونه چطور با خطاها برخورد کنه. توی «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
کد خواناتر یعنی احترام به خودِ آینده‌ات 😎
خوانایی فقط ظاهر نیست؛ روی سرعت توسعه و دیباگ تأثیر مستقیم داره.
وقتی کدت رو برای دیگران (و خودت) روشن می‌نویسی، اشکال‌زدایی نصف می‌شه.

توی پروژه‌های تیمی، کد نامفهوم باعث سردرگمی و اتلاف وقت می‌شه.
با نام‌گذاری خوب و توابع کوتاه، همه برنده‌اند.

یک مثال ساده از تفاوت کد بد و خوب:

// کد غیرقابل خواندن
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:

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»:

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
🔥2
🎯 Destructuring Declarations در «Kotlin» یکی از اون قابلیت‌هاییه که کد رو خواناتر و مختصرتر می‌کنه. بیایید ببینیم چطور کار می‌کنه و کجا به کار میاد.

🔹 داستراکچرینگ یعنی می‌تونید یک شیء رو به چند متغیر جداگانه بشکنید بدون اینکه دستی به تک تک فیلدها دسترسی داشته باشید. این کار مخصوصاً با «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» فقط برای اعداد نیستند!
میتونی به کلاس‌های خودت یاد بدی که با علامت + یا == رفتار خاصی داشته باشن. به این میگن «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