Design Pattern های رایج برای اندروید
Design Pattern یکی از مباحث بسیار مفید و رایج در حوزه برنامه نویسی است. در این مقاله قصد داریم تا Design Pattern هایی که در برنامه نویسی اندروید رایج هستند را بررسی کنیم. البته باید در ابتدای مقاله اشاره کنیم که ممکن است بعضی از Design Pattern ها در این مقاله مورد بررسی قرار نگیرند. بنابراین Design Pattern هایی که در این مقاله ذکر نشدهاند را نمیتوانیم رد کنیم و یا خارج از استاندارد بدانیم. برای آشنایی با مفهوم Design Pattern میتوانید به اینجا مراجعه کنید.
وقتی یک پروژه را ایجاد میکنیم, باید به طوری کدنویسی کنیم که قابلیت خوانایی, استفاده مجدد و عیب یابی آن در سطح قابل قبولی باشد. این سه ویژگی کمک میکنند تا هم بروزرسانی های نرم افزار با کیفیت بهتری انجام شود و هم باعث میشود تا فرآیند ایجاد برنامه های دیگر سریع تر باشد. به این معنی که اگر کدها در سطح قابل قبولی از خوانایی و استفاده مجدد قرار داشته باشند, از آنها میتوانیم در باقی پروژه ها نیز استفاده کنیم. بنابراین زمان کمتری برای ایجاد پروژه های دیگر صرف میکنیم. در برنامه نویسی اندروید, سه نوع کلی از Design Pattern ها موجود است:
- Creational Pattern : چگونگی ایجاد Object ها را مشخص میکند
- Structural Pattern : چگونگی نوشته شدن Object ها را مشخص میکند
- Behavioral Pattern : روش هماهنگی عملکرد Object ها با یکدیگر را مشخص میکند
Creational Pattern
گاهی در پروژه از Object های پیچیدهای استفاده میشود. ممکن است برنامه نویس, قطعات ثابتی از کد ها با متغیر های متفاوت را در نقاط مختلف برنامه اجرا کند. این روش, بسیار ساده به نظر میرسد اما با افزایش حجم پروژه, با انبوهی از کد ها مواجه میشویم که این امر ممکن است در زمان عیب یابی کمی مشکل ساز باشد. بنابراین برنامه نویسان اندروید از Builder استفاده میکنند. در واقع Builder یک نوع Design Pattern از نوع Creational است که به برنامه نویس کمک میکند تا بسیار آسان تر از چنین Object هایی استفاده کند. وقتی از Builder استفاده میکنیم, گام به گام مراحل ایجاد Object را طی میکنیم. به این معنا که یک ساختار مشخص میتواند به چندین روش ایجاد شود:
UserModel userModel = UserModel.builder().username("vhdrjb").password("1234").token("0000").build(); UserModel userModel1 = UserModel.builder().token("111111").username("user2").password("4321").build();
گاهی به کلاس هایی نیاز داریم که تنها یک بار ایجاد میشوند اما در طول برنامه از آن استفاده میشود. گاهی ایجاد یک Instance جدید از روی کلاس ممکن است بیهوده و گاهی نیز باعث میشود تا خواص فعلی کلاس از دست برود. بنابراین باید نوعی ساختار برای آن مشخص کنیم تا چنین کلاس هایی را مدیریت کنیم. Singleton, یک Design Pattern از نوع Creational است که برای مدیریت چنین کلاس هایی بسیار مناسب است. در واقع در ساختار Singleton بررسی میشود که اگر یک Object به یک Instance از کلاس اختصاص یافته, دیگر Instance جدیدی ایجاد نشود و اگر Object هیچ خواصی را از کلاس نگه داری نمیکند, یک Instance ایجاد شود:
public class Config { private static Config instance; public static Config getInstance() { if (instance == null) { instance=new Config(); } return instance; } }
و برای استفاده از این کلاس تنها از متد getInstance استفاده میکنیم:
Config myConfig = Config.getInstance();
همچنین مبحث Dependency Injection نیز یک Design Pattern از نوع Creational است که به تفضیل در مقاله مجزا بررسی خواهد شد.
Structural Pattern
این نوع Design Pattern برای اعمال ساختار به کلاس ها است تا وظیفه خاصی را انجام دهند. برای مثال Adapter که برای RecyclerView استفاده میشود, یک نوع Structural Pattern است. در واقع یک ساختار مشخص برای یک پردازش مشخص, تعیین شده است.
Facade, یکی از پرکاربرد ترین Design Pattern ها از نوع Structural است. Facade را میتوان به عنوان یک رابط در مقابل یک سیستم پیچیده در نظر گرفت. به این ترتیب برای استفاده از هریک از سرویس های آن, با پیچیدگی کمتری مواجه هستیم. به این ترتیب اگر کلاس های زیر مجموعه یک رابط میتوانند بدون تغییر در شیوه استفاده از آن رابط, تغییر کنند. برای مثال یک سیستم بانکی را در نظر بگیرید. در این سیستم قصد داریم تا مبلغی را از یک حساب به حساب دیگر منتقل کنیم. برای انتقال وجه, باید یکسری بررسی ها انجام شود. ابتدا اطلاعات وارد شده کاربر برای دسترسی به حساب خود بررسی میشود. سپس مبلغ جابجایی با موجودی حساب مقایسه میشود. در مرحله بعد اگر حساب طرف مقابل یک حساب معتبر بود, جابجایی انجام میشود.
public class BankFacade { private UserAuth userAuth; private DestAuth destAuth; private MoneyCheck moneyCheck; private String account; private String password; public BankFacade(String account, String password) { this.account = account; this.password = password; userAuth = new UserAuth(); destAuth = new DestAuth(); moneyCheck = new MoneyCheck(); } public void transfer(int money, String dst) { if (userAuth.isValid() && destAuth.checkDst(dst) && moneyCheck.get(money)) { // transfer } else { // Error } } }
در مثال فوق هریک از کلاس ها به صورت مجزا نوشته شده اند. حال اگر روند احراز هویت را تغییر دهیم, شیوه استفاده از کلاس BankFacade تغییر نخواهد کرد.
Behavioral Pattern
این نوع Design Pattern ها برای برقراری و مدیریت ارتباط های میان Object ها است. نتیجه استفاده از این Design Pattern ها, افزایش انعطاف پذیری شیوه های ارتباط Object ها است. این نوع Design Pattern ها بسیار کاربردی هستند. برای مثال Observer ها که توسط RxAndroid پیاده سازی میشوند. Behavioral Pattern مدل های بسیاری را شامل میشود. این مدل ها را در مقالات مجزا بررسی خواهیم کرد.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.