إزاي تنظم مشروع فلاتر ضخم باستخدام معمارية الـ Feature-First؟
أكيد مريت باللحظة دي، لما بتفتح مشروع Flutter كبير، وتلاقي فولدر الـ lib مليان مئات الملفات، وكل ما تيجي تعمل Push لكودك تلاقي نفسك دخلت في "حرب" مع الـ Merge Conflicts. فريقك شغال، وأنت شغال، وكلكم بتخبطوا في نفس الملفات لأن التنظيم معتمد على نوع الملفات مش على وظيفتها. النهاردة هنتكلم عن الحل السحري اللي بيستخدمه المحترفين: معمارية الـ Feature-First.
Table of contents [Show]
يعني إيه أصلاً Feature-First؟
ببساطة، بدل ما تقسم الكود بتاعك على أساس الطبقات (Layers) زي الـ Models والـ Views والـ Controllers في فولدرات منفصلة، إحنا بنقسم المشروع على أساس الـ (Features) أو المميزات. يعني كل ميزة في التطبيق (زي الـ Login، أو الـ Profile، أو الـ Cart) بتبقى في فولدر مستقل، وجوه الفولدر ده هتلاقي كل حاجة تخص الميزة دي بس.
دي بتخلي الفريق يشتغل براحته، كل واحد ماسك "Feature" معينة، ومفيش حد بيدوس على طرف التاني، وده بيقلل الـ Merge Conflicts بشكل مرعب.
إزاي تهيكل الكود بتاعك؟
هنا بنعتمد على تقسيم الـ (Modular Architecture). تخيل المشروع كأنه مجموعة من البلوكات المستقلة. الهيكل بيكون غالباً كالتالي:
lib/
features/
auth/
data/
domain/
presentation/
profile/
data/
domain/
presentation/
core/
network/
theme/
widgets/
في الـ (Feature) الواحدة، بنمشي على مبدأ الـ (Clean Architecture)، يعني جوه كل ميزة عندك:
- Data Layer: للـ API Calls والـ Repository implementations.
- Domain Layer: للـ Entities والـ Use Cases (المنطق الأساسي).
- Presentation Layer: للـ UI والـ State Management (زي Bloc أو Provider).
مزايا الـ Feature-First في فرق العمل
أهم ميزة هنا هي الـ (Scalability). لما المشروع يكبر، مش بتضطر تدور في "زحمة" فولدرات الـ Models العامة. كمان الـ (Code Ownership) بتبقى واضحة جداً؛ كل مبرمج مسؤول عن Feature معينة داخل الـ (Module) الخاص بها.
لما تيجي تعمل (Collaborations) مع تيم كبير، كل واحد بيعدل في ملفات خاصة بـ Feature محددة، ففرص الـ (Merge Conflicts) بتقل جداً لأنك نادراً ما هتحتاج تفتح ملفات تخص ميزة تانية شغال عليها زميلك.
مثال عملي بسيط
لو بنعمل ميزة الـ Login، بدل ما نشتت الكود، بنحطه كله في مكان واحد:
// lib/features/auth/presentation/login_screen.dart
// كل الـ Logic والـ Widgets هنا
class LoginScreen extends StatelessWidget { ... }
// lib/features/auth/data/auth_repository.dart
// الـ API calls الخاصة بالـ Auth بس
class AuthRepository { ... }
نصيحة من أخ لمبرمج زيه
بص يا سيدي، المعمارية دي في الأول هتحسسك إنها "overkill" أو زيادة عن اللزوم لو بتعمل تطبيق صغير، بس صدقني، لو بتشتغل في تيم أو مشروع ناوي تكبره، دي هتكون طوق النجاة ليك. ابدأ طبقها تدريجياً، وجرب تفصل الـ Features الكبيرة الأول. الممارسة هي اللي هتخليك تحس بقيمتها لما تيجي تفتح الـ Git وتلاقي الـ Merge ماشي زي السكينة في الحلاوة.