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

Kotlin • Android

🚀 آموزش ساده، کاربردی و پروژه‌محور
💡 مخصوص توسعه‌دهندگان موبایل
Download Telegram
🔹 تا حالا شده توی کاتلین یه متغیر تعریف کنید و از نوشتن نوع داده‌اش صرف‌نظر کنید؟ 🤔
🔹 این قابلیت رو می‌گن 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
📱 آماده‌سازی برای مصاحبه‌های «Android» فقط حفظ کردن کد نیست؛ یک جنگ ذهنی و برنامه‌ریزی شده است. 🧠

🎯 اول از همه: روی مفاهیم پایه‌ای مثل «Activity Lifecycle»، «Fragment»، «ViewModel» و «Coroutines» تسلط پیدا کن. مصاحبه‌کننده‌ها به عمق دانش تو نگاه می‌کنن‌.

📚 یک نقشه راه ۴ هفته‌ای داشته باش: هفته اول «Kotlin» و «Jetpack Compose»، هفته دوم «Architecture Components» و «Dependency Injection»، هفته سوم «Networking» و «Database» و هفته چهارم مرور و شبیه‌سازی مصاحبه.

تمرین حل مسئله با «LeetCode» و سوالات الگوریتمی رو فراموش نکن. حتی برای «Android» هم این بخش از مصاحبه جدی گرفته می‌شه.

🤝 مصاحبه‌های ساختگی با دوستان یا ضبط صدای خودت انجام بده. این کار اعتماد به نفس تو رو برای توضیح مفاهیم پیچیده بالا می‌بره.

🔍 رزومه و گیت‌هاب «GitHub» خودت رو با ۲-۳ پروژه عملی قوی پر کن. مصاحبه‌کننده‌ها عاشق دیدن کدهای واقعی و «Clean Architecture» هستند.

🚀 در آخر: هر شکستی رو به عنوان تجربه یادگیری ببین. مصاحبه‌های «Android» نیازمند صبر و مداومت هستن.

#Codeit #Android #Kotlin #Jetpack #InterviewPrep #CareerGrowth #TechMindset
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2
🔍 اعتبارسنجی ورودی در «Kotlin» — از صفر تا یک مثال عملی

تا حالا شده فرمی پر کنید و بعد از ارسال ببینید خطا گرفته؟ 😤
دلیلش عدم اعتبارسنجی درست ورودی‌هاست.
توی «Kotlin» می‌تونیم خیلی ساده این کار رو انجام بدیم.

📌 فرض کنید یک فیلد «username» داریم که نباید خالی باشه و حداقل ۳ کاراکتر داشته باشه.

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

fun validateUsername(input: String): String? {
return when {
input.isBlank() -> "نام کاربری نمی‌تواند خالی باشد"
input.length < 3 -> "نام کاربری باید حداقل ۳ کاراکتر داشته باشد"
else -> null // یعنی معتبر است
}
}


🧠 این تابع یک «String؟» برمی‌گردونه — اگر خطایی وجود داشت، پیغام خطا رو برمی‌گردونه، در غیر این صورت «null» یعنی معتبر.

حالا چطور استفاده کنیم؟

fun main() {
val username = "ab"
val error = validateUsername(username)
if (error != null) {
println("خطا: $error")
} else {
println("ورودی معتبر است")
}
}


📱 این روش ساده رو می‌تونید توی فرم‌های «Jetpack Compose» هم پیاده کنید.
فقط کافیه تابع اعتبارسنجی رو به «onValueChange» اضافه کنید.

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

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

━━━━━━━━━━━━━━━
@CodeitMobile
1
🚀 کدت رو طوری بنویس که انگار ۶ ماه دیگه یه غریبه می‌خونه!
کامنت‌گذاری درست، نشون‌دهنده نظم ذهنی یه برنامه‌نویسه.
کامنت‌های بی‌خود (// i++ 😵) فقط کد رو شلوغ می‌کنه.

📌 فرق کامنت خوب و بد:
- توضیح واضح بودن کد با کامنت
- توضیح چرایی و هدف کد

💡 مثال واقعی: توی یه پروژه اندروید، یه تابع پرداخت داریم.

// محاسبه مالیات بر اساس قوانین جدید ۱۴۰۳
fun calculateTax(amount: Double): Double {
val taxRate = 0.09
return amount * taxRate
}


🔍 کامنت بالا می‌گه چرا نرخ ۹٪ انتخاب شده. خود کد هم واضحه.

🛠 چند قانون ساده:
1️⃣ کامنت رو برای دلیل بذار، نه برای چیستی
2️⃣ کامنت‌های یک‌خطی برای توضیح بخش‌های پیچیده
3️⃣ از «TODO» برای یادآوری کارهای ناقص استفاده کن

با رعایت این اصول، کدت برای خودت و بقیه خوندنی‌تر میشه.

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

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
📦 تو کاتلین، کدهات رو توی پوشه‌های خوش‌راست به اسم «Package» مرتب می‌کنی.
🧠 هر «Package» یه فضای مشخص برای کلاس‌ها، توابع و متغیرهاست تا سورس‌کدت شلوغ نشه.
🔍 مثلاً همه‌ی کلاس‌های مربوط به کاربر رو می‌ری توی «Package» به اسم model و بخش UI رو توی ui.

📥 برای استفاده از محتوای یه «Package» دیگه، باید با «import» اون رو صدا بزنی.
⚡️ «Import» مثل یه میانبر می‌مونه: به جای نوشتن مسیر کامل هر بار، یه بار «import» می‌کنی و بعد اسم ساده‌ش رو می‌نویسی.

🎯 مثال واقعی: فرض کن توی پروژه‌ات یه کلاس تو «Package» به اسم utils داری:

// file: src/main/kotlin/com/example/app/model/User.kt
package com.example.app.model

data class User(val name: String, val age: Int)


حالا توی فایل دیگه‌ای می‌خوای از این کلاس استفاده کنی:

// file: src/main/kotlin/com/example/app/ui/ProfileScreen.kt
package com.example.app.ui

import com.example.app.model.User

fun showProfile() {
val user = User("Sara", 28)
println(user)
}


📌 اینجا import com.example.app.model.User باعث شده بدون نوشتن مسیر کامل، مستقیم User رو استفاده کنیم.
📁 بسته‌بندی درست کدها رو خواناتر می‌کنه و از تداخل اسمی جلوگیری می‌کنه.

💡 نکته: توی «Jetpack Compose» هم از همین قاعده پیروی کن؛ هر صفحه رو توی «Package» مجزاش بذار تا نگهداری کد راحت‌تر بشه.

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

━━━━━━━━━━━━━━━
@CodeitMobile
🔥2
توسعه‌دهنده‌ای که از راه دور کار می‌کنه، باید ذهنیت حرفه‌ای خودش رو بالاتر از محیط فیزیکی ببره 🚀

📌 بزرگ‌ترین چالش «Remote Work» برای برنامه‌نویس‌ها، مرز بین زندگی شخصی و کاریه. وقتی دفتر کار خونه‌ست، وسوسه‌ی چک کردن ایمیل‌های شبانه یا کد زدن آخر هفته زیاد میشه.

💡 چند عادت طلایی که توی «Android Development» از راه دور به دادم رسیده:

1️⃣ ساعت شروع و پایان مشخص داشته باش. حتی اگه توی «Kotlin» غرق شدی، یه تایمر بذار و قطع کن.
2️⃣ یه فضای فیزیکی مجزا برای کار درست کن. حتی یه گوشه از میز ناهارخوری بهتر از تختخوابه.
3️⃣ توی جلسات «Stand-up» با تیم، دقیق و صادق باش. بگو چقدر جلو رفتی و کجا گیر کردی.
4️⃣ آخر هر روز یک «Code Review» کوچیک برای خودت انجام بده: چه نوشتی، چی رو بهتر می‌کردی.

🔥 مثال واقعی: یکی از دوستانم با همین عادت‌ها توی یه استارتاپ بین‌المللی از خونه پروژه‌های «Jetpack Compose» رو تحویل داد و ترفیع گرفت.

📝 حواست باشه: «Remote Work» یعنی مسئولیت‌پذیری بیشتر. نه اینکه هر وقت خواستی کد بزنی، بلکه هر وقت قراره کد بزنی، بهترین نسخه‌ات باشی.

نکته پایانی: از ابزارهای مدیریت زمان مثل «Pomodoro» و «Time Tracking» استفاده کن. حتی «Android Studio» خودش «Productivity Guide» داره که کمکت می‌کنه ببینی چقدر واقعی کار می‌کنی.

🌱 این عادت‌ها رو توی ۳۰ روز تمرین کن، نتیجه رو خودت می‌بینی.

#Codeit #Android #Kotlin #Jetpack #RemoteWork #DeveloperMindset #Productivity #WorkLifeBalance
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
🐛 اولین قدم برای تبدیل شدن به یک توسعه‌دهنده حرفه‌ای «Android»، یادگیری اصول دیباگ کردن کدهاست. بدون دیباگ، اشکال‌یابی مثل گشتن در تاریکی می‌مونه.

🔍 «Debugging» یعنی اجرای مرحله‌به‌مرحله برنامه و بررسی متغیرها در لحظه. «Android Studio» با ابزارهای قدرتمندش این کار رو برای مبتدی‌ها هم ساده کرده.

⚙️ فرض کن یه تابع ساده داری که قراره مجموع دو عدد رو برگردونه، ولی اشتباهاً ضرب رو نوشته‌ای:

fun calculateSum(a: Int, b: Int): Int {
return a * b // اشتباه: باید a + b باشد
}


🛠 برای پیدا کردن این باگ، کافیه یه «Breakpoint» روی خط return بذاری و برنامه رو با حالت «Debug» اجرا کنی. بعد با دکمه «Step Over» (F8) خط به خط جلو بری و مقدار متغیرها رو توی پنجره «Variables» ببینی.

🧠 وقتی ببینی که a * b خروجی می‌ده، بلافاصله متوجه اشتباه می‌شی. تغییرش میدی به a + b و دیگه خیالت راحته.

هرچقدر بیشتر دیباگ کنی، ذهنت سریع‌تر ریشه خطاها رو پیدا می‌کنه. از همون پروژه اول عادت کن با «Debugger» کار کنی.

#Codeit #Android #Kotlin #Jetpack #Debugging #AndroidStudio #Breakpoint #DeveloperTips
🌐 Codeit → https://code-it.ir

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