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