رویکردهای Imperative و Declarative
دو رویکرد متفاوت
وقتی میخواهید یک کار را خودکار کنید، دو راه اصلی دارید:
Imperative — دستوری
شما دقیقاً مراحل را مشخص میکنید:
شما به سیستم میگویید چطور کار را انجام دهد.
Declarative — اعلانی
شما وضعیت نهایی را توصیف میکنید:
شما به سیستم میگویید چه چیزی میخواهید، نه اینکه چطور.
تفاوت اصلی
| Imperative | Declarative |
|---|---|
| مراحل را مشخص میکنید | نتیجه را مشخص میکنید |
| «اینکار را بکن، بعد آن کار را بکن» | «میخواهم سیستم اینطور باشد» |
| اجرا بهترتیب | ابزار خودش ترتیب را مدیریت میکند |
| اگر دوباره اجرا شود، ممکن است خطا دهد | idempotent — دوباره اجرا امن است |
| مثال: Bash script | مثال: Ansible, Terraform, Kubernetes |
مثال عملی
فرض کنید میخواهید یک فایل پیکربندی را روی سرور قرار دهید.
رویکرد Imperative:
شما باید همهٔ حالتها را مدیریت کنید: فایل وجود دارد؟ backup بگیرید. فایل ندارد؟ فقط کپی کنید.
رویکرد Declarative:
شما فقط میگویید «این فایل باید آنجا باشد، با این مجوزها». Ansible خودش چک میکند که آیا فایل وجود دارد، آیا محتوا یکسان است، آیا مجوزها درست است — و فقط در صورت نیاز تغییر میدهد.
مزایا و معایب
Imperative
مزایا:
- کنترل کامل دارید
- منطق پیچیده راحتتر نوشته میشود
- debugging سادهتر است — خطبهخط میبینید چه اتفاقی افتاده
معایب:
- باید همهٔ حالتها را خودتان مدیریت کنید
- idempotent کردن سخت است
- اگر اسکریپت نیمهکاره متوقف شود، سیستم در وضعیت نامشخصی میماند
Declarative
مزایا:
- Idempotent — میتوانید بارها اجرا کنید
- خواناتر است — وضعیت نهایی را میبینید، نه مراحل
- ابزار خودش مدیریت state را انجام میدهد
معایب:
- کنترل کمتر دارید
- debugging سختتر است — نمیدانید ابزار دقیقاً چه کاری کرده
- یادگیری syntax و قابلیتهای ابزار زمان میبرد
کدام را انتخاب کنیم؟
از Imperative استفاده کنید وقتی:
- منطق خاص و پیچیده دارید
- workflow چندمرحلهای با شرطهای مختلف دارید
- میخواهید سریع یک کار one-off انجام دهید
- تیم با Bash راحتتر است
مثال: یک deployment pipeline که بسته به نتیجهٔ تست، مسیرهای مختلف دارد.
از Declarative استفاده کنید وقتی:
- میخواهید وضعیت سیستم را مدیریت کنید (configuration management)
- نیاز به idempotency دارید
- میخواهید تعداد زیادی سرور را یکسان نگه دارید
- تیم با ابزار configuration management آشنا است
مثال: مدیریت پیکربندی ۱۰۰ سرور production با Ansible.
ترکیب دو رویکرد
در عمل، معمولاً هر دو را با هم استفاده میکنید:
یا برعکس — یک اسکریپت Bash که Ansible را صدا میزند:
مسیر یادگیری
در این هفته، شما بیشتر با رویکرد imperative (Bash scripts) کار کردید. این پایه است و باید آن را بلد باشید.
در بخش اختیاری این هفته، با Ansible (یک ابزار declarative) آشنا میشوید تا ببینید configuration management چطور کار میکند.
در هفتههای بعد:
- Docker Compose: declarative
- CI/CD pipelines: معمولاً declarative (YAML configs)
- Kubernetes: کاملاً declarative (YAML manifests)
بنابراین درک تفاوت این دو رویکرد، به شما کمک میکند بفهمید چرا ابزارهای مختلف به شکل متفاوتی کار میکنند.
منابع یادگیری
مستندات و مقالات
- Declarative vs Imperative Automation — تفاوت دو رویکرد در automation
- What is Infrastructure as Code (IaC)? — نقش رویکرد declarative در IaC (اختیاری - جهت مطالعه بیشتر)
ویدیوها
- Idempotency in Automation: Why Declarative Approaches Win - OpsMill — مفهوم idempotency و مزایای رویکرد declarative