<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمد رئیسی</title>
        <link>https://virgool.io/feed/@m_71100395</link>
        <description>برنامه نویس اندروید</description>
        <language>fa</language>
        <pubDate>2026-06-16 11:35:45</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/4478780/avatar/U0S41m.jpg?height=120&amp;width=120</url>
            <title>محمد رئیسی</title>
            <link>https://virgool.io/@m_71100395</link>
        </image>

                    <item>
                <title>درک تفاوت Cold Flow و Hot Flow با مثال معلم خصوصی و کلاس درس</title>
                <link>https://virgool.io/@m_71100395/%D8%AF%D8%B1%DA%A9-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-cold-flow-%D9%88-hot-flow-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-%D9%85%D8%B9%D9%84%D9%85-%D8%AE%D8%B5%D9%88%D8%B5%DB%8C-%D9%88-%DA%A9%D9%84%D8%A7%D8%B3-%D8%AF%D8%B1%D8%B3-ai6juw4ly3os</link>
                <description>در کار با Kotlin Flow، یکی از رایج‌ترین ابهام‌ها، تفاوت بین Cold Flow و Hot Flow است؛ مخصوصاً زمانی که چند بخش مختلف از برنامه می‌خواهند به تغییرات یک مقدار واکنش نشان بدهند.برای درک ساده و ماندگار این تفاوت، می‌توانیم از یک مثال آموزشی استفاده کنیم:👉 معلم خصوصی در مقابل کلاس درسCold Flow؛ مثل معلم خصوصیفرض کنید یک معلم خصوصی دارید.هر بار که یک شاگرد جدید می‌آید، معلم از اول درس را برای همان شاگرد شروع می‌کند؛ حتی اگر همین مطالب را قبلاً برای شاگرد دیگری گفته باشد.در دنیای Kotlin Flow، این دقیقاً رفتار Cold Flow است.ویژگی‌های Cold Flowهر collect باعث شروع یک اجرای جدید می‌شودمنطق بالادستی Flow به ازای هر collector دوباره اجرا می‌شودهیچ داده‌ای بین collectorها به اشتراک گذاشته نمی‌شودside-effectها (مثل لاگ، خواندن دیتابیس، شبکه) تکرار می‌شوندنمونه کد: Cold Flowval coldFlow = flow {
    println(&quot;Flow started&quot;)
    emit(loadFromDatabase())
}
جمع‌آوری در دو جای مختلف:launch {
    coldFlow.collect { println(&quot;Collector A: $it&quot;) }
}

launch {
    coldFlow.collect { println(&quot;Collector B: $it&quot;) }
}
خروجی:Flow started
Flow started
Collector A: data
Collector B: data
📌 کد داخل Flow دو بار اجرا شده؛ درست مثل معلم خصوصی که برای دو شاگرد جداگانه، درس را از اول می‌گوید.Hot Flow؛ مثل کلاس درسحالا یک کلاس درس را تصور کنید.معلم یک بار تدریس می‌کند و همه‌ی دانش‌آموزان هم‌زمان گوش می‌دهند. ورود یا خروج دانش‌آموزها تأثیری روی خود تدریس ندارد.این دقیقاً رفتار یک Hot Flow است.ویژگی‌های Hot Flowتولید داده مستقل از collectorها انجام می‌شودمقدارها بین همه‌ی collectorها مشترک هستندside-effect فقط یک بار اتفاق می‌افتدچند collector می‌توانند با خیال راحت هم‌زمان گوش بدهندنمونه کد: SharedFlow (Hot Flow)val sharedFlow = MutableSharedFlow&lt;Int&gt;()
چند collector:launch {
    sharedFlow.collect { println(&quot;Collector A: $it&quot;) }
}

launch {
    sharedFlow.collect { println(&quot;Collector B: $it&quot;) }
}
ارسال مقدار:sharedFlow.emit(1)
خروجی:Collector A: 1
Collector B: 1
📌 مقدار یک بار تولید شده و به همه رسیده؛ درست مثل تدریس در کلاس.Replay؛ اگر کسی دیر وارد کلاس شود چه می‌شود؟ویژگی replay مشخص می‌کند که چند مقدار آخر برای collectorهای جدید نگه داشته شود.SharedFlow بدون replay (replay = 0)مثل کلاس زنده بدون ضبط:اگر دانش‌آموز دیر برسد، مطالب قبلی را از دست می‌دهدMutableSharedFlow&lt;Int&gt;(replay = 0)
SharedFlow با replay = 1مثل کلاسی که آخرین اسلاید هنوز روی تخته است:MutableSharedFlow&lt;Int&gt;(replay = 1)
هر collector جدید بلافاصله آخرین مقدار را دریافت می‌کندSharedFlow با replay = 2 (نگه‌داشتن تاریخچه رویداد)val flow = MutableSharedFlow&lt;Int&gt;(replay = 2)
این یعنی:SharedFlow دو مقدار آخر ارسال‌شده را نگه می‌دارد و به هر collector جدید پخش می‌کند.مثال زمانیflow.emit(1)
flow.emit(2)
flow.emit(3)
بافر replay:[2, 3]
یک collector جدید:flow.collect { println(it) }
بلافاصله دریافت می‌کند:2
3
حالا اگر مقدار جدیدی ارسال شود:flow.emit(4)
همه‌ی collectorهای فعال دریافت می‌کنند:4
و بافر می‌شود:[3, 4]
📌 این دقیقاً مثل کلاسی است که دو اسلاید آخر همیشه روی تخته باقی می‌ماند.StateFlow؛ تخته‌ی کلاسStateFlow نوع خاصی از Hot Flow است که می‌توان آن را به تخته‌ی کلاس تشبیه کرد:همیشه دقیقاً یک مقدار فعلی داردهر کسی وارد شود، فوراً آن مقدار را می‌بیندval stateFlow = MutableStateFlow(0)
به همین دلیل، StateFlow بهترین انتخاب برای نمایش وضعیت (State) در UI است.چه زمانی از کدام استفاده کنیم؟Cold Flowهر مصرف‌کننده اجرای مستقل می‌خواهدعملیات یک‌باره (شبکه، محاسبه)نیازی به اشتراک داده نیستSharedFlowیک رویداد یا مقدار به چند بخش برنامه ارسال می‌شودجلوگیری از اجرای تکرارینیاز به replay رویدادها وجود داردStateFlowنمایش وضعیت فعلیUI باید فوراً آخرین مقدار را داشته باشدجمع‌بندی نهاییبه زبان ساده:Cold Flow می‌گوید:«برای هر نفر، از اول توضیح می‌دم.»Hot Flow می‌گوید:«دارم توضیح می‌دم، هر کی هست گوش بده.»و با replay:«اگر دیر اومدی، چند تا از مطالب قبلی اینجاست.»درک این تفاوت‌ها کمک می‌کند معماری تمیزتر، بهینه‌تر و قابل پیش‌بینی‌تری در برنامه‌های Kotlin و Android طراحی کنیم.من محمد رئیسی برنامه نویس اندروید هستم و از توجهتون به ین پست سپاسگزارم.ان شاءالله که مفید بوده باشه.</description>
                <category>محمد رئیسی</category>
                <author>محمد رئیسی</author>
                <pubDate>Mon, 15 Dec 2025 11:06:51 +0330</pubDate>
            </item>
            </channel>
</rss>