بعد أن استعرضنا في الأجزاء السابقة من الدليل أسس الهندسة المعمارية في Flutter — من الفصل بين الطبقات، إلى نمط MVVM، مرورًا بالـ Repositories وUse-Cases — نصل الآن إلى القواعد الذهبية التي توصي بها Google نفسها لتصميم التطبيقات القابلة للتوسع والصيانة.
لكن تذكّر:
هذه ليست قوانين صارمة، بل ممارسات موصى بها — يمكنك تكييفها مع متطلبات تطبيقك وفريقك.
تصنيف التوصيات
قبل أن نغوص في التفاصيل، يجدر أن نعرف أن فريق Flutter يقسم توصياته إلى ثلاث درجات:
| مستوى التوصية | المعنى |
|---|---|
| Strongly Recommend (موصى بها بشدة) | عليك تطبيقها دائمًا في المشاريع الجديدة، ويفضّل إعادة هيكلة المشاريع القديمة لتتوافق معها إن أمكن. |
| Recommend (موصى بها) | ستُحسّن جودة تطبيقك بشكل واضح، وإن لم تكن ضرورية دائمًا. |
| Conditional (اختيارية) | مناسبة فقط في تطبيقات معينة أو سيناريوهات محددة. |
أولاً: مبدأ فصل المسؤوليات (Separation of Concerns)
أهم قاعدة في هندسة التطبيقات: افصل منطق التطبيق عن واجهته.
استخدم طبقتين واضحتين:
- UI Layer: لعرض البيانات والتفاعل مع المستخدم.
- Data Layer: لمعالجة البيانات وتنفيذ المنطق التجاري.
📌 Strongly Recommend — يجب تطبيق هذا المبدأ في كل تطبيق جديد.
اعتمد نمط المستودعات (Repository Pattern)
افصل منطق الوصول إلى البيانات عن بقية أجزاء التطبيق.
أنشئ طبقة Repositories للتعامل مع البيانات، وطبقة Services للوصول إلى الـ APIs وقواعد البيانات.
📌 Strongly Recommend — هذا النمط يجعل الكود أكثر مرونة وقابلية للاختبار.
استخدم MVVM (Model-View-ViewModel) .
افصل المنطق (ViewModel) عن العرض (View).
اجعل الواجهات “ذكية بصريًا فقط” (Dumb Widgets) ولا تحتوي على أي منطق.
📌 Strongly Recommend
استخدم ChangeNotifier وListenable لإدارة الحالة
تسمح هذه الأدوات للـ Widgets بمراقبة التغيّرات في ViewModels بسهولة.
لكن هناك بدائل أخرى مثل Riverpod أو Bloc حسب تفضيلك.
📎 Conditional — مناسبة للتطبيقات الصغيرة والمتوسطة.
لا تضع المنطق داخل الـ Widgets
يجب أن يبقى المنطق داخل الـ ViewModel.
الـ Widget لا يجب أن تفعل سوى:
- إظهار أو إخفاء عناصر بسيطة.
- تحريك أو تنسيق الواجهة.
- توجيه المستخدم بين الصفحات.
📌 Strongly Recommend
استخدم Domain Layer عند الحاجة فقط
إذا أصبح منطق العمل في الـ ViewModels معقدًا أو مكررًا، أضف طبقة Domain تحتوي على Use-Cases.
📎 Conditional — مفيدة في التطبيقات الكبيرة فقط.
ثانيًا: التعامل مع البيانات (Data Handling)
إدارة البيانات بذكاء هي سر تطبيقات مستقرة وقابلة للتنبؤ.
استخدم التدفق أحادي الاتجاه (Unidirectional Data Flow)
البيانات تتدفّق من Data Layer → UI Layer فقط.
أي تفاعل من المستخدم يعود بالعكس، ليتم معالجته في طبقة البيانات.
📌 Strongly Recommend
استخدم Commands للأحداث التفاعلية
بدل استدعاء المنطق مباشرة من الواجهة، مرّر الأحداث عبر Commands داخل الـ ViewModel.
هذا يمنع الأخطاء ويجعل التفاعلات موحدة.
🟢 Recommend
استخدم نماذج بيانات غير قابلة للتغيير (Immutable Models)
عندما يتغير شيء، أنشئ كائنًا جديدًا بدل تعديل القائم.
هكذا تمنع التحديثات غير المقصودة وتضمن تدفقًا واضحًا للبيانات.
📌 Strongly Recommend
استخدم حزم التوليد التلقائي مثل freezed أو built_value
تساعد هذه الحزم في إنشاء:
- عمليات التحويل من/إلى JSON
- المقارنة العميقة (Deep Equality)
- نسخ الكائنات (CopyWith)
🟢 Recommend
افصل بين نماذج الـ API ونماذج التطبيق (Domain Models)
احرص على أن يكون لكل منهما دوره الواضح.
صحيح أن هذا يزيد التعقيد قليلًا، لكنه يسهل الصيانة على المدى الطويل.
🟠 Conditional — استخدمه في التطبيقات الكبيرة.
ثالثًا: هيكل التطبيق (App Structure)
الهيكل الجيد يجعل الكود سهل القراءة والتعاون الجماعي.
استخدم Dependency Injection
تجنّب الكائنات العامة (Globals) — استخدم أدوات مثل provider لحقن التبعيات بوضوح.
📌 Strongly Recommend
استخدم go_router للتنقل بين الشاشات
هو الحل الرسمي الموصى به لمعظم تطبيقات Flutter.
🟢 Recommend
استخدم تسميات قياسية للملفات والفئات
مثلاً:HomeViewModel, UserRepository, ClientApiService
واحذر استخدام أسماء تتعارض مع كائنات Flutter مثل Widget أو Container.
🟢 Recommend
استخدم فئات Repository مجردة (Abstract Repositories)
تتيح لك تبديل مصادر البيانات بسهولة بين بيئات مختلفة (مثل التطوير والإنتاج).
📌 Strongly Recommend
رابعًا: الاختبارات (Testing)
الاختبار ليس ترفًا، بل أحد أعمدة الهندسة الجيدة.
اختبر المكونات المعمارية بشكل منفصل ومتكامل
- اختبر كل Repository وViewModel عبر Unit Tests.
- اختبر الواجهات عبر Widget Tests.
📌 Strongly Recommend
أنشئ Fakes للاختبار
اكتب كودك بحيث يكون قابلاً للاختبار عبر Mocks وFakes — هذا يجبرك على كتابة كود منظم وقابل لإعادة الاستخدام.
📌 Strongly Recommend
الموارد الموصى بها
إليك أهم الأدوات والمراجع المعتمدة رسميًا:
الأكواد والقوالب
- Compass App Source Code — تطبيق كامل مفتوح المصدر يطبق كل هذه المبادئ.
- Very Good CLI — قالب جاهز لتوليد تطبيقات Flutter منظمة باحتراف.
📖 التوثيق
- Very Good Engineering Docs — مقالات ودروس متقدمة في هندسة Flutter.
- State Management with ChangeNotifier — شرح عملي لإدارة الحالة في Flutter.
🧰 الأدوات
- Flutter DevTools — أدوات تحليل الأداء وتصحيح الأخطاء.
- flutter_lints — حزمة lint الرسمية لتطبيق معايير الكود الجيدة.
🏁 الخلاصة
الهندسة المعمارية في Flutter ليست مجرد ترف تنظيمي — بل هي العمود الفقري لأي تطبيق ناجح.
حين تطبّق هذه التوصيات، يصبح تطبيقك أكثر مرونة، أسرع في التطوير، وأسهل في الصيانة والاختبار.
ابدأ من الآن بتطبيق هذه المعايير تدريجيًا على مشروعك، ومع الوقت ستشعر بالفارق:
كود أنظف، منطق أوضح، وفريق أكثر إنتاجية.

