ویرگول
ورودثبت نام
مهدی کاظمی
مهدی کاظمی
مهدی کاظمی
مهدی کاظمی
خواندن ۴ دقیقه·۲ سال پیش

Architecture Styles - Pipes & Filters

در این مقاله سعی دارم در مورد سبک معماری Pipes & Filters در معماری نرم افزار بنویسم. امیدوارم براتون مفید باشه :)

معرفی Pipes & Filters:

فرض کنید در حال نوشتن نرم افزاری هستید که در بخشی از این نرم افزار با حجمی از دیتا مواجه هستید که باید این دیتا ها رو به چند بخش تقسیم کنید و بر روی هر بخش یک سری کار خاص انجام بدید و در نهایت یک سری دیتا جدید تولید کنید و حالا در جایی این دیتا جدید رو ذخیره کنید و یا در اختیار یک مصرف کننده دیگر قرار بدهید.

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

سبک Pipes & Filters اینجا به کمکمون میاد :) راه حل این سبک به این شکله که میگه هر کار مشخصی که میخواهد روی دیتا محاسبه انجام دهد یا تغییری در اون دیتا ایجاد کند و به طور کلی میخواهد یک دیتای جدید تولید کند را یک Filter در نظر بگیرید. با این تفسیر اگر تمام کارهایی که قرار است روی این دیتا کاری انجام بدهند را یک Filter در نظر بگیریم پس در نهایت چندین Filter خواهیم داشت که هر کدام قرار است یک سری دیتای مشخص از ورودی بگیرند و در خروجی یک سری دیتای جدید تحویل بدهند. پس به جای اینکه بخواهیم مثل روش سنتی همه کارها رو یک جا و داخل یک متد انجام بدیم، تمام اون کارهارو در چندین متد به صورت جداگانه انجام میدهیم.

مثال: فرض کنید نرم افزاری داریم که در بخشی از این نرم افزار یک کامپوننت به روش سنتی وظیفه دارد از ورودی شناسه کاربر را بگیرد سپس نام و نام خانوادگی و کدملی کاربر را از دیتابیس استخراج کند سپس آدرس محل سکونت کاربر را با کد ملی از طریق api اداره ثبت احوال دریافت کند و از طریق api مخابرات شماره تلفن هماره کاربر را به دست آورد و در نهایت همه این اطلاعات را داخل دیتابیس ذخیره کند. حالا اگر بخواهیم این کار را از طریق سبک Pipes & Filter انجام بدیم، سه کلاس خواهیم داشت که:

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

پس تا به اینجا سه تا Filter نوشتیم که هر کدام بخشی از دیتای نهایی مورد نظر را تولید میکنند.

سوالی که پیش میاد اینه که پس Pipe چی شد؟

بعد از نوشتن Filter ها راهی نیاز داریم تا این Filter ها به هم وصل بشوند و دیتایی نهایی را تولید کنند برای اتصال این Filterها از Pipe استفاده میکنیم، میتونیم یک Pipe داشته باشیم و هر سه Filter رو از طریق یک Pipe به هم وصل کنیم یا سه تا Pipe داشته باشیم. Pipe همان مسیر انتقال داده میباشد.

در این مثال اگر بخواهیم یک Pipe داشته باشیم، Pipe مورد نظر یک کلاس میباشد که دیتا را از ورودی دریافت میکند و به ترتیب وارد Filter ها میکند و دیتای نهایی را دریافت میکند.

اگر بخواهیم Filterها در کامپوننت های جدا اجرا شوند آن گاه Pipe مورد نظر برای هر Filter یک Queue میباشد در واقع دیتاها از طریق Queue از Filterیی به Filter دیگر منتقل میشوند.

نکاتی که در نوشتن Filter ها بهتره رعایت کنیم:

  • اصل Single Responsibility: هر Filter بهتر است تنها یک وظیف داشته باشد
  • اصل Open & Close: بهتر است یک Filter برای تغییرات بسته و برای توسعه باز باشد
  • بهتر است Filterها به یکدیگر وابسته نباشند یا به عبارتی ترتیب در اجرای Filter ها اهمیتی نداشته باشد

خب دوستان مرسی که این پست رو مطالعه کردید فقط این نکته رو اضافه کنم که نکات زیادی هست که در مورد Pipe & Filter نگفتم اگر کلیات این Style رو دوست داشتید حتما در منابع اینترنتی در مورد مثال های پیاده سازیش مطالعه کنید.

نرم افزار
۲
۰
مهدی کاظمی
مهدی کاظمی
شاید از این پست‌ها خوشتان بیاید