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.
به این مفهوم است که راهی را برای دستیابی مستقیم یا غیرمستقیم به وابستگی های یک کلاس از طریق اعضای استاتیک ارائه می کند.
مثال:
در نگاه اول این کد ممکنه بدون مشکل بنظر برسد اما مشکلاتی که دارد عبارتند از :
1- تست کلاس MapViewModel سخت می شود زیرا کنترل رفتار performCriticalBusinessLogic و perfromAnotherCriticalBusinessLogic هنگام Unit Test سخت می شود.
2- این واقعیت را که آبجکت LocationManager و Date وابستگی های MapViewModel هستند را مخفی می کند.
3- در برخی شرایط می تواند باعث ایجاد coupling موقتی شود.
توجه داشته باشید که مورد شبیه performAnotherCriticalBusinessLogic یکی از شایع ترین حالت هایی است که اتفاق می افتد چونکه تقریبا بیشتر نرمافزار ها با تاریخ سروکار دارند.
نحوه رفع مشکل ساده است، بدین صورت که کامپوننت ها باید از abstraction استفاده کنند:
1- تعریف Abstraction
2- پیادهسازی Abstraction های تعریف شده
3- تغییر کامپوننت برای استفاده از Abstraction ها
با تغییرات بالا مشکلاتی که مطرح شد حل می گردند و MapViewModel قابل تست می شود چونکه اکنون می توانیم پیادهسازی های fake ای برایش فراهم کنیم. مثال:
نتیجه:
نتیجه می گیریم که ambient context می تواند در بسیاری از شکل ها ظاهر شود که برخی از آنها ممکن است مورد توجه قرار نگیرند اما شناسایی آن می تواند به ما این امکان را بدهد که کد خود را بیشتر قابل تست و کنترل کنیم.
منابع:
https://freecontent.manning.com/the-ambient-context-anti-pattern/
https://www.linkedin.com/pulse/dependency-injection-anti-pattern-ambient-context-abreu-baez