اگر اصول برنامه نویسی شیء گرا رو بلد باشید طوری روال ها رو تقسیم می کنید که هر قسمت در بخش مناسب قرار بگیره.
فرضا متدی که حجم رو از بایت به یک واحد دیگه تبدیل می کنه چرا در VssBackup ئه؟ تبدیل حجم از بایت به رشته چه ارتباطی با وظایف VSS داره؟
سلامی مجدد
خیلی ممنون استاد .
قبلا بعضی از اعضا و متدها را کاملا موقتی نوشتم . صرفا همه شون را توی کلاس VssBackup گذاشته بودم تا بعدا درست کنم . پروژه هنوز تکمیل نشد . مثلا متد GetFixedNtfsDrives که الان به عنوان extension method برای DriveInfo در کلاس ExtensionMethodForDriveInfo منتقل کردم ، قبلا توی کلاس VssBackup بصورت موقت نوشته بودم .
کلاس VssBackup هم و خیلی های دیگه هنوز اعضاش نوشته نشدن (اون اعضایی که نام بردم) . چون الان بیشتر روی ظاهر (و چیدمان کنترل ها) دارم کار میکنم . صرفا فقط اعضایی از منطق تجاری که برای ساخت ظاهر کاربری لازم هست را دارم میسازم .
اصلا بخاطر اینکه الان دارم اعضاشون را مرتب میکنم (تا هر کدوم در جایگاه شون باشن) ، دارم همین سئوال را میپرسم دیگه .
سئوالم هم همینه :
فرضا همین متد تبدیل حجم به واحد داده (گیگا یا ترا یا مگابایت) ، یا اون متد فرمت شده ای که لیستدرایوهای ثابت شده را برمیگردونه ، هر کدوم معمولا یه تک متد یا تک عضوی هستن که کارشون ربطی به هیچ کلاسی که مینویسم نداره .
اگه واسه ی هر کدوم بخوام کلاس درست کنم ، اولا کلاس های تک عضوی (یا نهایتا دو تا سه عضوی) میشن که اولا هدف خاصی را دنبال نمیکنن و دوما تعداد این کلاس ها خیلی زیاد میشه (تا اینجای کار من حداقل 3 تا از این متدها دارم که کار 2 دسته شون مجزاست . بعدا که قطعا زیادتر میشه) .
این مشکلی هست که حتی توی کلاس های متفاوت بذارم (صرف نظر از اینکه تعداد این کلاس ها خیلی بالا میره) ، اصلا هر کدوم از اون کلاس ها ، هدف خاصی را دنبال نخواهند کرد . صرفا فقط یکی دو تا متد یا عضوی دارن که فراخونی میشن .
اگه هم که توی یه کلاس بذارم ، باز هم هدف خاصی را دنبال نمیکنن و به قول شما انبار هم میشه .
واسه ی من حالا این سئوال پیش اومد که شما هم احتمالا با همین مشکلات در پروژه ها تون برخورد کردین که (در View یا هر جای دیگه) ، صرفا به یک متد (یا چند متدی) نیاز داشته باشید که در کلاس هایی که در Model تون طراحی کردین ، مناسب اونجا نباشه .
اون یک متد را چی کار میکنین؟
در کلاسِ Model تون (فرضا مثل همین VssBackup) که بهش ربطی نداره که توش جا بدین .
بخواین هم جداش کنین ، توی هر کلاسی بذارین ، اون کلاس ، هدف خاصی را دنبال نخواهد کرد . صرفا کلاسی میشه که فقط اون عضو توش قرار گرفته تا فراخونی بشه (که در این صورت فرقی نداره که توی اون کلاس باشه یا در کلاسی مثل VssBackup و ...) چون در هر کجا که قرار بگیره ، اون کلاس ، بخاطر اون عضو ، هدفی را دنبال نمیکنه .
بخواین هم همه ی این اعضا را توی یه کلاس بذارین ، علاوه بر مشکل بالا (یعنی اون کلاس ، هدفی را دنبال نمیکنه) ، مشکلِ ازدهامِ این اعضایی که ربطی به هم ندارن ، هم اضافه میشه (همون انباری که گفتین) .
پس راهکار چیه؟
یعنی راهکاری که شما برای این کار در پروژه هاتون استفاده میکنین ، چیه؟
یا چرا لیست درایو های NTFS رو کلاس ExtensionMethodViewModel میده؟
متد FillComboBoxByDriveInfos که در کلاس InteropWithUI هست و این کلاس هم جزء View هست .
از این به بعد به نام کلاس های زیر دقت کنید چون شبیه به هم هستن :
متد GetFixedNtfsDrives در کلاس ExtensionMethodForDriveInfo قرار داره که لیست درایوهای ثابت در کاربر نهایی را بصورت آرایه ای از DriveInfo ها میده .
این کلاس چون Extension Method ای برای کلاس DriveInfo هست ، کلاسِ استاتیک هست .
کلاس ExtensionMethodViewModel (که ViewModel ای برای کلاسِ ExtensionMethodForDriveInfo هست) هم دقیقا متدی با همین نام داره (متد GetFixedNtfsDrives داره) اما منطق تجاری توش نوشته نشد .
این متد (یعنی متد ExtensionMethodViewModel.GetFixedNtfsDrives) ، صرفا متدِ مورد نظر در Model ام ، یعنی متدِ ExtensionMethodForDriveInfo.GetFixedNtfsDrives را فراخونی میکنه و مقدارش را برمیگردونه .
قوانین MVVM رعایت شده دیگه .
مگه مشکلی وجود داره؟
وقتی هر چیزی رو در جای نامناسبی قرار بدهید طبعا برای ایجاد روال ارتباط های نامناسبی ایجاد می کنید که وابستگی بین بخش هایی بوجود میاره که اساسا بهم ربطی ندارند.
بله .
اما رعایتِ MVVM باعث شده که برای اینکه کوچیکترین وابستگی بین View و Model ام بوجود نیاد ، اون بخش از کدهایی که قبلا در View بودن ، باید جدا بشن و برن توی Model.
این جدا سازی ، و این متدی که قراره از View به Model بره ، الزاما و معمولا به کار Model ، مربوط نمیشه (چون قبلا و کلا جزئی از View بوده و به کارِ View مربوط میشه) که این نوع جداسازی ، همین مشکل را برام بوجود میاره که نمیدونم چی کار کنم با این قضیه و اون تیکه کد را کجا دقیقا ببرم؟
هر جا در Model ببرم ، وصله ی ناجور برای اون کلاس هست .
مثل همون تیکه کدی در متد FillComboBoxByDriveInfos که خروجیِ لیست فرمت شده از درایوهای ثابت را میداد .
فرضا اگر قرار بوده ExtensionMethodViewModel لیست درایو ها رو به View منتقل کنه و واسطه است، باید خروجی اش چیزی باشه که مناسب View ئه. نه DriveInfo مناسب استفاده در View بوده
DriveInfo که مشکلی نداره .
جزء Model ام نیست .
جزء دات نت فریم وورک هست که مشکلی نیست .
فقط اطلاعاتِ نام درایو را نبردم و اطلاعاتِ DriveInfo را منتقل کردم چون بعدا ممکنه لازم باشه که در View ، به بعضی از اعضاش هم نیاز داشته باشم . گفتم باز دوباره کاری نشه .
اشکالی هم فکر نکنم برای قضیه ی MVVM باشه . داره مگه؟
و نه TotalSize اش برای نمایش مناسب بوده.
مناسب نبوده که اومده اید بعدش با توسل به VssBackup استخراج داده مناسب View می کنید.
این دو تیکه را دقیقا متوجه نشدم .
اگه منظورتون اینه که کلاس VssBackup ، جای مناسبی برای متد ConvertByteToDataUnit نیست ، تقریبا بله و احتمالا بعدا جا به جاش میکنم (هر چند ، این عضو هم حدودا جزء همین مشکلی میشه گفت هست که مطرح کردم) .
اما اگه منظورتون اینه که ساز و کارِ View ام را جوری باید بچینم که به متد ConvertByteToDataUnit اصلا نیازی نداشته باشم ، ربط خاصی نداره . من به خروجی این متد نیاز دارم .
کلا دقیقا متوجه نشدم منظور این تیکه تون را .
تشکر استاد .