الگوهای طراحی در شی گرایی چیست و چه کاربردی دارد؟

دیزاین پترن ها و یا الگوهای طراحی همیشه یکی از دغدغه های برنامه نویس هایی است که با مفاهیم شی گرایی آشنایی دارند اما کاربرد و چرایی استفاده از الگوهای طراحی هنوز برایشان شفاف و روشن نیست. سعی شده است در یک رشته مقاله به بررسی الگوهای طراحی بپردازم که بعنوان سرنخ بتوان مفهوم آنها را متوجه شد. در زمان های قدیم که تازه مباحث شی گرایی مطرح شده بود، برنامه نویسان متوجه شدند که در بحث توسعه نرم افزار بعضی از مشکلات در برنامه های مختلف یکسان است. بدین جهت برای رفع این مشکلات یک سری راهکارها ارائه شد که به آن الگوی طراحی میگویند. به عبارت دیگر، الگوهای طراحی یک روش حل مشکل هستند نه sourse code. بخواهیم توضیحات بالا را با مثال توضیح دهیم، فرض بر این است که من تازه به تهران آمده ام و در چهارراه ولیعصر روبروی تئاتر شهر ایستاده ام و جایی که باید ساکن شوم در ارم سبز قرار دارد. در اینجا مسئله این است: من چگونه میتوانیم با سریعترین و بهترین روش به مقصد بروم؟ امکانات من شامل مترو، اسنپ، آژانس، brt و حتی hitchhiking میباشد. اما چون راجع به ساختارکلی شهر تهران و آدرس هاش اطلاعی ندارم، فردی رو میابم که آگاهی نسبتا کافی و کاملی نسبت به شهر تهران داشته باشد و ایشان به من میگه بهترین راه رسیدن به مقصد ارم سبز، مترو میباشد.(راه حل مسئله)عملا در برنامه نویسی شی گرا، همین موضوع صدق میکند. دیزاین پترن ها توسط افرادی که اشراف کاملی در حوزه برنامه نویسی داشتند، تدوین شد و با ارائه ی این دیزاین پترنها به برنامه نویس ها این آسودگی خیال را میدهند که درگیر موضوعات حاشیه برای حل مسائل نشوند. موضوعات حاشیه چیست؟ در ادامه مقاله متوجه میشید.دیزاین پترن ها در شاخه های مختلفی تقسیم میشوند که سه دسته ی آن عمومیت بیشتری دارند. 1- دسته اول creational design pattern میباشد. این الگوهای طراحی برای ساختن(create) اشیا(object) استفاده میشود. خب چرا باید برای ساخت یه شی از دیزاین پترن باید استفاده شود؟ چون اون افرادی که اشراف داشتن به حوزه برنامه نویسی، استفاده از کلمه ی کلیدی new را خطرناک میدانستن و عقیده داشتن که باید از کلمه new کمتر استفاده شود. (چرا خطرناک؟ در این رشته مقاله نمیگنجد، سرچ کرده و در کامنت ها به آن اشاره کنید). بطور مثال برنامه بسیار بزرگ شده است و ممکنه در 100 ها و یا هزاران کلاس تعریف شده باشد و شما یه obj از آن باید میساختین با استفاده از new، مثلا یک عالمه new user داریم و مدتی بعد متوجه میشویم که باید پارامتر جدیدی به آن اضافه کنیم، پس باید در کل برنامه آنها را پیدا کرده و تغییر بدیم. پس اون آدمای متخصص متوجه شدن که ساخت اشیا با new کار درستی نیست و باید تلاش شود که وابستگی بخش های مختلف نرم افزاری به همدیگر کم باشد. برای رفع این مشکل دیزاین پترن factory را پیشنهاد دادند که یک کلاس میسازیم توی این کلاس factory یک شی را میسازیم و از این فکتوری استفاده میکنیم. یا مثلا میخواهیم فقط یه شی ساخته شود که اونجا از دیزاین پترن singltone استفاده میشود.بطور خلاصه :) creational design pattern ها مشکلات ساخت object ها را حل میکند. 2- دسته دوم الگوهای طراحی ساختاری (structrural design pattern)هستند. این الگوها کمک میکنند که دیزاین،معماری و یا ساختار نرم افزار به مشکل خاصی زمان scale برنخورد و مشکلات ساختاری و دیزاین برنامه را برای شما راحتتر میکند. عملا ممکن است الگویی به شما دهد که برای استفاده از این مدل کار(پروژه)بهترین ساختار چیه.مثلا الگوی طراحی ساختاری adapter میگوید زمانیکه میخواهید از یک کتابخانه ی خارجی یا ماژول خارجی در نرم افزارتون استفاده کنید، بیا و اون adapt کن که اگر بعدها api آن کتابخانه آپدیت شد بیچاره نشوید و فقط adapter رو تغییر دهید.در الگوهای طراحی بیشتر از inheritance یا مفهوم ارث بری استفاده میشود که ارتباط بین کلاسها را برای مورد خاصی مدیریت میکند. پس الگوی طراحی ساختاری میگوید ماست ها را در قیمه ها نریخته و همه چیز را قاطی نکنیم بلکه تا جایی که امکان دارد باید نقاط اتصال و وابستگی کمتری بین دوبخش برنامه باشد. adapter تنها نقطه ی اتصال با کل برنامه میباشد که از یکسر به برنامه و از طرف دیگر به اون کتابخانه خارجی وصل است. 3- دسته سوم الگوهای طراحی رفتاری است . این الگوها عملا برای حل مسئله تعامل و یا interaction بین objectها میباشد. مثلا مهمترین این الگوی طراحی، زنجیره مسئولیت(chain of responsibility) مییاشد. مثلا یک کار رو میخواهیم توی چند بخش انجام بدهیم که خروجی یکی ورودی دیگری است. در حقیقت یک لینک لیست رو میتونه پردازش کنه. یا الگوی مصرف Iterator که وقتی شما میخواهید روی اشیا پیمایش کنید، با استفاده از آن میتوانید راهکار خوب ارائه دهید. یا الگوی رفتاری strategy، خیلی کاربردی است که میگوید هروقت یک کاری یا feature ای میخاد و پیاده سازی شود راه های مختلفی میتونه پیاده سازی بشه باید از الگوی طراحی strategy برای حل مسئله استفاده کرد.نکات دیزاین پترن ها کاملا مستقل از زبان برنامه نویسی هستند و بسیار کاربردی هستند اما به شی گرایی وابسته هستند. کافیه یاد بگیرید بعد در همه ی زبان ها میتوانید استفاده کنید. الگوهای طراحی را کجا و کی باید استفاده کرد؟ قبل از هرچیز ابتدا باید روی همه الگوهای طراحی تسلط داشت. بعبارتی باید متوجه شد که هر الگوی طراحی چه مسئله ای رو چگونه حل میکند.پس برای استفاده از الگوهای طراحی ابتدا باید بفهمیم مسئله چیست؟ الگوی مناسب چیست؟ و نحوه پیاده سازی به چه صورت است.سوال بعدی کی ؟ زمانی باید استفاده کرد که نرم افزارتون چقدر باید بزرگ شود؟ چقدر میخاد توسعه پیدا کند و scale بشه . اگر قراره بزرگ بشه استفاده از دیزاین پترن ها، scale پذیری برنامه رو بسیار بالا میبرد. در مقاله بعدی بعضی از دیزاین پترن ها رو بصورت جزئی تر مورد بررسی قرار میدهم.منبع: کلا سون لرن .