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

Kotlin • Android

🚀 آموزش ساده، کاربردی و پروژه‌محور
💡 مخصوص توسعه‌دهندگان موبایل
Download Telegram
🎯 تفاوت nullable و non-nullable در Kotlin
همه ما می‌دونیم که یکی از بزرگ‌ترین مزیت‌های Kotlin نسبت به جاوا، حذف NullPointerException هست.
اما چطوری؟ با دو نوع داده‌ی اصلی: nullable و non-nullable.

🔹 Non-nullable: هر متغیری که بدون ? تعریف بشه، دیگه هیچوقت نمیتونه null بگیره.
🔹 Nullable: با اضافه کردن ? به انتهای نوع، می‌تونیم بپذیریم که مقدار ممکنه null باشه.

💡 مثال واقعی: وقتی از سرور داده می‌گیریم، خیلی وقتا فیلدها ممکنه null باشن.

کد زیر رو ببینید:

fun main() {
val name: String = "Ali" // non-nullable
val nullableName: String? = null // nullable

// safe call: فقط اگر null نباشه، ادامه بده
println(nullableName?.length) // null -> خروجی null

// Elvis operator: مقدار پیش‌فرض
val length = nullableName?.length ?: 0
println("طول نام: $length")
}


📌 توضیح:
با ?. (safe call) اگر مقدار null باشه، از خطا جلوگیری می‌کنه و خودش null برمی‌گردونه.
با ?: (Elvis) می‌تونیم یه مقدار پیش‌فرض بدیم. اینطوری دیگه خبری از NullPointerException نیست.

نتیجه عملی:
- همیشه از ? برای مقادیر احتمالی null استفاده کن.
- از !! فقط وقتی مطمئنی مقدار null نیست (و ترجیحاً اصلاً استفاده نکن).
- با safe call و Elvis کدت خواناتر و ایمن‌تر میشه.

#Kotlin #NullableVsNonNullable #AndroidDev #NullSafety #SafeCall #ElvisOperator #Codeit #Android #Kotlin
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔒 Null Safety در Kotlin؛ ترس از Null رو برای همیشه کنار بذار!

بسیاری از باگ‌های برنامه‌نویسی توی اندروید به خاطر NullPointerException هست. 😫 اما Kotlin با یه سیستم هوشمند، این مشکل رو ریشه‌کن کرده!

چطور کار میکنه؟
هر متغیر میتونه دو نوع باشه:
String? → میتونه null باشه
String → هرگز null نیست

🧠 مثال عملی:
فرض کن از سرور اسم کاربر رو می‌گیری. احتمال null وجود داره:

val name: String? = fetchUserName() // ممکنه null برگردونه
val length = name?.length ?: 0 // اگه null باشه، 0 می‌ذاره
println("Length: $length")


📌 توضیح کد:
با ?. (Safe Call) اگه name null باشه، length هم null میشه. با ?: (Elvis Operator) مقدار پیش‌فرض می‌دیم. نتیجه: بدون کرش!

🎯 بعدش چیکار کنیم؟
از عملگرهای !! فقط در مواقع مطمئن استفاده کن (مثلاً بعد از چک کردن if).

خلاصه: Null Safety مثل یه کمربند ایمنی می‌مونه – توی Kotlin دیگه NPE نمی‌بینی! 🚀

#NullSafety #Kotlin #JetpackCompose #AndroidDev #Codeit #Android #Kotlin #Programming
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔍 رفع باگ فقط پیدا کردن خطا نیست؛ یه طرز فکر می‌خواد!

بیشتر برنامه‌نویس‌ها وقتی با باگ مواجه می‌شن، استرس می‌گیرن و سریع شروع می‌کنن به حدس زدن. اما ذهنیت درست دیباگ اینه: باگ رو به‌عنوان یه سرنخ ببینی، نه یه تهدید.

🧠 ذهنیت دیباگر حرفه‌ای:
• به‌جای ناراحتی، کنجکاو باش
• فرض نکن، تست کن
• یک خطا رو به چند بخش کوچیک تقسیم کن
• لاگ‌ها رو مثل کارآگاه بخون

مثال واقعی: دیروز یه برنامه‌نویس ۲ ساعت دنبال NullPointerException گشت، بعد فهمید که فقط یه رشته رو قبل از استفاده چک نکرده. اگه از اول ذهنیت "مشکل رو پیدا می‌کنم" داشت، ۱۰ دقیقه‌ای حل می‌شد.

📌 در اندروید و کاتلین، از ابزارهایی مثل Android Studio Debugger و Logcat استفاده کن. مثلاً breakpoint بذار و متغیرها رو قدم‌به‌قدم بررسی کن.

نتیجه: هر بار که باگ می‌بینی، بگو "خوب شد، یه فرصت برای یادگیری". این طرز فکر باعث می‌شه سریع‌تر و حرفه‌ای‌تر عمل کنی.

#DebuggingMindset #ProgrammerMindset #Debugging #CodeQuality #Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔥 اپراتور Elvis (?:) در Kotlin ‒ نجات‌دهنده از null!

زمانی که با متغیرهای nullable کار می‌کنی، همیشه باید مقداردهی پیش‌فرض داشته باشی تا از NPE جلوگیری کنی. اپراتور Elvis (?:) مثل یک کوتاه‌نویس عمل می‌کند: اگر مقدار سمت چپش null باشه، مقدار سمت راست اجرا می‌شه.

مثال واقعی: فرض کن توی یک پروژه‌ی لاگین، اسم کاربر رو از سرور می‌گیری. اگر null بود، باید مقدار پیش‌فرض “کاربر ناشناس” نشون داده بشه.

val userName: String? = serverResponse?.name
val displayName = userName ?: "کاربر ناشناس"


📌 توضیح کد:
متغیر userName ممکنه null باشه. با ?: اگر null بود، "کاربر ناشناس" جایگزین می‌شه. این کار از کدهای طولانی if جلوگیری می‌کنه و کد خواناتر می‌شه.

💡 نکته: اپراتور Elvis رو می‌تونی با زنجیره‌ای از ?. و ?: ترکیب کنی تا یک‌خطی null-safe بنویسی.

برداشت نهایی: همیشه برای مقادیر nullable یک fallback داشته باش. Elvis دوست صمیمی Kotlin developer هاست!

#ElvisOperator #Kotlin #NullSafety #AndroidDev #Beginner #Codeit #Android #Kotlin
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🚀 عملگر !! در «Kotlin»؛ ابزاری قدرتمند اما خطرناک!

💡 عملگر not-null assertion (!!) برای تبدیل یک متغیر nullable به non-null استفاده می‌شه.
اگر مقدار null باشه، برنامه با «NullPointerException» crash می‌کنه.

📱 مثال واقعی: فرض کن از API داده می‌گیری و می‌دونی فیلد «name» همیشه وجود داره.
اونوقت می‌تونی از !! استفاده کنی.

🧩 نمونه کد
val name: String? = response.name
val length = name!!.length
println("Length is $length")

🔍 توضیح
اینجا متغیر «name» از نوع nullable String هست. با !! می‌کنیم که non-null باشه و «length» رو بگیریم.
اگر «name» null باشه، خطای NPE می‌گیریم و برنامه کرش می‌کنه.

نکته حرفه‌ای
بهتره به جای !! از «let», «Elvis operator» (?:) یا early return استفاده کنی تا کد ایمن‌تر باشه.
!! رو فقط در مواقعی که ۱۰۰٪ مطمئنی null نیست (مثلاً بعد از بررسی صریح) به کار ببر.

#Kotlin #NullSafety #Android #NotNullAssertion #Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
📚 مستندات رو چطور بخونیم که وقت‌مون هدر نره؟
خیلی از برنامه‌نویس‌ها سراغ داکیومنت می‌رن اما بعد از چند دقیقه گیج می‌شن و ول می‌کنن. 😵‍💫

🟢 رازش چیه؟
اول باید بفهمی دقیقاً دنبال چی هستی. نه اینکه کل مستندات رو از اول تا آخر بخونی!

🔍 روش عملی:
1️⃣ مشکل رو مشخص کن → مثلاً «چطور از Retrofit با Hilt استفاده کنم؟»
2️⃣ بخش Quick Start یا Getting Started رو ببین → نه همه‌ی API‌ها!
3️⃣ مثال‌های کد رو با دقت نگاه کن → فقط کافیه ببینی چه پارامترهایی می‌گیره.
4️⃣ بخش "See Also" یا "Related" رو چک کن → همیشه به لینک‌های داخل داکیومنت توجه کن.

🛠 یه نکته‌ی طلایی:
بعد از خوندن یه بخش، همون لحظه توی پروژه‌ات تستش کن. اگه جواب نداد، برگرد و خط اول خطا رو ببین!

💡 نتیجه؟
داکیومنت مثل نقشه‌ست، نه رمان. فقط جاهایی رو بخون که به کارت میاد. با این روش، سرعت یادگیریت چند برابر می‌شه.

#مستندات #یادگیری #برنامه‌نویس #مستندخوانی #Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2
🔹 تا حالا شده توی کاتلین یه متغیر تعریف کنید و از نوشتن نوع داده‌اش صرف‌نظر کنید؟ 🤔
🔹 این قابلیت رو می‌گن Type Inference یا استنتاج نوع – کامپایلر خودش تشخیص می‌ده متغیر چه نوعی داره.
🔹 مثلاً وقتی می‌نویسید val name = "Ali"، کاتلین می‌فهمه name از نوع String هست.
🔹 این کار هم کد رو خواناتر می‌کنه، هم سرعت نوشتن رو بالا می‌بره.

📌 مثال عملی:
فرض کنید یک لیست از کاربران داریم و می‌خوایم تعداد حروف اسم هر کاربر رو حساب کنیم. با Type Inference نیازی به نوشتن نوع متغیرها نداریم:

val users = listOf("Sara", "Reza", "Niloofar")
val nameLengths = users.map { it.length }
println(nameLengths) // [4, 4, 8]


توضیح:
- users از نوع List<String> و nameLengths از نوع List<Int> به‌طور خودکار تشخیص داده شدن.
- کامپایلر بر اساس مقداردهی اولیه، نوع رو حدس می‌زنه – دیگه لازم نیست بنویسید val nameLengths: List<Int>.
- این ویژگی کد رو جمع‌وجورتر می‌کنه و خطاهای تایپ رو هم کاهش میده.

🎯 نکته مهم:
اگر متغیر مقدار اولیه نداشته باشه یا مقدار null بگیره، باید نوع رو صریحاً مشخص کنید:
var price: Double? = null // اینجا حتماً باید نوع رو بنویسیم


💡 خلاصه:
- از Type Inference برای کدهای کوتاه و خوانا استفاده کنید.
- وقتی نوع واضح نیست یا nullable هست، خودتون نوع رو مشخص کنید.
- این یکی از قابلیت‌های جذاب کاتلینه که برنامه‌نویسی اندروید رو لذت‌بخش‌تر می‌کنه.

#Codeit #Android #Kotlin #Jetpack #TypeInference #CleanCode #KotlinBeginner
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
🔹 تا حالا توی «Kotlin» از «if» فقط برای شرط‌گذاری استفاده می‌کردی؟ 😲
🔸 وقتشه ببینی «if» می‌تونه یه مقدار برگردونه! یعنی مثل یه عبارت عمل کنه، نه فقط دستور.

یعنی به جای نوشتن چند خط کد برای مقداردهی، می‌تونی مستقیم از «if» خروجی بگیری.
⚡️ این ویژگی باعث میشه کدت خواناتر، کم‌حجم‌تر و حرفه‌ای‌تر بشه.

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

📌 کد ساده با «if as expression»:

val score = 85
val message = if (score >= 90) {
"عالی! عالی! 🏆"
} else if (score >= 70) {
"خوب بود، ادامه بده 💪"
} else {
"نیاز به تلاش بیشتر داره 📚"
}
println(message)


🔍 اینجا «if» دقیقا مثل یه تابع عمل می‌کنه و مقدار نهایی رو به «message» نسبت میده.
🔁 دیگه نیازی به متغیر موقت یا «var» نداری، همه چیز یک‌خطی و تمیزه.

🎯 نکته مهم: حتما باید همه شاخه‌ها (if, else if, else) مقدار برگردونن، وگرنه کامپایل خطا میده.

🔥 یه قدم کوچیک به سمت کدنویسی حرفه‌ای‌تر با «Kotlin». از امروز تو پروژه‌هات از این قابلیت استفاده کن.

#Codeit #Android #Kotlin #Jetpack #KotlinTips #CleanCode #AndroidDev #Programming
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
📌 یه گیت‌هاب حرفه‌ای می‌تونه درِ فرصت‌های شغلی رو به روی Android Developer باز کنه 🚀
خیلی از کارفرماها اول پروفایل گیت‌هابت رو چک می‌کنن، پس باید جذاب باشه.

🛠️ چند نکته برای ساختن یه پروفایل قوی:

1️⃣ README پروژه‌ها رو جدی بگیر
توضیح بده چرا این پروژه رو ساختی، چه کتابخونه‌هایی استفاده کردی و چطور اجرا بشه.

2️⃣ کد تمیز و منظم بنویس
حتی پروژه‌های شخصی هم نشون‌دهنده سبک کدنویسی تو هستن. از Git Flow استفاده کن.

3️⃣ پروژه‌های واقعی و قابل نمایش
یه اپ ساده Kotlin + Jetpack Compose با معماری MVVM بذار. مثلاً یه اپ هواشناسی یا Todo.

4️⃣ ثبات در Commit
کامیت‌های منظم و پیام‌های واضح نشون می‌ده که برنامه‌نویس متعهدی هستی 🔥

5️⃣ پروفایل README شخصی
معرفی کوتاه از خودت، تکنولوژی‌هایی که بلدی، و لینک به لینکدین یا وبلاگ.

🔥 نکته طلایی: حتی یه پروژه ساده با تست و مستندسازی خوب، از یه پروژه بزرگ بدون توضیح بهتره.

#Codeit #Android #Kotlin #Jetpack #GitHub #OpenSource #CareerTips
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2
👨‍💻 تازه شروع کردی با «Kotlin»؟ یک سوییچ قدرتمند به اسم «when expression» داره که جایگزین «switch» قدیمی جاواست!
🔹 با این قابلیت می‌تونی بر اساس شرایط مختلف تصمیم‌گیری کنی، بدون شلوغی و خط‌های تکراری.
🔸 مثلاً فرض کن داری بر اساس نمره کاربر، پیام نمایش میدی.
👇 ببین چقدر تمیزه:

val score = 85
val gradeMessage = when (score) {
in 90..100 -> "🎉 عالی! نمره A"
in 80..89 -> "👍 خوبه! نمره B"
in 70..79 -> "📚 قابل قبول! نمره C"
else -> "😅 نیاز به تلاش بیشتر!"
}
println(gradeMessage)


📌 این کد نمره رو با بازه‌های مشخص شده مقایسه می‌کنه و پیام مناسب رو برمی‌گردونه.
مزیت بزرگش نسبت به «if-else» اینه که خواناتر و جمع‌وجورتره.
💡 می‌تونی از «when» برای نوع‌های مختلف مثل رشته، اعداد، یا حتی کلاس‌ها هم استفاده کنی.
🎯 تمرین کن: یه تابع با ورودی روز هفته بنویس و با «when» مشخص کن تعطیله یا نه!

#Codeit #Android #Kotlin #Jetpack #KotlinBeginner #WhenExpression #CleanCode
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔁 حلقه‌های تکرار (For Loops) در کاتلین – ساده و عملی
اگر تازه کاتلین رو شروع کردی، یکی از اولین چیزایی که باید بلد باشی، حلقه for هستش. این حلقه بهت اجازه میده روی Range یا لیست‌ها قدم بزنی و کدت رو مرتب و کوتاه بنویسی.

کاربرد واقعی:
فرض کن یه لیست از اسم کاربرها داری و می‌خوای همشون رو توی کنسول چاپ کنی. به جای نوشتن چند خط تکراری، از for استفاده می‌کنی.

مثال کد (بدون placeholder):
fun main() {
// حلقه روی محدوده اعداد ۱ تا ۵
for (i in 1..5) {
println("Number: $i")
}

// حلقه روی لیست اسامی
val users = listOf("Ali", "Sara", "Reza")
for (user in users) {
println("Hello, $user!")
}
}

توضیح کد:
- 1..5 یه Range از ۱ تا ۵ می‌سازه و i هر بار یکی از این مقادیر رو می‌گیره.
- توی حلقه دوم، user به‌ترتیب عناصر لیست رو می‌گیره و چاپ می‌کنه.
- این روش کدت رو خواناتر و خطاهای تکرار دستی رو از بین می‌بره.

🎯 نتیجه‌گیری:
هر وقت نیاز به تکرار یه عمل روی مجموعه‌ای از داده‌ها داری، از for استفاده کن. این یکی از پایه‌ای‌ترین ابزارهای برنامه‌نویسیه که تو همه پروژه‌هات باهاش کار می‌کنی.

#Codeit #Android #Kotlin #Jetpack #Loops #Beginner #Programming
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2
🚀 حلقه‌های «For» در کاتلین؛ مقدمه‌ای ساده و کاربردی

تصور کن یه لیست از اسم دوستات داری و می‌خوای به تک‌تکشون پیام تبریک بدی. نوشتن دستی خیلی خسته‌کننده‌ست، اما با حلقه‌ی «For» می‌تونی یه بار کد بنویسی و خودش بره سراغ همه‌ی آیتم‌ها.

در کاتلین، حلقه‌ی «For» برای پیمایش روی مجموعه‌هایی مثل لیست، آرایه و بازه (range) استفاده می‌شه. ساختارش خیلی ساده و خواناست.

مثال واقعی: فرض کن یه اپلیکیشن داری که اسامی کاربران رو نشون می‌ده. با «For» می‌تونی هر اسم رو جدا جدا تو خروجی چاپ کنی.

اول یه لیست از اسامی تعریف می‌کنیم و بعد با «For» تک‌تک عناصر رو می‌گیریم:

val names = listOf("Ali", "Sara", "Reza", "Niloofar")

for (name in names) {
println("سلام $name!")
}


این کد از اول لیست شروع می‌کنه و هر بار یه اسم رو تو متغیر name می‌ذاره و داخل حلقه چاپش می‌کنه. نیازی به ایندکس‌گذاری دستی نیست.

نکته کاربردی: اگه به ایندکس (شماره) هم نیاز داری، می‌تونی از withIndex() استفاده کنی:

for ((index, name) in names.withIndex()) {
println("$index: $name")
}


اینطوری هم شماره و هم مقدار رو داری. برای پیمایش روی بازه‌های عددی هم به راحتی می‌شه از «For» استفاده کرد:

for (i in 1..5) {
println("شماره $i")
}


حلقه‌ی «For» تو کاتلین یکی از پرکاربردترین ابزارهای تکراره. با تمرین روی مثال‌های ساده، به‌سرعت بهش مسلط می‌شی. ازش تو پروژه‌های واقعی برای نمایش لیست‌ها، فیلتر کردن داده‌ها و پردازش مجموعه‌ها استفاده کن. 🎯

#Codeit #Android #Kotlin #Jetpack #ForLoop #KotlinBasics #LearnKotlin
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2
سلام رفیق! 🖐️ وقتشه یه کم عمیق‌تر با چرخه‌های تکرار تو مربع«Kotlin» آشنا بشی. امروز سراغ حلقه‌های «While» و «do-while» میریم. این دو مثل یه سرباز وظیفه‌شن که تا وقتی شرط برقراره، دست از کار نمیکشن! 😎

🔹 تفاوت کلیدی: «While» اول شرط رو چک می‌کنه بعد بدنه رو اجرا می‌کنه، اما «do-while» تضمین می‌ده که بدنه حداقل یه بار اجرا بشه. این یعنی: اول انجام بده، بعد بررسی کن!

مثال واقعی: فرض کن تو یه اپلیکیشن فروشگاهی، تا وقتی که کاربر محصولی رو به سبد خرید اضافه نکرده، یه پیام هشدار نشون بدی. اینجا «While» جواب میده. ولی اگه بخوای اول یه بار پیام رو نشون بدی و بعد شرط رو چک کنی، «do-while» انتخاب بهتری‌ه.

حالا بریم سر کد:

fun main() {
var count = 0

// While loop: شرط اول بررسی می‌شه
while (count < 5) {
println("شماره $count")
count++
}

println("---- تمام شد while ----")

// do-while loop: حداقل یک بار اجرا می‌شه
var attempts = 0
do {
println("تلاش ${attempts + 1}")
attempts++
} while (attempts < 3)
}


🧠 تو این کد: اول «While» تا وقتی که count کمتر از ۵ باشه، اعداد رو چاپ می‌کنه. بعد «do-while» رو می‌بینی که حتی اگه attempts از اول ۳ باشه، بازم یه بار چاپ میشه. این تفاوت ظریف تو خیلی از سناریوهای واقعی مثل ورودی کاربر یا پردازش داده‌ها کاربرد داره.

💡 نکته مهم: از این حلقه‌ها وقتی استفاده کن که تعداد دقیق تکرار رو ندونی. مثلاً منتظر پاسخ کاربر بمونی تا یه شرط خاص رخ بده.

#Codeit #Android #Kotlin #Jetpack #WhileLoop #DoWhileLoop #KotlinBeginners #ProgrammingBasics
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
✍️ یه کامیت مسیج خوب، مثل یه یادداشت حرفه‌ای برای آینده‌ست.
نه «رفع باگ» و نه «آپدیت»؛ این‌ها چیزی به تیمت اضافه نمی‌کنن.

📝 یه کامیت مسیج تمیز باید جواب سه تا سوال رو بده:
چرا این تغییر انجام شد؟ چه مشکلی رو حل کرد؟ چه تأثیری روی کد گذاشت؟

🧠 ذهنیت درست اینه: کامیت‌هات رو طوری بنویس که انگار شش ماه بعد یه نفر (حتی خودت) بخونه و دقیق بفهمه چه اتفاقی افتاده.

🚀 مثال: به‌جای «Fix login bug» بنویس: «Fix crash on login when username contains special characters»

🔧 از «Conventional Commits» استفاده کن:
- «feat» برای قابلیت جدید
- «fix» برای رفع باگ
- «refactor» برای بهبود کد بدون تغییر رفتار

🎯 هر کامیت باید فقط یک کار انجام بده. کامیت‌های بزرگ و چندمنظوره رو با «git add -p» تیکه‌تیکه کن.

💡 یه نکته طلایی: قبل از کامیت، «git diff» رو چک کن تا مطمئن بشی فقط تغییرات مورد نظرت رو اضافه می‌کنی.

📈 توی تیم، یه «Commit Convention» مشخص بذارین و همه بهش پایبند باشن. اینطوری «git log» مثل یه کتابخونه مرتب می‌مونه.

🧩 نتیجه‌گیری: کامیت مسیج خوب یعنی احترام به خودت، هم‌تیمی‌هات و آینده پروژه. «Code Review» هم راحت‌تر میشه.

🌟 از امروز، هر کامیتت رو با دقت بنویس. چند ثانیه وقت بیشتر بذار، ولی ماه‌ها سردرگمی رو حذف کن.

#Codeit #Android #Kotlin #Jetpack #Git #CleanCode #VersionControl #DeveloperMindset
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
سلام برنامه‌نویس حرفه‌ای! 🚀

تا حالا خواستی یه حلقه‌ای بنویسی که از ۱ تا ۱۰ رو پیمایش کنه و هر بار یه کاری انجام بده؟ خب، تو «Kotlin» یه راه فوق‌العاده ساده و خوش‌خوندن به اسم «Ranges» و «Progressions» داریم که این کار رو برات راحت‌تر می‌کنه. 😎

«Ranges» یعنی محدوده‌ای از اعداد، حروف یا هر چیز قابل مقایسه. مثلاً از ۱ تا ۱۰ یا از 'a' تا 'z'. این محدوده‌ها رو با .. یا «rangeTo» می‌سازی.

«Progression» هم همون «Range» هست ولی با یه گام (step) خاص. مثلاً از ۱ تا ۱۰ با گام ۲: ۱، ۳، ۵، ۷، ۹. به‌کار بردنش تو حلقه‌های «for» یا دستورات شرطی خیلی باحاله.

بیایم یه مثال عملی بزنیم: فرض کن می‌خوای توی یه برنامه اعداد زوج از ۲ تا ۲۰ رو چاپ کنی. این کار رو با یه «Progression» به راحتی انجام می‌دی:

for (i in 2..20 step 2) {
println("عدد زوج: $i")
}


توی این کد، 2..20 یه «Range» از ۲ تا ۲۰ می‌سازه و step 2 باعث میشه که فقط اعداد زوج پیمایش بشن. خروجی: ۲، ۴، ۶، ...، ۲۰. خیلی ساده و خواناتر از حلقه‌های کلاسیک! 😍

نکته جالب: می‌تونی برای چک کردن اینکه یه عدد توی محدوده هست یا نه هم از in استفاده کنی. مثلاً:

val score = 85
if (score in 0..100) {
println("نمره معتبره! ")
}


اینطوری دیگه نیازی به دو تا شرط >=0 و <=100 نداری.

کاربرد واقعی: توی بازه‌بندی سن کاربران، بررسی محدوده قیمت‌ها، ایجاد «ProgressBar»های سفارشی، یا حتی توی «when» برای مطابقت دادن چندین مقدار.

حالا که با «Ranges و Progressions» آشنا شدی، دیگه می‌تونی کدهای «Kotlin» رو خیلی خواناتر و کوتاه‌تر بنویسی. همین امروز ازش تو پروژه‌هات استفاده کن! 💪

#Codeit #Android #Kotlin #Jetpack #Ranges #Progressions #KotlinBeginner #CleanCode
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🎯 تابع با پارامتر یعنی کدی که هر بار یه جواب جدید بده!
مثلاً یه تابع بنویس که اسم هر کسی رو بگیره و جدا سلام کنه

📌 پارامترها مثل ورودی‌های یه دستگاه‌ن:
دستگاه قهوه‌ساز رو در نظر بگیر – با دانه‌های مختلف، قهوه متفاوت می‌گیری.
توابع Kotlin هم همینکارو می‌کنن با پارامترهاشون.

🔧 یه مثال واقعی:
فرض کن توی اپت باید به کاربرا پیام خوش‌آمد بگی. با پارامتر می‌تونی اسم و سنش رو بدی و خروجی شخصی‌سازی بشه.

👇 این تابع ساده رو ببین:

fun greet(name: String, age: Int) {
println("سلام $name! سنت $age ساله.")
}


چی کار می‌کنه؟
– دو تا پارامتر ورودی می‌گیره: name (رشته) و age (عدد)
– خروجی رو با مقادیر متفاوت چاپ می‌کنه

مثلاً صدا زدنش این‌طوریه:
greet("آرین", ۲۵) 👈 خروجی: "سلام آرین! سنت ۲۵ ساله."

🚀 نکته مهم:
با پارامترها تابعقابل استفاده مجدد میشه و کدت خشک‌تر از همیشه‌ست.
از یه تابع برای هزاران کاربر مختلف استفاده کن فقط با عوض کردن ورودی‌ها.

#Codeit #Android #Kotlin #Jetpack #Functions #ProgrammingBasics #KotlinBeginner
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2🔥1
🟢 پارامترهای پیش‌فرض (Default) و نام‌دار (Named) در کاتلین
خیلی وقت‌ها مجبور بودی برای هر حالت جدید، یه تابع جدا بنویسی؟ 🥱
کاتلین با Default Arguments و Named Arguments این مشکل رو یک‌بار برای همیشه حل کرده. 🎯

💡 ماجرا چیه؟
- پارامتر پیش‌فرض: می‌تونی برای آرگومان‌ها مقدار اولیه بذاری. اگه هنگام فراخوانی مقداری ندی، همون مقدار پیش‌فرض استفاده میشه.
- پارامتر نام‌دار: موقع صدا زدن تابع، اسم پارامتر رو مینویسی و بعد مقدار. دیگه مجبور نیستی ترتیب رو رعایت کنی!

🛠 مثال واقعی: فرض کن تابعی برای ارسال اعلان (Notification) می‌نویسی. خیلی از پارامترها مثل عنوان و بدنه همیشه فرق دارن، ولی متن پیش‌فرض و تاخیر شاید ثابت باشن.

👇 کد عملی:
fun sendNotification(
title: String,
body: String,
priority: Int = 1,
delayMs: Long = 0L
) {
// شبیه‌سازی ارسال نوتیفیکیشن
println("Sending: $title - $body (Priority=$priority, Delay=${delayMs}ms)")
}

// فراخوانی با مقادیر پیش‌فرض برخی پارامترها
sendNotification("سلام", "کد جدید اومد!")

// فراخوانی با اسم پارامتر و تغییر فقط delay
sendNotification("توجه", "به‌روزرسانی", delayMs = 5000L)


📊 توضیح کد:
- پارامتر priority و delayMs مقدار پیش‌فرض دارن.
- توی خط اول فقط title و body رو می‌دی، بقیه از پیش‌فرض استفاده میشه.
- توی خط دوم با استفاده از Named Argument فقط delayMs رو تغییر دادی و ترتیب مهم نیست.

🚀 یادت باشه:
این قابلیت باعث میشه توابعت انعطاف‌پذیر بشن و کد خواناتر و تمیزتری داشته باشی. دیگه نیازی به overload کردن تابع نیست!

#Codeit #Android #Kotlin #Jetpack #KotlinTips #CleanCode #MobileDev #Programming
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
🔥 هر اندروید دولوپری که هنوز گیت یاد نگرفته، داره وقتش رو توی پروژه‌ها هدر میده!

🔹 گیت فقط یک ابزار نیست؛ یک عادت حرفه‌ایه که کدت رو از هر فاجعهای نجات میده.

🔹 تصور کن یه باگ عجیب پیدا کردی و نمیدونی کی و کجا کد رو خراب کردی. با گیت میتونی دقیقاً برگردی به همون commit قبلی و تفاوت رو ببینی.

🔹 توی تیمهای اندرویدی، بدون گیت عملاً نمیشه همکاری کرد. هر کدوم یه ورژن متفاوت دارن و ادغام دستی کدها تبدیل به کابوس میشه.

🔹 حتی اگه تنها کار میکنی، گیت بهت قدرت آزمایش رو میده. یه branch جدید باز میکنی، یه feature جدید مینویسی، اگه جواب نداد، برمیگردی به master بدون هیچ آسیبی.

🔹 در مصاحبههای شغلی اندروید، «Git» یکی از اولین سوالاست. ندونستنش یعنی رد شدن از همون第一步.

🔹 فراموش نکن: گیت یک «Resume» برای کدهای قبلیته. تاریخچه پروژه رو میتونی به کارفرما نشون بدی.

🔹 فقط چهارتا دستور یاد بگیر تا از بقیه جلو بیفتی:

git init
git add .
git commit -m "message"
git push origin main


🔹 بعد از چند روز عادت میکنی و بدون گیت حس میکنی یه پات رو گم کردی.

🎯 نکته طلایی: گیت رو با پروژههای کوچیک اندروید تمرین کن تا توی پروژههای بزرگ استرس نداشته باشی.

📌 پس از امروز، هر پروژهای که شروع میکنی، اول «git init» بزن!

#Codeit #Android #Kotlin #Git #VersionControl #DeveloperMindset #CareerGrowth #Productivity

🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
سلام برنامه‌نویسِ تازه‌کار 👋
بیایید با یکی از مهم‌ترین مفاهیم Kotlin آشنا بشیم: Return values (مقادیر بازگشتی)

توابع می‌تونن بعد از انجام کارشون، یه نتیجه به ما برگردونن.
این نتیجه می‌تونه عدد، متن، لیست یا هر نوع داده‌ای باشه.

چرا مهمه؟
کدت خواناتر میشه، می‌تونی از نتیجه تابع توی جای دیگه‌ای استفاده کنی و از تکرار کد جلوگیری کنی.

📱 یک مثال واقعی:
فرض کن توی اپلیکیشن فروشگاهی، قیمت کالا رو بعد از اعمال تخفیف محاسبه می‌کنی.

حالا ببینیم چطور توی کد Kotlin پیاده‌سازی میشه:

fun calculateDiscountedPrice(originalPrice: Double, discountPercent: Int): Double {
val discountAmount = originalPrice * discountPercent / 100
return originalPrice - discountAmount
}

fun main() {
val price = 200.0
val discount = 15
val finalPrice = calculateDiscountedPrice(price, discount)
println("قیمت نهایی: $finalPrice تومان")
}


💡 توضیح کد:
تابع calculateDiscountedPrice دو ورودی می‌گیره و با return مقدار نهایی رو برمی‌گردونه.
بعد توی main از مقدار بازگشتی استفاده می‌کنیم. خروجی: قیمت نهایی: 170.0 تومان.

🎯 نکته برداری:
- همیشه نوع داده‌ای که برمی‌گردونی رو مشخص کن (اینجا Double).
- اگه تابع چیزی برنگردونه، از Unit استفاده کن (مثل void در جاوا).

با درک درست Return values می‌تونی کدهای تمیزتری بنویسی و منطق برنامه‌ات رو به ماژول‌های کوچیک تقسیم کنی.

#Codeit #Android #Kotlin #Jetpack #KotlinBasics #ReturnValues #CleanCode
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
🎯 توابع تک‌عبارتی (Single-expression functions) در کاتلین
یکی از قابلیت‌های ظریف ولی قدرتمند کاتلین، حذف {} و return اضافه است. کافیست تابعی که فقط یک عبارت داره رو با علامت = تعریف کنید.

🔹 مثال ساده:
fun double(x: Int): Int = x * 2

همون کار تابع معمولی رو انجام میده ولی مختصرتر و خواناتر.

🔹 مورد استفاده واقعی:
فرض کنید در یک کلاس ویومدل، مقداردهی اولیه state رو می‌خواین انجام بدین:
class MainViewModel : ViewModel() {
private val _count = MutableStateFlow(0)
val count: StateFlow<Int> = _count.asStateFlow()
}

با توابع تک‌عبارتی میشه تابع updateCount رو هم این‌طور نوشت:
fun updateCount(newValue: Int) = _count.update { newValue }


🔹 کد کامل و کاربردی:
data class User(val name: String, val age: Int)

fun isAdult(user: User): Boolean = user.age >= 18
fun greet(user: User): String = "Hello ${user.name}"

این دو تابع فقط با یک خط تعریف شدن و نیاز به { و return ندارن.

🔹 چرا مفید است؟
- کد تمیزتر و حجم کمتر
- خوانایی بهتر برای منطق‌های ساده
- مناسب برای استفاده در sealed class ها، when عبارات و فیلترهای لیست

🔹 نکته عملی:
از این قابلیت برای تابع‌هایی که فقط یک عملیات ساده دارن استفاده کن، ولی برای منطق پیچیده‌تر حتماً از {} استفاده کن تا خوانایی از بین نره.

#Codeit #Android #Kotlin #Jetpack #KotlinTips #SingleExpressionFunctions #KotlinBeginner
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
🔹 توابع محلی در «Kotlin» : کجا تعریفشون کنیم تا کد تمیزتری داشته باشیم؟ 🤔

🔸 گاهی توی یه تابع بزرگ، چند خط کد تکراری داریم که فقط همون جا استفاده میشن. اینجا به جای درست کردن یه تابع جدا تو سطح کلاس، میتونیم از توابع محلی (Local Functions) استفاده کنیم.

🔹 یه تابع محلی داخل بدنه تابع اصلی تعریف میشه و فقط همونجا قابل دسترسیه. این کار باعث میشه کد خواناتر بشه و از آلودگی فضای کلاس جلوگیری کنه.

🔸 مثال کاربردی: اعتبارسنجی ورودی‌های کاربر قبل از ثبت‌نام. به جای نوشتن شرط‌های تکراری، یه تابع محلی میسازیم:

fun registerUser(name: String, email: String, age: Int) {
fun validateInput(input: String, fieldName: String) {
if (input.isBlank()) {
throw IllegalArgumentException("$fieldName cannot be blank")
}
}

validateInput(name, "Name")
validateInput(email, "Email")
println("User registered successfully: $name")
}


🔸 اینجا تابع «validateInput» فقط داخل «registerUser» معتبره و کد رو خواناتر و خشک‌تر (DRY) میکنه.

🔹 نکته مهم: توابع محلی میتونن به پارامترهای تابع بیرونی هم دسترسی داشته باشن (مثل «name» و «email»). این قابلیت باعث کاهش پارامترهای اضافی میشه.

🔸 از توابع محلی وقتی استفاده کن که منطق کمکی خیلی اختصاصیه و نباید در معرض بقیه کد قرار بگیره. مثلاً برای اعتبارسنجی، تبدیل داده یا پیش‌پردازش درون یه تابع پیچیده.

📌 خلاصه: توابع محلی ابزاری ساده برای ماژولار کردن کد بدون آلودگی scope هستن.

#Codeit #Android #Kotlin #Jetpack #KotlinTips #CleanCode #FunctionalProgramming
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1