هندسة قابلة للتطوير لتطبيقات الهاتف المحمول الكبيرة

في هذه المقالة ، لن نقوم بتحليل MVP أو MVVM أو MVI أو شيء من هذا القبيل. سنتحدث اليوم عن شيء عالمي أكثر من مجرد بنية على مستوى العرض التقديمي. كيف تصمم تطبيقًا كبيرًا حقًا يعمل فيه عشرات أو مئات المطورين بشكل مريح؟ تطبيق سهل التمديد بغض النظر عن مقدار الرمز الذي كتبناه.


متطلبات المشروعات الكبيرة:


  1. اتصال رمز ضعيف. يجب أن تؤثر أي تغييرات على أقل قدر ممكن من التعليمات البرمجية.
  2. إعادة استخدام الرمز. يجب أن يكون من السهل إعادة استخدام الأشياء المتطابقة بدون النسخ.
  3. سهولة التوسع. يجب أن يكون من السهل على المطور إضافة وظائف جديدة إلى التعليمات البرمجية الموجودة.
  4. المزيد. يمكن تعطيل أي رمز جديد بسهولة باستخدام تبديل الميزة ، خاصة إذا كنت تستخدم التطوير القائم على الجذع .
  5. ملكية الكود. يجب تقسيم المشروع إلى وحدات ، بحيث يكون من السهل تعيين مالك لكل وحدة. سيساعدنا ذلك في مرحلة مراجعة الكود. وهنا ليس فقط عن الأشياء الكبيرة ، مثل وحدات Gradle / Pods ، ولكن أيضًا الميزات العادية ، والتي قد يكون لها أصحاب مختلفين .

مكون


صورة


. - (MV*) Presenter/ViewModel/Interactor/- . , - - . , , , // . , -, .


, . .


صورة



  1. . - .
  2. . .
  3. . .
  4. . , , .
  5. UI. .
  6. Unidirectional data flow . .
  7. . feature toggles.
    , , , . , - .


صورة


  1. (DomainObject).
  2. (UI State).
  3. .
  4. - ( , ), (Action) , . UI State, (Action) , Service. Service (. 1).


, , (Actions) (Service). Service (DomainObjects) . Service - : UserService, PaymentsService, CartService, : ProductDetailsService, OrderService.


صورة


, , MVP/MVC/MVVM/MVI , ().



 —  , , , , .


:


  • Middleware —  (Actions). , Middleware . .
  • Reducer —  Middleware. .

صورة


, Middleware Reducer , Middleware Reducer.
: Flux, Redux, MVI


Server Drive UI


, (DomainObject), . Play Store/App Store. , !


صورة


من الخادم ، يمكننا تلقي قائمة بالمكونات على الشاشة مع الإشارة إلى نوعها وموقعها على الشاشة والإصدار والبيانات اللازمة للتشغيل والعرض.


{
  "components": [
    {
      "type": "toolbar",
      "version": 3,
      "position": "header",
      "data": {
        "title": "Profile",
        "showUpArrow": true
      }
    },
    {
      "type": "user_info",
      "version": 1,
      "position": "header",
      "data": {
        "id": 1234,
        "first_name": "Alexey",
        "last_name": "Glukharev"
      }
    },
    {
      "type": "user_photo",
      "position": "header",
      "version": 2,
      "data": {
        "user_photo": "https://image_url.png"
      }
    },
    {
      "type": "menu_item",
      "version": 1,
      "position": "content",
      "data": {
        "text": "open user details",
        "deeplink": "app://user/detail/1234"
      }
    },
    {
      "type": "menu_item",
      "version": 1,
      "position": "content",
      "data": {
        "text": "contact us",
        "deeplink": "app://contact_us"
      }
    },
    {
      "type": "button",
      "version": 1,
      "position": "bottom",
      "data": {
        "text": "log out",
        "action": "log_out"
      }
    }
  ]
}

أسئلة؟


شاركت في تطوير العديد من المشاريع الكبيرة باستخدام هذه البنية ، وأنا منفتح على الأسئلة حول العمارة بشكل عام وعلى التفاصيل الفنية لتطبيق Android.


All Articles