دیزاین پترن یا الگوی طراحی اندروید

انواع دیزاین پترن (الگوی طراحی) در اندروید

اگر شما هم تجربه ساخت اپلیکیشن بدون دیزاین پترن یا الگوی طراحی را داشته باشید، حتما میدانید وقتی که کارهای نرم افزار سنگین میشود، اپلیکیشن بسیار کند عمل میکند و مشکلات زیادی برای آن به وجود می آید. تقریبا همه برنامه نویس ها در ابتدای کار خودشان سعی میکنند همه عملکرد ها را در اکتیویتی و فرگمنت قرار بدهند. از همینجاست که همه مشکلات شروع میشوند. بهتر است از یک طرف دیگر به قضیه نگاه کنیم. اولین اشتباه برنامه نویس ها این است که یک دیزاین پترن یا الگوی طراحی خوب را از همان ابتدای کار پیاده سازی نمیکنند. در این نوشته از برنامه چی میخواهیم دیزاین پترن های معروف اندروید را با هم بررسی کنیم.

دیزاین پترن اندروید

هدف کلی الگوی طراحی در اپلیکیشن های اندروید بهبود عملکرد، بهبود قابلیت تست پذیری، راحت تر کردن توسعه و افزایش خوانایی نرم افزار است. در این نوشته میخواهیم همه دیزاین پترن های معروفی که برای اپلیکیشن های اندروید میتوانید از آنها استفاده کنید را بررسی کنیم. الگو های MVC، MVP و MVVM، نحوه کار آنها و مزیت هایی که دارند در این نوشته معرفی میشوند. لیست تیتر ها را در باکس زیر ببینید.


ویدئو: معرفی بهترین دیزاین پترن ها در اندروید

1- ویدئوی آپارات:


2- ویدئوی یوتیوب:


دیزاین پترن (Design Pattern) چیست؟

الگوی طراحی یا دیزاین پترن یک مدل برای تولید و چینش اجزای اپلیکیشن است که برای حل مشکلات رایجی که برنامه نویس ها با آن روبرو هستند ساخته میشود. یعنی برنامه نویس هایی که تجربه بسیار بالایی داشتند برای حل یک سری مشکلات، معماری های خاصی برای اپلیکیشن ارائه میدهند. این معماری ها تست میشوند و اگر موثر باشند، به یک الگو برای برنامه نویس های دیگر تبدیل خواهند شد.

الگوی طراحی چیست؟

ایده اصلی پشت همه این دیزان پترن ها این بود که کدهای پروژه به شکل مناسبی دسته بندی شوند تا راحت تر بتوان آن را تست کرد. اما علاوه بر اینها عملیات توسعه و نگهداری اپلیکیشن، اضافه کردن ویژگی های جدید و بررسی تغییرات پروژه هم بسیار راحت تر میشود.

پس ما به عنوان یک برنامه نویس میتوانیم از الگوهای قدرتمند و امتحان شده برای تعیین معماری نرم افزار خودمان استفاده کنیم. با وجود این دیزاین پترن ها نیازی نیست همه مشکلات پیچیده را خودمان از ابتدا حل کنیم. اگر قبل از شروع پروژه، همه اجزای اپلیکیشن را طبق یکی از الگوهای مطمئن طراحی کنیم، اپلیکیشن ما مقیاس پذیر، قابل توسعه و قابل تست خواهد شد.


چرا به یک الگوی طراحی خوب نیاز داریم؟

یک جواب ساده به این سوال این است که همه چیز باید به خوبی سازماندهی شده باشد، حتی اپلیکیشن های اندروید! اگر از دیزاین پترن های خوب استفاده نکرده باشید، حتما با چند عدد از مشکلات زیر آشنا هستید:

  • همه کدهای شما در Unit Test قرار نمیگیرند.
  • دیباگ کردن یک کلاس به خاطر تعداد زیاد تابع های آن کار بسیار مشکلی است.
  • نمیتوانید اتفاقات منطقی موجود در یک کلاس بسیار بزرگ را ردگیری کنید.
  • یک توسعه دهنده دیگر نمیتواند به راحتی پشتیبانی اپلیکیشن شما را انجام بدهد و ویژگی های جدید به آن اضافه کند.
design pattern خوب

این مشکلات در اپلیکیشن هایی که کیفیت بالایی دارند دیده نمیشوند. پس اگر شما هم میخواهید یک پروژه با کیفیت اندروید داشته باشید، باید از یک الگوی طراحی قدرتمند و مطمئن استفاده کنید. تاثیراتی که یک دیزاین پترن روی اپلیکیشن شما دارد:

  1. سادگی: با استفاده از الگوی طراحی، هر کامپوننت کاملا از بقیه اجزا جدا میشود. دیگر یک کلاس قرار نیست یک عضو چندکاره در اپلیکیشن باشد. شما به راحتی میتوانید متوجه بشوید هر کلاس چرا ساخته شده و چه کاری انجام میدهد. همه این موارد باعث سادگی پروژه شما خواهد شد.
  2. تست پذیری: برای اینکه بخواهیم Unit Test را روی اپلکیشن اجرا کنیم، نیاز داریم کدهایی بنویسیم که قابلیت تست شدن را داشته باشند. استفاده از دیزاین پترن ها پروژه اندروید را تست پذیر میکنند.
  3. هزینه کم نگهداری: داشتن معماری خوب نگهداری، پشتیبانی و توسعه نرم افزار را بسیار آسان میکند. علاوه بر این، رهگیری قسمت های مهم منطق نرم افزار هم ساده تر میشود.

خب، بهترین Design Pattern کدام است؟

در جواب این سوال باید بگویم که ما نمیتوانیم یک الگوی طراحی را انتخاب کنیم و برای همه پروژه ها همان را استفاده کنیم. زیرا دیزاین پترن یک مفهوم انتزاعی است و باید طبق نیازهای هر پروژه، بصورت جداگانه برای آن تصمیم بگیریم. حتی ممکن است در پروژه های بزرگ، هر ماژول معماری مخصوص خودش را داشته باشد.

بهترین دیزاین پترن یا الگوی طراحی

هر چقدر بیشتر با دیزاین پترن ها کار کنید و در پروژ های مختلف آنها را پیاده سازی نمایید، خیلی بهتر و راحت تر میتوانید مورد درست را انتخاب کنید. پس یکی از آن ها را بردارید، درباره اش مطالعه کنید و در یک پروژه آن را پیاده سازی نمایید. با این کار همه نکته های مورد نیاز برای انتخاب درست را یاد میگیرید.

تعدادی از دیزاین پترن های معروف در برنامه نویسی اندروید این موارد هستند:

  1. معماری MVC (Model View Controller)
  2. معماری MVP (Model View Presenter)
  3. معماری MVVM (Model View ViewModel)

شاید این معماری ها برای شما هم مقداری گیج کننده باشند. اما در این نوشته سعی میکنیم همه آنها را به زبان ساده بررسی کنیم تا سوال دیگری در ذهن شما باقی نماند.


معماری MVP در اندروید

الگوی طراحی MVP اندروید

بسیاری از برنامه نویس های اندروید در حال حاضر از الگوی طراحی MVP استفاده میکنند. حتی خود گوگل هم یک پروژه Best Practice از این معماری را در گیت هاب منتشر کرده است. قبل از هر چیز باید باید با تعریف این معماری آشنا بشویم. الگوی طراحی MVP پروژه شما را به سه لایه مختلف تقسیم میکند:

  1. لایه Model: همه داده ها در این لایه قرار میگیرند. لایه Model مسئول رسیدگی به همه لاجیک و اتفاقات منطقی اپلیکیشن، ارتباط با پایگاه داده و تعامل با سرور است.
  2. لایه View: لایه ای که رابط کاربری (UI) درون آن قرار میگیرد. در حقیقت لایه View همه تغییرات داده را روی رابط کاربری نشان میدهد و تعاملات کاربر با اپلیکیشن را به اطلاع لایه Presenter دیگر میرساند.
  3. لایه Presenter: این لایه همه اطلاعات را از لایه Model دریافت میکند و تصمیم میگیرد که چه چیزی روی رابط کاربری نمایش داده شود. لایه Presenter در حقیقت لایه View را کنترل میکند و بر اساس ورودی های کاربر، واکنش های مناسب را انجام خواهد داد. به عبارت دیگر، این لایه بین لایه های View و Model قرار میگیرد و آنها را به هم متصل میکند. یعنی وقتی که یک ورودی از کاربر دریافت میشود، لایه Presenter یک درخواست به لایه Model ارسال میکند. وقتی که کار لایه Model تمام شد، لایه Presenter باخبر شده و به لایه View دستور میدهد که چه چیزی را نمایش بدهد.
معماری MVP در اندروید

در الگوی طراحی MVP لایه های View و Presenter وابستگی زیادی به هم دارند و یک ارجاع از همدیگر را درون خود نگه میدارند. برای اینکه کد خوانایی بیشتری داشته باشد، با استفاده از یک کلاس Contract نحوه ارتباط لایه های Presenter و View را مشخص میکنیم. لایه View کاملا ایزوله میشود و یک اینترفیس برای ارتباط آن تعریف میکنیم. با این کار لایه Presenter میتواند برای Unit Testing آماده شود.

مزایا:

  • نبودن هیچ ارتباط مفهومی بین کامپوننت های اندروید
  • نگهداری و تست راحت کد ها، تا زمانی که لایه های Presenter، View و Model از هم جدا باشند.

معایب:

  • اگر توسعه دهنده کدها را درست دسته بندی نکند، کلاس Presenter به یک کلاس بسیار بزرگ تبدیل میشود که مدیریت آن بسیار سخت است.

معماری MVC در اندروید

دیزاین پترن MVC اندروید

دیزاین پترن MVC، قدیمی ترین معماری موجود برای اندروید است اما بهترین الگوی طراحی برای اپلیکیشن ها نیست (درباره ش توضیح میدم). بهتر است قبل از هر چیز با اجزای این دیزاین پترن و اینکه هر کدام چه وظیفه ای دارند آشنا شویم. معماری MVC بصورت خیلی ساده اپلیکیشن را به سه لایه تقسیم میکند:

  1. لایه Model: لایه ای که وظیفه تامین داده برای اپلیکیشن را دارد. همه منطقی که در اپلیکیشن جریان دارد، در این لایه مدیریت میشود. همچنین ارتباط گرفتن با دیتابیس و سرور هم وظیفه لایه Model در این معماری است. یعنی در حقیقت همه راه حل هایی که اپلیکیشن ارائه میدهد و کلاس های مدیریتی، در این لایه قرار میگیرند. فرض کنید میخواهید یک اپلیکیشن کتابخانه درست کنید، کلاس های Book، Author و PublishingHouse باید در این لایه وجود داشته باشند. البته هیچ کدام از این کلاس ها نباید هیچ وابستگی به کلاس های Android داشته باشند.
  2. لایه View: این لایه یک اینترفیس میباشد که مسئول رسیدگی به UI یا رابط کاربری است. همه اجزای View باید این اینترفیس را Implement کنند، یعنی اکتیویتی، فرگمنت، آداپتر و دیالوگ ها. همه این موارد در یک پکیج قرار میگیرند و مسئول نمایش داده ها به کاربر هستند.
  3. لایه Controller: این لایه همه قوانین اصلی و مرکزی اپلیکیشن را کنترل میکند. لایه Controller وظیفه گوش دادن به ورودی های کاربر و به روز رسانی لایه View و Model را به عهده دارد. معمولا لایه های View و Controller در یک کلاس جاوا قرار میگیرند. مثلا یک اکتیویتی بصورت همزمان هم به عنوان View و هم به عنوان Controller عمل میکند زیرا به ورودی های کاربر (مثلا کلیک ها) گوش میدهد و پاسخ مناسب را نمایش میدهد. بهترین کار این است که Controller را در یک کلاس جداگانه داشته باشیم. اما این مدل رابطه بین لایه ها، تست پذیری اکتیویتی را کاهش میدهد. زیرا بهترین راهکار برای تست پذیری این است که آن قسمت از اپلیکیشن مورد استفاده نباشد و با این کار، تعاملات کاربر و نمایش داده ها در یک کلاس قرار میگیرند. علاوه بر اینها، هر دو لایه View و Controller به لایه Model دسترسی دارند. این نوع معماری زیاد مناسب نیست، زیرا لایه Model با بیش از یک لایه در ارتباط است و این مسئله مقیاس پذیری اپلیکیشن را کم میکند.
معماری MVC در اندروید

در الگوی طراحی MVC هر دو لایه View و Controller به لایه Model وابسته هستند. داده های اپلیکیشن توسط لایه Controller به روز رسانی میشوند و لایه View داده ها را دریافت میکند. در این دیزاین پترن، لایه Model میتواند بصورت جداگانه از UI تست شود، چون هیچ ارتباطی بین آنها وجود ندارد. راه های زیادی برای پیاده سازی معمای MVC در اندروید وجود دارد. هر دو کامپوننت اکتیویتی و فرگمنت میتوانند به عنوان لایه Controller عمل کنند، زیرا آنها مسئول پردازش داده و به روز رسانی رابط کاربری هستند.

راه دیگر این است که اکتیویتی و فرگمنت را به عنوان لایه View در نظر بگیریم. لایه های Controller و Model نباید هیچکدام از کلاس های اندروید را Extend کنند. در این الگوی معماری لایه View یک وظیفه اصلی دارد. این لایه نباید هیچ کدام از منطق های اپلیکیشن را پیاده سازی کند. به جای اینکار باید هر بار که کاربر عملی را انجام میدهد، لایهView باید لایه Controller را با خبر کند و همه داده هایی که از لایه Model می آید را نمایش بدهد. اگر این شرایط رعایت شود، همه عملکرد های لایه View میتواند با UI Test مورد بررسی قرار بگیرد.

مزایا:

  • دیزاین پترن MVC تست پذیری کد ها را بالا میبرد و با جداسازی لایه ها در اپلیکیشن، توسعه و اضافه کردن ویژگی های جدید به پروژه را بسیار راحت تر میکند.
  • اگر لایه های Model و Controller هیچکدام از کلاس های Android را Extend نکنند، میتوانند مورد تست قرار بگیرند.
  • عملکرد های View میتواند با انجام UI Test مورد بررسی قرار بگیرد اگر لایه View از تنها وظیفه ای که دارد پیروی کند (یعنی همان با خبر کردن Controller و نمایش داده ها از لایه Model بدون پیاده سازی هیچکدام از منطق های نرم افزار).

معایب:

  • حتی اگر MVC به درستی پیاده سازی شده باشد، باز هم لایه ها به هم وابستگی خواهند داشت.
  • هیچ پارامتری برای مدیریت کردن منطق های رابط کاربری وجود ندارد. (مثلا روش نمایش داده ها).

معماری MVVM در اندروید

الگوی طراحی MVVM اندروید

دیزاین پترن MVVM سومین الگوی طراحی است که میخواهیم درباره آن صحبت کنیم. در حقیقت تیم اندروید بعد از معرفی Android Architecture Components این معماری را برای اپلیکیشن های اندروید پیشنهاد داد. این دیزاین پترن ارتباط تنگاتنگ بین لایه های مختلف در معماری اپلیکیشن را کاهش میدهد. همچنین در الگوی طراحی MVVM هیچکدام از لایه های فرزند، ارجاع مستقیم به لایه والد ندارند. ارتباط بین آنها از طریق Observable ها برقرار میشود. لایه های مختلف نرم افزار در این الگوی طراحی به این شکل هستند:

  1. لایه Model: این لایه مسئول انتزاع منابع داده است. در این معماری، لایه های Model و ViewModel برای دریافت و ذخیره داده ها با هم کار میکنند. همه منطق اپلیکیشن، ارتباط با پایگاه های داده، ارتباط با سرور، کلاس های مدل و غیره در این لایه جای میگیرند.
  2. لایه View: هدف وجود این لایه این است که همه فعالیت های کاربر را به اطلاع ViewModel برساند. لایه View شامل همه اجزای رابط کاربری مانند اکتیویتی، فرگمنت و کدهای XML میشود. این لایه همه فعالیت های کاربر را به لایه ViewModel اطلاع میدهد اما هیچ پاسخی را بصورت مستقیم از این لایه دریافت نمیکند. برای دریافت اطلاعات، باید روی Observable هایی که در لایه ViewModel ساخته میشود، Observe کنند.
  3. لایه ViewModel: این لایه مسئول فراهم کردن جریان های داده ای است که هیچ ارتباطی با View ندارند. لایه ViewModel مانند یک پل ارتباطی بین View و Model عمل میکند. این لایه هیچ اطلاعی از این که کدام View در حال استفاده از آن است ندارد. در حقیقت اصلا ارجاع مستقیمی به View درون آن وجود ندارد. پس روند کار به این صورت است که ViewModel هیچ اطلاعی از View و اینکه چه کسی با آن تعامل میکند ندارد. به جای آن با لایه Model ارتباط میگیرد و نتایج و داده ها را از طریق جریان های داده ای (Observable) در اختیار اپلیکیشن میگذارد که این جریان ها میتوانند توسط لایه View اپلیکیشن، Observe شوند.
معماری MVVM در اندروید

در الگوی طراحی MVVM لایه View برای اکشن های مختلفی لایه ViewModel را با خبر میکند. لایه View دارای ارجاع به لایه ViewModel است اما در لایه ViewModel نباید هیچ ارجاعی به لایه View نباید وجود داشته باشد. یعنی بین لایه های View و ViewModel رابطه Many-to-One وجود دارد و دیزاین پترن MVVM از Data Binding دو طرفه بین هر دوی این لایه ها پشتیبانی میکند.

مزایا:

  • توسعه دهنده ها میتوانند اپلیکیشن هایی طراحی کنند که در آینده امکان اضافه کردن Feature به آنها وجود دارد.
  • پروژه را دارای یک ساختار ماژولار میکند که نگهداری راحت، توسعه آسان و کیفیت کدهای اپلیکیشن را تضمین میکند.

معایب:

  • نوشتن همه کدهای پروژه با استفاده از این دیزاین پترن، کار وقت گیری است.
  • تیم توسعه اپلیکیشن باید بسیار منظم و طبق قوانین عمل کنند. زیرا جاگذاری اشتباه یکی از اجزای کد، میتواند همه اپلیکیشن را به هم بریزد.

مقایسه MVP، MVC و MVVM

الگوی طراحیوابستگی به API اندرویدپیچیدگی XMLتست پذیریپیروی از قواعد ماژولا
MVCزیادکمسختخیر
MVPکمکمخوببله
MVVMکم (تقریبا صفر)متوسط تا زیادبهترینبله

سوالی دارید؟

الگوی طراحی یا دیزاین پترن در اندروید

در این مقاله آموزشی درباره انواع دیزاین پترن های موجود برای اپلیکیشن های اندروید صحبت کردیم. اگر سوالی در ذهن شما وجود دارد یا نکته ای را میتوانید اضافه کنید، حتما با نوشتن آن در قسمت نظرات (همین پایین) این مقاله آموزشی را تکمیل تر نمایید.


منابع بیشتر برای مطالعه

میتوانید از منابع زیر برای مطالعه بیشتر درباره انواع الگوی طراحی در اندروید استفاده کنید:

درباره نویسنده

5 در مورد “انواع دیزاین پترن (الگوی طراحی) در اندروید”

  1. عباس مهدیه

    سلام وقتتون بخیر
    ممنون بابت توضیح کامل و مفیدتون
    من تازه برنامه نویسی رو شروع کردم و میخوام یه پروژه انجام بدم ولی نمیدونم کدوم Design Pattern مناسب پروژه من هست.
    چه آیتم هایی رو باید بررسی کنم تا متوجه بشم کدوم Design Pattern مناسب پروژه من هست تا برم اونو یاد بگیرم؟؟؟؟؟

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اسکرول به بالا