yespas20

کاربرد معماری MVC در نوشتن نرم‌افزار دسکتاپ

yespas20 ۱۳۹۸/۰۱/۱۷ مباحث عمومی برنامه‌نویسی

سلام و وقت بخیر

سوالی که دارم


فرض بگیریم که یه نرم‌افزار دستکتاپ(البته بهتره بگیم اپ دسکتاپ) قراره بنویسیم
حالا از زبان مثلا پایتون هم استفاده میکنیم
اپ ما یه سری منو داره و در زیرش یه سری لیبل و دکمه و ... که خیلی ساده مثلا دو عدد از کاربر بگیره عملیات مثلا جمعو انجام بده و بعد نمایش بده و بعد کاربر خواست میتونه pdf رو هم خروجی بگیره
کلا یه مثال ساده زدم


حالا سوال اینجاست:
اگر بخایم با معماری MVC این کار رو کنیم چطور انجامش میدیم
مثلا میگیم که ویو رو یک نفر انجام بده؟
بعد کنترلر رو یک نفر انجام بده؟
و خود مدل اپ رو هم یک نفر انجام بده؟
که بتوینم تقسیم کار کنیم و کنترلمون روی هر جز بیشتر باشه
حالا چیزی که هست ما داخل مقوله کلاس‌ها میگیم که باید وابستگی کلاس‌ها از هم کم باشه
ولی وقتی ما ورودی رو از ویو گرفتیم باید بگیم که فلان ورودی در ویو که با فلان متغییر تعریف شده رو با فلان متغییر رو وارد کلاس کن و کنترل کن
خب این اون وابستگی نیست؟
بعد چطور میشه همزمان هر سه قسمت رو با هم پیش برد؟ در صورتی که هنوز نمیدونیم اون متغییر که در ویو همزمان داره نوشته میشه چی هست
شرمنده که سوالم از نظر تخصصی کمی مشکل داره
ولی ممنون میشم اول کمی در این مورد توضیح بدید و بعدش بگید که چطور اصولیتر میشه این کار رو انجام داد
نظر خود من بیشتر اینه که از همون معماری به همین شکل در توسعه اپ استفاده کنم

پاسخ‌ها به این تاپیک
سهراب عسکرزاده
سهراب عسکرزاده برنامه نویس وب و ویندوز
۱۳۹۸/۰۱/۱۷

سلام،
قبل از اینکه از این معماری استفاده کنید توجه کنین که MVC یک الگوی طراحی برای بخش UI هست، نه بیشتر. پس بخش منطق و دسترسی به داده کاملا جدا هست و MVC فقط داره وظایف بخش های مختلف UI رو برای ما تفکیک میکنه.
سوالتون در مورد وابستگی رو اینطور پاسخ میدم که نرم افزار از بخش هایی تشکیل شده که با هم همکاری دارن. این که میگن کلاس ها وابستگی کمی داشته باشن به این معناست که تا جایی که نیاز نیست به هم چسبیده نباشند که چی بشه؟ که وقتی میخایم تو یکی تغییری ایجاد کنیم صد جا دیگه رو هم نیاز نباشه دست بزنیم یا موقع تست کردن مارو از تست کردن ایزوله محروم نکنه این وابستگی.
ولی وقتی در UI شما میخواهید مقداری رو از کاربر بگیرید و بک اند بفرستید، بلاخره میخواید از کاربر بگیرین و به بک اند بفرستین😃 و به یه مکانیزمی احتیاج دارید که این متغیریی که تو صفحه کاربره فرستاده بشه به بخش منطق شما. اینطوری نگاهش کنید اینکه ما بخش نمایش و دریافت اطلاعات به کاربر رو به ویو واگذار کردیم و اعتبار سنجی و فرستادن و گرفتن داده از لایه منطق رو به کنترلر، این تقسیم وظایف و به نوعی کاهش وابستگی هست. وگرنه هر رد و بدل کردنی وابستگی نیست.
اگر یکوچولو بیشتر بخوایم پیش بریم اتفاقا این که در یک کنترلر تعریف میشه که من یه این سه چهارتا متغیر با این نام ها و این جنس ها نیاز دارم این خودش تزریق وابستگیه و اون کنترلر اومده و قابل تست شده. چیزی که تو فرضا تو نمونه های قبلیه asp.net مثل webforms موجود نبود و همه ی متد های فرم به اجزای ui مستقیم دسترسی داشتن و شما با نگاه به متد متوجه نمیشدین این به چه داده ها و کنترل هایی از UI احتیاج داره، چه برسه که بخواید تستش هم بکنید. عذر میخام که مثال ها یکم دات نتی بودن.
ضمنا باید ببینید که تکنولوژِی ای که دارید باهاش کار میکنین با کدوم معماری بیشتر سازگاره و مهمتر از اون نیاز شما آیا هست اون الگوی طراحی یا خیر.
سوالتون رو در زمینه ی این که یک نفر انجام بده ویو و یک نفر دیگه مدل رو متوجه نشدم. منظورتون اینه به صورت تیمی جدا کار کنید و هم زمان روی این سه بخش؟ اگر سوال این هست چنین چیزی طبعا غیر ممکن نیست اما بنظر بخشی مثل مدل خیلی وابسته هست به ویو که بخوان دو نفر موازی و بدون ارتباط تنگاتنگ تکمیلش کنن، تا بحال چنین تجربه‌ای نداشتم شاید بقیه دوستان بتونن تو این زمین کمکتون کنن.

موفق باشید.

yespas20
yespas20
۱۳۹۸/۰۱/۲۰

تشکر دوست عزیز

در پاسخ به

امیرحسین مشفقی
امیرحسین مشفقی یک عدد برنامه نویس
۱۳۹۸/۰۱/۱۷

البته mvc فقط یک design pattern برای طراحی ui نیست.اگر شما در مورد طراحی یک کامپوننت GUI صحبت می کنید و می خواهید model, view و controller این کامپوننت از هم جدا باشن در حقیقت از الگوی طراحی MVC استفاده می کنید. اما زمانی که برای معماری یک سیستم تصمیم گیری می کنید و یا طراحی معماری می کنید (برای مثال استفاده از Spring MVC در یک پروژه) در حقیقت از الگوی معماری MVC برای جدا سازی اجزای معماری صحبت می کنید.

در پاسخ به

سهراب عسکرزاده
سهراب عسکرزاده برنامه نویس وب و ویندوز
۱۳۹۸/۰۱/۱۸

اینکه MVC یک الگوی طراحی هست یا الگوی معماری در موردش اختلاف نظر هست(که البته بیشتر به این بستگی داره که در چه موقعیتی داریم از MVC حرف میزنیم)، اما چیزی که سرش اتفاق نظر هست اینه که مربوط به UI و اگر NTier نگاه کنیم مربوط به لایه Presentation ما هست این الگو. ضمنا من عرض کردم یک الگوی طراحی برای(یعنی در ارتباط با) 'بخش UI' هست ، نه یک الگوی طراحی (Design Pattern) برای 'طراحی UI'. من با Spring MVC کار نکردم اما اگر بخشی در اون هست که شما کاری مربوط به لایه ای جز رابط کاربری رو با MVC انجام میدید خوشحال میشم بگین که در موردش بخونم. به این هم یه نگاه بندازین.

در پاسخ به

امیرحسین مشفقی
امیرحسین مشفقی یک عدد برنامه نویس
۱۳۹۸/۰۱/۱۷

برای اینکه شما بتونید به راحت ترین روش ممکن یک اپلیکیشن که دارای gui(رابط کاربری گرافیکی) هست رو بسازید و همچنین از mvc استفاده کنید باید از یک فریموورک یا کتابخانه هایی مثل pyqt یا tkinter استفاده کنید.بهتره برای شروع با استفاده از qt4 اول ui خودتون رو طراحی کنید و بعد از pyuic4 برای ساخت view استفاده کنید و برای control یک کلاس اصلی بسازید که از ui تون ارثبری میکنه.لینک زیر مثال خوبی برای سوال شما اورده:

https://stackoverflow.com/questions/1660474/pyqt-and-mvc-pattern

yespas20
yespas20
۱۳۹۸/۰۱/۱۷

ممنون از پاسخ شما

پس نظر شما این مشه که:

View رو بسازیم بعد controller رو بسازیم که از View ارث‌بری کرده و در Model عملیات نرم‌افزار انجام بشه؟ بعد این مدلی تا قبل از Viwe چطور میشه Model رو ساخت؟ چون ورودی از Viwe میاد دیگه؟ چطور باید همزمان هر سه قسمت رو پیش برد؟

در پاسخ به

امیرحسین مشفقی
امیرحسین مشفقی یک عدد برنامه نویس
۱۳۹۸/۰۱/۱۷

نه نه از view ارثبری نمیکنه،از یک ویجتی از ui شما ارثبری میکنه مثلا در کد زیر ویجت ما QMainWindow است:

import sys
from PyQt4 import QtCore, QtGui
from edytor import Ui_notepad

class StartQT4(QtGui.QMainWindow):
 def __init__(self, parent=None):
 QtGui.QWidget.__init__(self, parent)
 self.ui = Ui_notepad()
 self.ui.setupUi(self)


if __name__ == "__main__":
 app = QtGui.QApplication(sys.argv)
 myapp = StartQT4()
 myapp.show()
 sys.exit(app.exec_())

در پاسخ به

yespas20
yespas20
۱۳۹۸/۰۱/۲۰

تشکر

از راهنماییتون

در پاسخ به