فرهاد
فرهاد
خواندن ۱ دقیقه·۳ سال پیش

ضد الگوی Ambient Context

An Ambient Context supplies application code outside the Composition Root with global access to a Volatile Dependency or its behavior by the use of static class members.
Ambient Context
Ambient Context


به این مفهوم است که راهی را برای دستیابی مستقیم یا غیرمستقیم به وابستگی های یک کلاس از طریق اعضای استاتیک ارائه می کند.

مثال:

https://gist.github.com/farhadmpr/7e18c585bd9f644a6ce0a78cd7c6c5cb

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

1- تست کلاس MapViewModel سخت می شود زیرا کنترل رفتار performCriticalBusinessLogic و perfromAnotherCriticalBusinessLogic هنگام Unit Test سخت می شود.

2- این واقعیت را که آبجکت LocationManager و Date وابستگی های MapViewModel هستند را مخفی می کند.

3- در برخی شرایط می تواند باعث ایجاد coupling موقتی شود.


توجه داشته باشید که مورد شبیه performAnotherCriticalBusinessLogic یکی از شایع ترین حالت هایی است که اتفاق می افتد چونکه تقریبا بیشتر نرم‌افزار ها با تاریخ سروکار دارند.


نحوه رفع مشکل ساده است، بدین صورت که کامپوننت ها باید از abstraction استفاده کنند:

1- تعریف Abstraction

https://gist.github.com/farhadmpr/fa284f6b704679e599951ff0f02942b7

2- پیاده‌سازی Abstraction های تعریف شده

https://gist.github.com/farhadmpr/f0d5f79c296d8b21ce788d360d5bcb07

3- تغییر کامپوننت برای استفاده از Abstraction ها

https://gist.github.com/farhadmpr/c2ec432e4e40088df3eafd652fbaee9b

با تغییرات بالا مشکلاتی که مطرح شد حل می گردند و MapViewModel قابل تست می شود چونکه اکنون می توانیم پیاده‌سازی های fake ای برایش فراهم کنیم. مثال:

https://gist.github.com/farhadmpr/39b386b96f5023a78f0258326a45e077

نتیجه:

نتیجه می گیریم که ambient context می تواند در بسیاری از شکل ها ظاهر شود که برخی از آنها ممکن است مورد توجه قرار نگیرند اما شناسایی آن می تواند به ما این امکان را بدهد که کد خود را بیشتر قابل تست و کنترل کنیم.

منابع:

https://freecontent.manning.com/the-ambient-context-anti-pattern/

https://www.linkedin.com/pulse/dependency-injection-anti-pattern-ambient-context-abreu-baez

مهندسی نرم افزاربرنامه نویسیالگوی طراحیdesign patternanti pattern
علاقه‌مند به مهندسی نرم افزار، هوش مصنوعی و موسیقی
شاید از این پست‌ها خوشتان بیاید