ج#:كيفية تصميم واجهة المستخدم الرسومية بذكاء لتطبيق سطح المكتب مع وضع التغليف في الاعتبار

StackOverflow https://stackoverflow.com/questions/1036878

سؤال

أقوم بتطوير تطبيق سطح مكتب باستخدام MainForm الذي أصبح كبيرًا إلى حد ما.هناك الكثير من عناصر التحكم في عدة حاويات على مستويات مختلفة (SplitContainers، TabPages، Panels).

أريد الآن إعادة بناء هذه الفئة عن طريق فصل جميع أكواد وحدة التحكم المسؤولة عن ربط البيانات ومسح عناصر التحكم أو تنفيذ تفاعلات المستخدم في فئات وحدة تحكم منفصلة.

[يحرر]

غاية

الغرض من هذا التطبيق هو تتبع الطلبات (تسمى Job) ومواقعها (تسمى Jobitem).ترتبط كل وظيفة بعميل، وكل عنصر عمل بمقالة (تحتوي عناصر العمل على معلومات خاصة بعملية تصنيع مقالتها، وبالتالي فهي غلاف المقالة).تتمتع Job وJobitem وCustomer وArt بخصائص ديناميكية (إقران المفتاح الأساسي/القيمة) والتي تتم إدارتها بواسطة فئة PropertyManager.

بنيان

ينقسم طلبي إلى مشروعين رئيسيين:يحتوي المركز على نموذج البيانات في 3 فئات LinqToSQL DataContext:

  • ArticleManagement
  • JobManagement
  • PropertyManagement

لكل فئة DataContext هناك XyzManager فئة توفر كائن LinqToSQL في مجموعة إلى واجهة المستخدم الرسومية، وتغليف مصدر بيانات LinqToSQL.كما أنه يتعامل مع إنشاء وحذف وتعديل أنواع DataContext المقابلة لها.

ثم لدي مشروع واجهة المستخدم الرسومية، والذي يحتوي بطبيعة الحال على نموذج رئيسي وبعض النماذج الإضافية لأشياء مثل الخيارات وما إلى ذلك.اعتبارًا من الآن، يحتفظ مشروع واجهة المستخدم الرسومية الخاص بي بمرجع لكل فئة XyzManager ويحصل على البيانات ويقوم بتعيينها من خلال فئات المدير كما تملي تفاعلات المستخدم، والتي تحتوي على كل منطق التحكم.

لقد وضعت معظم المنطق المستقل لهذا في فئة فائدة ثابتة خارج فئة النموذج الرئيسية، ولكن أعتقد أن هذا أسلوب أقل من مثالي.

[/يحرر]

هذا هو أول تطبيق أكبر لسطح المكتب وأواجه صعوبة في تغليف واجهة المستخدم الرسومية.اعتبارًا من الآن، كل كود وحدة التحكم المسؤول عن التعامل مع تفاعلات المستخدم موجود داخل فئة MainForm.

أعرف نمط MVC ولكني لست متأكدًا من كيفية تطبيقه على C# WinForm مع تصميمي الحالي.

يبلغ طول الكود المخصص الخاص بي وحده أكثر من 2400 سطرًا من التعليمات البرمجية، دون احتساب الكود الذي تم إنشاؤه تلقائيًا للنموذج، مع اتجاه متزايد.أريد إعادة صياغة هذا، ولكنني لا أعرف كيف يمكنني حل هذه المشكلة بطريقة أكثر أناقة.

هل كانت مفيدة؟

المحلول

بالنسبة للتطبيقات صغيرة الحجم، يجب عليك إلقاء نظرة على Model-View-Presenter (MVP)، حيث يوجد عرض تقديمي جيد لأفضل طريقة (في رأيي) للقيام بـ MVP:http://martinfowler.com/eaaDev/SupervisingPresenter.html

نصائح أخرى

عادةً ما أحاول إنشاء واجهة مستخدم رسومية معقدة باستخدام UserControls أصغر.لكن بعض النقاط مهمة جدًا:

  • يجب أن تكون كل من عناصر تحكم المستخدم هذه مستقلة (خاصة عن النموذج)
  • يجب أن تعتمد عناصر تحكم المستخدم التي تهدف إلى إظهار بيانات معينة أو تغييرها على هذه البيانات فقط.يجب أن تحاول تنفيذ عناصر التحكم الخاصة بك بطريقة يمكن ربطها بمصدر البيانات الذي يخدم كافة البيانات التي يحتاجها عنصر التحكم.
  • عندما تحتاج إلى تسليم المعلومات إلى الحاوية الأصلية (UserControl أو النموذج) استخدم الأحداث التي يمكن للحاوية الاشتراك فيها.
  • عند استخدام قوائم (السياق)، تحقق مما إذا كانت مرتبطة بعناصر معينة.يجب عليك إنشاء القوائم بالقرب من العناصر وليس داخل UserControls.لذلك، عندما تقوم بإظهار نفس العنصر على واجهة المستخدم الرسومية في طرق عرض (عناصر تحكم) مختلفة أكثر من مرة، يجب أن يكون لكل عنصر نفس قائمة السياق.
  • حاول تطبيق نمط الأمر على إجراءات الأزرار/القوائم.

تبدو حلولك وكأنك لا تستطيع الفصل بين المسؤوليات المختلفة حتى الآن.إن مجرد تقسيم الكود إلى ضوابط مختلفة دون حدود ومسؤوليات واضحة لا يكفي.

هل تستخدم JobController لنموذج واحد فقط؟إذا كانت الإجابة بنعم، فربما كل ما تحتاجه هو تقسيم التعليمات البرمجية إلى عدة ملفات باستخدام الكلمة الأساسية الجزئية?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top