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

Kotlin • Android

🚀 آموزش ساده، کاربردی و پروژه‌محور
💡 مخصوص توسعه‌دهندگان موبایل
Download Telegram
سلام برنامه‌نویس حرفه‌ای! 🚀

تا حالا خواستی یه حلقه‌ای بنویسی که از ۱ تا ۱۰ رو پیمایش کنه و هر بار یه کاری انجام بده؟ خب، تو «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
🧱 کلاس و آبجکت در «Kotlin» — پایه‌ای اما حیاتی!

خیلی‌ها فکر می‌کنن کلاس‌ها ساده‌ان، ولی «Kotlin» کلی قابلیت مخفی داره که کدت رو خواناتر و کوتاه‌تر می‌کنه. 😎
بیایم با یه مثال واقعی شروع کنیم: فرض کن می‌خوای یه «User» با اسم و سن بسازی و بعداً سنش رو به‌روز کنی.

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

class User(val name: String, var age: Int) {
init {
println("User $name created!")
}

fun birthday() {
age++
println("Happy birthday $name! Now you are $age.")
}
}


🧠 توضیح کد:
- name فقط خواندنی (val) و age قابل تغییر (var) هست.
- init موقع ساخته شدن آبجکت اجرا می‌شه.
- متد birthday سن رو یکی زیاد می‌کنه و پیام تبریک می‌ده.

حالا چطور ازش استفاده کنیم؟
fun main() {
val user = User("Ali", 25)
user.birthday() // خروجی: Happy birthday Ali! Now you are 26.
}


📌 نکته عملی:
اگر نیاز داری داده‌ها رو فقط نگه داری و مقایسه کنی، از «Data Class» استفاده کن — خودش toString و equals رو می‌سازه.
ولی برای کلاس‌های با رفتار (مثل اینجا) همون class معمولی کافیه.

💡 برداشت نهایی:
کلاس‌ها ستون فقرات برنامه‌نویسی شی‌گرا هستن. تسلط روی تعریف خصوصیات و متدها توی «Kotlin» کدت رو حرفه‌ای می‌کنه.

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

━━━━━━━━━━━━━━━
@CodeitMobile
🔥2👍1
🎯 چرا «Primary Constructor» توی «Kotlin» انقدر محبوب شده؟ 🤔
فرقش با «Java» اینه که دیگه نیاز نیست field جدا و constructor جدا بنویسی! 🚀

📍 «Primary Constructor» همون سازنده‌ای هست که مستقیم توی هدر کلاس تعریف میشه و کلی کد اضافی رو حذف می‌کنه.

مثال ساده: یه کلاس «User» با دو پارامتر name و age:

class User(val name: String, var age: Int) {
fun greet() = "Hello, $name"
}


📌 اینجا «name» به صورت «val» (immutable) و «age» به صورت «var» (mutable) تعریف شدن.
بدون «Primary Constructor» باید چند خط کد اضافه می‌نوشتی.

اما گاهی نیاز به اعتبارسنجی یا مقداردهی اولیه داری:

class Person(val fullName: String) {
init {
require(fullName.isNotBlank()) { "Name cannot be blank" }
}
}


🔥 بلاک «init» بعد از constructor اجرا میشه و می‌تونی منطق اولیه رو توش قرار بدی.

🎯 اگه پارامترهای بیشتری نیاز داری یا مقدار پیش‌فرض می‌خوای:

class Product(
val name: String,
val price: Double = 0.0,
val quantity: Int = 1
)


خلاصه: «Primary Constructor» کدت رو جمع‌وجور، خواناتر و حرفه‌ای می‌کنه.
مخصوصاً توی پروژه‌های بزرگ با کلی کلاس، یه نعمته! 🌟

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

━━━━━━━━━━━━━━━
@CodeitMobile
1👍1🔥1
🔥 خستگی ذهنی از برنامه‌نویسی رو جدی بگیر؛ افرسودگی شغلی قرار نیست نشون‌دهنده ضعف تو باشه، بلکه علامت نیاز به تغییر مسیره.

🧠 ذهن ما مثل یه پردازنده‌ست: اگه ۲۴ ساعته بدون استراحت بالا باشه، داغ می‌کنه و کرش می‌کنه. برنامه‌نویس‌ها بیشتر از بقیه در معرض «Burnout» هستن چون مدام با باگ، ددلاین و کدهای پیچیده دست‌وپنجه نرم می‌کنن.

برای جلوگیری از افرسودگی، سه تا اصل ساده رو رعایت کن:

۱. مرز بین کار و زندگی رو مشخص کن📏
بعد از ساعت کاری، لپ‌تاپ رو ببند و نه به «GitHub»، نه به «Slack» و نه به ایمیل‌های شرکت نگاه نکن.

۲. یادگیری رو به تفریح تبدیل کن⚡️
به‌جای خوندن کتاب سنگین «Clean Architecture»، یه پروژه کوچیک شخصی با «Kotlin» و «Jetpack Compose» بزن و لذت ببر.

۳. فعالیت بدنی و خواب رو فدا نکن😴
نیم‌ساعت پیاده‌روی یا ۸ ساعت خواب منظم، عملکرد ذهنی تو رو توی کدنویسی چند برابر می‌کنه.

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

👣 توی مسیر برنامه‌نویسی، «Consistency» مهم‌تر از «Intensity» هست. هر روز ۲ ساعت مفید، بهتر از ۱۰ ساعت خسته‌کننده‌ست.

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

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
🔹 گاهی یک کلاس به بیش از یک راه برای ساختن آبجکت نیاز داره!
🔹 در «Kotlin» علاوه بر «Primary Constructor» می‌توانیم «Secondary Constructor» تعریف کنیم.
🔹 این کار مخصوصاً وقتی مفید است که پارامترهای پیش‌فرض کافی نیستند یا منطق خاصی در ساخت نیاز دارید.

🔸 مثال: کلاس «User» با یک سازنده اصلی که نام و ایمیل می‌گیرد.
🔸 یک سازنده ثانویه فقط با نام، که ایمیل را «default» قرار می‌دهد:

class User(val name: String, val email: String) {
constructor(name: String) : this(name, "unknown@example.com") {
// منطق اضافی در صورت نیاز
println("User created with default email")
}
}


🔹 توجه: «Secondary Constructor» باید با : this(...) به سازنده اصلی (یا یک سازنده ثانویه دیگر) delegate کند.
🔹 این قابلیت برای backward compatibility یا مواقعی که کتابخانه نیاز به چند سازنده دارد مفید است.

🔸 ولی این روزها معمولاً از «Default Parameter Values» یا «Factory Method» استفاده می‌کنیم.
🔸 «Secondary Constructor» را فقط در موارد ضروری به کار ببرید تا کد تمیز بماند.

🔹 نکته مهم: اگر کلاس دارای «Primary Constructor» نباشد (مثلاً کلاس‌های داده‌ای)، باز هم می‌توانید سازنده ثانویه تعریف کنید.

📌 جمع‌بندی: با «Secondary Constructor» انعطاف بیشتری در ساخت آبجکت دارید، اما اولویت با «Default Arguments» است.

#Codeit #Android #Kotlin #Jetpack #KotlinConstructors #SecondaryConstructors #OOP
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
🚀 تو کاتلین، پراپرتی‌ها فقط متغیر نیستن – پشت پرده کلی قدرت دارن!
یکی از مهم‌ترین ابزارهاشون «backing field» هست که درکش برای کد تمیز و حرفه‌ای ضروریه.

🔹 مشکل کجاست؟
وقتی یه پراپرتی داریم و می‌خوایم توی «setter» یا «getter» یه کار اضافه انجام بدیم، مستقیم به اسم پراپرتی دسترسی داریم. اما اگه توی «setter» دوباره از اسم پراپرتی استفاده کنیم، باعث فراخوانی بی‌نهایت (recursion) می‌شه!

🔸 راه‌حل: «backing field»
کاتلین یه کلمه جادویی به اسم field داره که به حافظه واقعی پراپرتی اشاره می‌کنه و از حلقه بی‌نهایت جلوگیری می‌کنه.

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

کد زیر یه کلاس «Person» داره که سن رو فقط بین ۰ تا ۱۲۰ قبول می‌کنه:

class Person {
var age: Int = 0
set(value) {
if (value in 0..120) {
field = value
} else {
println("Invalid age: $value")
}
}
}


🧠 توضیح کد:
توی «setter» از field برای ذخیره مقدار جدید استفاده شده. اگه مستقیماً age = value می‌نوشتیم، دوباره «setter» صدا زده می‌شد و برنامه کرش می‌کرد.

نکته مهم:
اگه هم «getter» و هم «setter» رو بازنویسی نکنی، کاتلین خودش «backing field» رو مدیریت می‌کنه. ولی وقتی یکی از اون‌ها رو تغییر میدی، برای دسترسی به مقدار اصلی باید از field استفاده کنی.

📌 خلاصه:
«backing field» بهت کنترل کامل روی ذخیره‌سازی مقدار پراپرتی رو میده بدون ایجاد وابستگی بی‌نهایت. این یه ابزار قدرتمند برای اعتبارسنجی، لاگ‌گیری و محاسبات در لحظه‌ست.

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

━━━━━━━━━━━━━━━
@CodeitMobile
2
🔒 فهم درست «Visibility Modifiers» توی کاتلین، تفاوت بین کد تمیز و کد آشغال رو مشخص می‌کنه
خیلی از توسعه‌دهنده‌ها می‌دونن که «private» یعنی فقط داخل کلاس دیده بشه، ولی خیلی‌ها «internal» رو اشتباه می‌گیرن.

📌 «public» — پیش‌فرض، همه‌جا دیده میشه (همون default جاوا).
📌 «private» — فقط داخل همون فایل یا کلاس.
📌 «internal» — فقط داخل همون ماژول (مثل ماژول اندروید).
📌 «protected» — فقط داخل کلاس و زیرکلاس‌ها (در کاتلین protected مثل private نیست).

🔧 کاربرد واقعی توی یک «ViewModel» اندروید:
باید منطق داخلی رو از بیرون پنهان کنی تا فقط از طریق «StateFlow» حالت رو نشون بدی.

مثال کد ساده:

class ProfileViewModel : ViewModel() {

// فقط خود ViewModel می‌تونه مقدار رو تغییر بده
private val _userName = MutableStateFlow("")
val userName: StateFlow<String> = _userName.asStateFlow()

internal fun updateUserName(newName: String) {
// فقط کلاس‌های هم‌ماژول (مثل Fragment) می‌تونن صدا بزنن
_userName.value = newName
}
}


🧠 توضیح:
- «MutableStateFlow» رو «private» کردیم تا کسی خارج از کلاس نتونه مستقیم بهش دسترسی داشته باشه.
- «StateFlow» رو «public» گذاشتیم تا UI فقط بخوندش.
- «updateUserName» رو «internal» کردیم تا فقط داخل ماژول صدا زده بشه، نه از کتابخونه‌های بیرون.

💡 نتیجه عملی: با استفاده درست از «visibility modifiers» امنیت داده رو بالا می‌بری، API تمیزتر می‌نویسی و از باگ‌های زمان کامپایل جلوگیری می‌کنی.

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

━━━━━━━━━━━━━━━
@CodeitMobile
2
🧠 «Deep Work» یعنی عمیق‌ترین تمرکز روی یه کارِ سخت و ارزشمند، بدون هیچ وقفه‌ای.

📉 چندبار شده تو یه ساعت، ۱۰ بار گوشی رو چک کردی، نوتیف رو دیدی یا تب عوض کردی؟

😵 این همون «شallow Work» هست که باعث میشه حس کنی کل روز کار کردی ولی هیچ چیز مهمی تموم نشده.

«Deep Work» برای برنامه‌نویس‌ها یه مهارت طلاییه: توی همون ۳ ساعت کار عمیق، بیشتر از ۸ ساعت کار سطحی جلو می‌ری.

🔑 چطور شروع کنیم؟

1️⃣ زمان مشخص برای کدنویسی عمیق تعیین کن (مثلاً ۹ تا ۱۲ صبح، بدون تلفن و پیام).

2️⃣ محیط رو کاملاً سایلنت کن: نوتیف‌های گوشی و لپ‌تاپ رو خاموش کن.

3️⃣ تسک‌های سخت رو اولویت بذار؛ چون صبح‌ها مغز تازه‌تره.

4️⃣ تایمر بذار: تکنیک «Pomodoro» برای جلسات ۶۰-۹۰ دقیقه‌ای عالیه.

📈 نتیجه: کد تمیزتر، باگ کمتر و رضایت شغلی بیشتر.

🔥 به‌جای انجام چند کار همزمان (Multitasking)، یاد بگیر فقط روی یه چیز عمیق تمرکز کنی.

💡 تجربه ثابت کرده برنامه‌نویسایی که «Deep Work» رو تمرین می‌کنن، حقوق و فرصت‌های بهتری دارن.

🎯 از فردا امتحان کن: فقط ۲ ساعت کدنویسی عمیق و ببین چقدر خروجی می‌گیری.

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

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