<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهدی پورکاظمی</title>
        <link>https://virgool.io/feed/@mahdipourkazemi</link>
        <description>یک عاشق یادگیری و ساختن , از برنامه نویسی تا طراحی قطعات مکانیکی و حتی کمی هنری</description>
        <language>fa</language>
        <pubDate>2026-04-14 18:36:58</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/161878/avatar/yJgIMh.jpg?height=120&amp;width=120</url>
            <title>مهدی پورکاظمی</title>
            <link>https://virgool.io/@mahdipourkazemi</link>
        </image>

                    <item>
                <title>مقایسه دو الگوی معماری MVVM و MVI در اندروید</title>
                <link>https://virgool.io/codenevis/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-%D8%AF%D9%88-%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-mvvm-%D9%88-mvi-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-f4mieoekuxaw</link>
                <description>مقدمهدر توسعه اپلیکیشن‌های اندروید، انتخاب معماری مناسب برای مدیریت وضعیت برنامه و تعاملات کاربر از اهمیت ویژه‌ای برخوردار است. این مقاله به بررسی دو معماری پرکاربرد، یعنی MVVM (Model-View-ViewModel) و MVI (Model-View-Intent)، می‌پردازد و پیاده‌سازی آن‌ها را با استفاده از Flow در Jetpack Compose تحلیل می‌کند.معرفی معماری MVVMدر معماری MVVM، ViewModel به‌عنوان واسطه‌ای بین Model و View عمل می‌کند. این مؤلفه وظیفه مدیریت داده‌ها را بر عهده دارد و آن‌ها را از طریق ابزارهایی مانند LiveData یا Flow به رابط کاربری (UI) منتقل می‌کند.پیاده‌سازی ViewModelA (MVVM)class ViewModelA : ViewModel() {
    private val _email = MutableStateFlow(&amp;quot&amp;quot)
    val email = _email.asStateFlow()

    private val _password = MutableStateFlow(&amp;quot&amp;quot)
    val password = _password.asStateFlow()

    fun updateEmail(email: String) {
        _email.update { email }
    }

    fun updatePassword(password: String) {
        _password.update { password }
    }

    val isEmailValid = email
        .map { it.isValidEmail() }
        .stateIn(viewModelScope,
 SharingStarted.WhileSubscribed(5000),
 false)

    val isPasswordValid = password
        .map { it.isValidPassword() }
        .stateIn(viewModelScope,
 SharingStarted.WhileSubscribed(5000),
 false)

    val canRegister = combine(isEmailValid, isPasswordValid) { emailValid, passwordValid -&gt;
        emailValid &amp;&amp; passwordValid
    }.stateIn(viewModelScope, 
SharingStarted.WhileSubscribed(5000),
 false)
}توضیح کلی معماری MVVM در این پیاده‌سازی:مدیریت داده‌ها: ViewModelA داده‌های مربوط به ایمیل و رمز عبور را ذخیره و مدیریت می‌کند.اعتبارسنجی: از Flow برای اعتبارسنجی ورودی‌ها به‌صورت واکنشی استفاده شده است.منطق ثبت‌نام: قابلیت ثبت‌نام با ترکیب نتایج اعتبارسنجی ایمیل و رمز عبور (isEmailValid و isPasswordValid) تعیین می‌شود.توضیح جزئی استفاده از Flow: از MutableStateFlow: برای ذخیره و ارائه مقادیر به UI استفاده می‌شود.از map: برای تبدیل و اعتبارسنجی داده‌های ورودی به کار رفته است.از combine: دو جریان داده (اعتبار ایمیل و رمز عبور) را ترکیب می‌کند.از stateIn: برای نگه‌داری مقدار نهایی در طول چرخه حیات ViewModel استفاده شده است.معرفی معماری MVIمعماری MVI بر پایه یک وضعیت (State) واحد بنا شده است که تمامی اطلاعات مربوط به View را در خود نگه می‌دارد. این معماری از اصل جریان یک‌طرفه داده‌ها پیروی می‌کند و تغییرات را به‌صورت متمرکز مدیریت می‌کند.پیاده‌سازی ViewModelB (MVI)data class RegisterState(
    val email: String = &amp;quot&amp;quot,
    val password: String = &amp;quot&amp;quot,
    val isEmailValid: Boolean = false,
    val isPasswordValid: Boolean = false,
    val canRegister: Boolean = false
)

class ViewModelB : ViewModel() {
    private val _state = MutableStateFlow(RegisterState())
    val state = _state.asStateFlow()

    fun updateEmail(email: String) {
        _state.update { it.copy(email = email) }
    }

    fun updatePassword(password: String) {
        _state.update { it.copy(password = password) }
    }

    init {
        state
            .distinctUntilChangedBy { it.email }
            .map { it.email.isValidEmail() }
            .onEach { isEmailValid -&gt;
                _state.update { it.copy(isEmailValid = isEmailValid) }
            }
            .launchIn(viewModelScope)

        state
            .distinctUntilChangedBy { it.password }
            .map { it.password.isValidPassword() }
            .onEach { isPasswordValid -&gt;
                _state.update { it.copy(isPasswordValid = isPasswordValid) }
            }
            .launchIn(viewModelScope)

        state
            .onEach { currentState -&gt;
                _state.update {
                    it.copy(canRegister = currentState.isEmailValid &amp;&amp; currentState.isPasswordValid)
                }
            }
            .launchIn(viewModelScope)
    }
}توضیح کلی معماری MVI در این پیاده‌سازی:وضعیت واحد: یک کلاس داده به نام RegisterState تمامی اطلاعات صفحه را در خود نگه می‌دارد.به‌روزرسانی وضعیت: تغییرات ورودی‌ها (ایمیل و رمز عبور) به‌صورت متمرکز در State اعمال می‌شود و اعتبارسنجی‌ها بر اساس آن انجام می‌گیرد.مدیریت متمرکز: وضعیت کلی صفحه با توجه به تغییرات ورودی‌ها به‌روز می‌شود.توضیح جزئی استفاده از Flow:ازdistinctUntilChangedBy: برای جلوگیری از پردازش‌های اضافی هنگام عدم تغییر مقدار استفاده شده است و از پردازش غیرضروری در صورت عدم تغییر مقادیر جلوگیری می‌کند.ازmap: برای بررسی اعتبار ایمیل و رمز عبور استفاده شده است.از onEach: برای به‌روزرسانی مقدار state پس از پردازش مقدار ورودی به کار رفته است.از (viewModelScope)launchIn: برای اجرای فرآیندها در viewModelScope استفاده شده است.مقایسه MVVM و MVIمقایسه کلیپیاده‌سازی UI با Jetpack Composeمثال UI برای MVVM@Composable
fun RegisterScreenA(
    viewModel: ViewModelA,
    modifier: Modifier = Modifier
) {
    val email by viewModel.email.collectAsState()
    val password by viewModel.password.collectAsState()
    val canRegister by viewModel.canRegister.collectAsState()
    // پیاده‌سازی رابط کاربری بر اساس این مقادیر
}مثال UI برای MVI@Composable
fun RegisterScreenB(
    registerState: RegisterState,
    modifier: Modifier = Modifier
) {
    // استفاده از registerState به جای viewModel
}نتیجه‌گیریدر این مقاله، دو معماری MVVM و MVI بررسی شدند. معماری MVVM ساده‌تر است و برای پروژه‌های کوچک و متوسط مناسب می‌باشد. از سوی دیگر، معماری MVI برای پروژه‌های بزرگ که مدیریت وضعیت پیچیده‌تری دارند، انتخاب بهتری محسوب می‌شود. استفاده از Flow در هر دو معماری امکان مدیریت داده‌ها به‌صورت واکنشی را فراهم می‌کند.کد به صورت کامل در گیت هاب موجود(لینک زیر) است در صورتی که دوست داشتید امتیاز بدید متشکرمI think using use-case with mvi in this approach is better (model A vs model B) #android #kotlin #mvvm #mvi</description>
                <category>مهدی پورکاظمی</category>
                <author>مهدی پورکاظمی</author>
                <pubDate>Mon, 24 Feb 2025 19:35:45 +0330</pubDate>
            </item>
                    <item>
                <title>کاربرد های decoration  در پایتون</title>
                <link>https://virgool.io/codenevis/%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF-%D9%87%D8%A7%DB%8C-decoration-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-ax9ng761w9qv</link>
                <description>پایتون دکوریشنسلام من مهدی پورکاظمی هستم با من همراه باشید تا با هم کمی کد بخوریمپترن‌های زیادی در دنیای برنامه نویسی برای کد نویسی تمیز و ساده‌سازی و سریعتر کردن روند توسعه و ... وجود دارد که استفاده‌های می شود ؛ با من همراه باشید تا کاربرد‌های دکوریشن در پایتون را بررسی کنیمنکته : کدها قرار داده شده کمی زمان می برد تا بارگذاری گردددکوریشن چیست؟در این جا من فقط کاربردهای ان را بررسی می کنم برای اطلاع بیشتر به این لینک مراجعه کنید https://vrgl.ir/sT2ip مثال های مفید از کاربرد‌های دکوریشناستفاده برای بررسی سرعت اجرای یک فانکشن آسان تر ساختن مسیر بررسی مشکل (دیباگ کردن)توقف اجرای برنامه برای چند ثانیه نمونه ای از طراحی الگوی (plug-in design pattern)مثال اول (timer)برای هر برنامه نویسی نگاه کردن به کد راحت تر از خواندن توضیح متن اون هست با این حال توضیح کد در درون خود کد برای فهم بیشتر قرار داده شده است https://gist.github.com/mahdiPourkazemi/e7737bcd19bb0dcadd7276e58a052fe4 تابع دکوریتور با استفاده از ماژول تایمر و با فراخوانی آن قبل و بعد از فراخوانی تابع ورودی مقدار زمانی که اجرای تابع ورودی صرف می کند به همراه پاسخ آن در خروجی چاپ می گرددمثال دوم (debugger)استفاده از تابعی که در هر مرحله روند اجرای کد و یا ورودی و خروجی کد و ... نمایش دهد نه تنها از ایجاد خطا جلوگیری می کند بلکه باعث فهم بهتر از کد و برنامه نویس بهتری شدن می گردد https://gist.github.com/mahdiPourkazemi/5b210bb7d000ef623c2087fdcd2b83cf تابع دکوریتور با استفاده از حلقه تکرار بر روی مقادیر ورودی، مقادیر ورودی تابع را در یک لیست ذخیره کرده و به همراه اسم تابع در خط 14 قبل از صدا زدن تابع  چاپ می کند پس از صدا زدن تابع و دریافت مقدار بازگشتی(اگر موجود باشد) در خط بعدی به همراه اسم تابع چاپ می شود‌مثال سوم (slow down)استفاده از این تابع در زمانی که انتظار داریم که نتیجه یک درخواست بر روی شبکه بازگردد و یا استفاده از تردها مفید هست لازم به ذکر است که مثال های ذکر شده برای تمرین و فهم بیشتر است https://gist.github.com/mahdiPourkazemi/ba11b268cb47f7bbc7f1e45cf4a8f601 در این مثال تابع ورودی به تابع دکوریشن قبل از صدا زدن به کمک تابع تایم یک ثانیه متوقف می گردد.مثال چهارم(plug-in)پیاده سازی الگوریتم پلاگین با استفاده از دکوریشن ، به عنوان یک مثال ساده برای استفاده بهتر از دکوریشن در ادامه قرار دارد. https://gist.github.com/mahdiPourkazemi/7ef94606dc53bcb142a0ae221392e4f2 در این مثال تابع ورودی به تابع دکوریشن در یک دیکشنری ذخیره می گردد که اسم تابع کلید آن و خود تابع به عنوان مقدار در دیکشنری که به صورت گلوبال تعریف شده ذخیره می شود و برای اجرای توابع ذخیره شده باید آن‌ها را از لیست خارج کرده و صدا زددر کدهای قرار گرفته نکاتی وجود دارد و این نکات به صورت عمدی قرار گرفته تا خواننده ی عزیز علاوه بر کپی کردن و اجرای کدها در محیط پایتون خود، کمی نیز با دست به کیبورد شود و در حد یک خط تغییراتی در کد انجام دهد تا علاوه بر فهم بهتر از نتیجه ان نیز لذت ببرد از انجایی که اینجانب به تازگی شروع به نوشتن در ویرگول کردن برای حمایت دنبال کردن و لایک کردن پست فراموش نشود</description>
                <category>مهدی پورکاظمی</category>
                <author>مهدی پورکاظمی</author>
                <pubDate>Tue, 16 Apr 2024 19:31:10 +0330</pubDate>
            </item>
                    <item>
                <title>ذهن های پر از هیچ</title>
                <link>https://virgool.io/@mahdipourkazemi/%D8%B0%D9%87%D9%86-%D9%87%D8%A7%DB%8C-%D9%BE%D8%B1-%D8%A7%D8%B2-%D9%87%DB%8C%DA%86-o1zg5vat3jun</link>
                <description>اعتیادی همگانیذهن‌های انسان‌های امروزی پرشده است از شادی‌های لحظه‌ای به‌وسیله‌ی چیزی به نام تلفن همراه، تلفنی که ابتدا قرار بود فاصله‌های دور را نزدیک کند و به‌وسیله‌ی آن حرف‌های خوبی به یکدیگر بزنیم و دوستی‌ها را گسترش دهیم و در تنهایی‌ها و مکان‌های خطرناک صدایی باشد بلندتر از صدای فریاد زن و کمک خواستن.اما اکنون تبدیل به وسیله‌ای شما که فاصله‌های نزدیک را دور می‌کند ما را از اطرافیان خانواده جدا کرده و وارد دنیایی پر از حسادت و فخرفروشی و تبلیغات کاذب می‌کند و زمان استراحتی که تاکنون در جمع خانواده طی می‌شد اکنون با تلفن هوشمندی در گوشه از خانه دور از خانواده در شبکه‌های اجتماعی می‌گذرد طی می‌شود انسان امروزی با محتوای جذاب که توسط سلبریتی‌ها در ویدیوهای کوتاه‌شده ساخته می‌شود بافرهنگی متفاوت از فرهنگ پیشینان خود مورد هجوم محتوای ترند شده واقع می‌شود و فرهنگ پیشین آن سرزمین را نابود می‌کندآیا مشکل گذران زمان در شبکه‌های اجتماعی است؟ یا چیز دیگری است؟شاید تعجب کنید اما مشکل وجود تلفن هوشمند و کامپیوتر همراهی است که در کسری از ثانیه با اتصال به اینترنت انبوهی از داده‌ها را پیرامون یک موضوع در اختیار شما قرار می‌دهد شاید در بسیاری از مواقع درصورتی‌که اتصال به اینترنت دردسترس نباشد وسایل الکترونیکی مثل تلفن هوشمند و لپ تاپ کاربرد و جذابیتی ندارداطلاعت انبوهی که نه درحال‌حاضر و نه در آینده کاربردی برای ما ندارد حتی می‌تواند موجب ایجاد افکار خودکشی نیز گردد آهنگ ها و خورده ویدیوهایی که شاید لحظاتی پس از زمین گذاشتن تلفن همراه کوچک‌ترین خاطره‌ای از آن‌ها نداشته باشیم بااین‌حال چون برای لحظاتی ما را از محیط اطراف ناراحت‌کننده‌ی خود با واقعیت‌های تلخ‌وشیرین رها می‌کند و شادی لحظه‌ای که به ذهن ما هجوم می آورد ما انسان‌ها آن را کنار نمی‌گذاریم پس از گذشت زمان اندکی ان احساس شادی تبدیل به افسوس و ناراحتی واقعیت زندگی می‌شود هروئینی که ما ذهن خود را مسموم و معتاد آن کرده‌ایم و از واقعیت فرار می‌کنیم به‌زودی ما را نابود می‌کندشاید اکنون و یا پیش از رسیدن به این خط فکر کرده‌اید که می‌توانید با کنار گذاشتن چند شبکه‌ی اجتماعی از این تله فرار کنید اما دوباره فکر کنید آیا امکان‌پذیر است؟امروزه بسیاری از روزمره بانکی و غیربانکی ارتباطات کاری و حتی احساسی وابسته به همین تلفن‌های هوشمند و شبکه‌های اجتماعی است به‌طوری‌که اولین کاری که شما زمانی که از خواب بیدار می‌شوید انجام می‌دهید چک کردن تلفن هوشمند است و آخرین کاری که می‌کنید هم همین استخب چه چیزی را چک می‌کنید؟ ایمیل‌ها ؟ شبکه‌های اجتماعی؟ کارهای فردا؟شما حتی گاهی نیاز به دستشویی خود را نیز برای چک کردن تلفن هوشمندتان به تاخیر می‌اندازید واقعا چرا؟ غیر از این است که شما به آن معتاد شده‌اید؟بهانه می آورید کاری‌هایی که با تلفن هوشندتان انجام می‌دهید نیازکاریتان است و غیر از این نیست اما آیا واقعا غیر از این نیست؟ یعنی شما هرگز پس از چک کردن قرارهای کاری فردا سری هم به شبکه‌های اجتماعی نزدید و با اسکرول های پشت‌سرهم چشم های خود را خسته و زمان خود را هدر نمی‌دهیداتکا بیش از حد به فناوری نه‌تنها ما را از واقعیت جدا می‌کند بلکه می‌تواند به‌مرور زمان ذهن ما را مسموم و معتاد کند. باید شجاعانه از این چرخه خارج شویم و به‌جای آن زندگی واقعی و انسانی را تجربه کنیم.راه حل چیست؟ یا بهتر بگویم راه حل پیشنهادی من چیست؟خوب اگر تا به این جا همراه من ماندید در ادامه‌ی نیز همراه من باشید (دنبال کنید)</description>
                <category>مهدی پورکاظمی</category>
                <author>مهدی پورکاظمی</author>
                <pubDate>Thu, 02 Nov 2023 19:48:24 +0330</pubDate>
            </item>
            </channel>
</rss>