علی کریمی
علی کریمی
خواندن ۶ دقیقه·۴ سال پیش

تفکیک نگرانی ها (Separation of concerns) - قسمت اول

تفکیک نگرانی ها
تفکیک نگرانی ها


تفکیک نگرانی ها (SOC) ، یک اصل مهم در مراحل برنامه ریزی ، معماری و طراحی است. هدف ، درک ، طراحی و مدیریت موثر سیستم هایی با وابستگی های پیچیده است. به طوری که عملکردها بتوانند استفاده مجدد بشوند و به طور مستقل از سایر عملکردها بهبود داده بشوند و توسعه پیدا کنند و از خرابی های بلقوه عملکردهای دیگر ایزوله باشند و در امان بمانند.

در علوم کامپیوتر، SOC یک اصل طراحی برای جداسازی برنامه به بخش های مجزا است ، به طوری که هر بخش به جداسازی یک نگرانی بپردازد . نگرانی یا Concern مجموعه ای از اطلاعات است که میتوانند بر کد برنامه کامپیوتری اثر بگذارند.یک نگرانی میتواند جزئیات سخت افزاری باشند که کد را برای سازگاری با آن بهینه کرده ایم یا جزئیات برقراری ارتباط با دیتابیسی خاص و… .

به برنامه ای که SOC را به خوبی رعایت کرده باشد ، برنامه ماژولار می گویند . در همچین برنامه ای شما میتوانید خیلی از نگرانی ها را تغییر داده و یا پیاده سازی آنها را تغییر دهید بدون آنکه نیازی به تغییر قسمت های دیگر برنامه داشته باشید. برای مثال فرض کنید که برنامه ما در حال حاظر برای کار با دیتابیس SQL Server نوشته شده باشد و قرار باشد دیتابیس را به Oracle تغییر دهند . اگر کدهای مربوط به این بخش را به خوبی جدا کرده باشیم (در کلاس ها یا پکیج های مشخص ) به راحتی میتوانیم با تغییر بخش مورد نظر نرم افزار را برای کار با دیتابیس Oracle تغییر دهیم . اما اگر کدهای مربوطه به درستی جداسازی نشده باشند و در کل پروژه پخش باشند مجبوریم کل پروژه را بگردیم و کدها را تغییر دهیم که فرآیندی زمان بر و هزینه بر است همچنین ممکن است برخی از قسمت ها از قلم بیفتند و باگ هایی ایجاد کنند .

ماژولار کردن برنامه از طریق جمع آوری اطلاعات و کدهای مرتبط به یک موضوع و نگرانی در یک بخش جدا که دارای رابط مشخصی است بدست می آید. کپسوله سازی (Encapsulation) ، که برای پنهان سازی اطلاعات استفاده میشود ، کاربرد زیادی در جداسازی نگرانی ها دارد . همچنین معماری ها و الگوهای طراحی مختلف یکی دیگر از روش های رعایت SOC است.

تفکیک نگرانی ها (SOC) ، در طراحی ، توسعه و استفاده از نرم افزار برای ما درجات آزادی بیشتری را فراهم میکند. در میان این موارد درجات آزادی بیشتر در ساده سازی و نگهداری کد از تاثیرات مهم SOC است.

وقتی جداسازی نگرانی ها به خوبی انجام شده باشد ، درجه آزادی بیشتری برای استفاده مجدد ، توسعه ماژول و ارتقا آن بدست می آید. از آنجا که ماژول ها جزئیات نگرانی های خود را در پشت رابط ها پنهان می کنند، آزادی بیشتری برای بهبود و تغیرات یک بخش از نگرانی ها را بدون دانستن جزئیات و بدون تغییر در بخش های دیگر فراهم میکند . همچنین هر ماژول میتواند نسخه های مختلف رابط (Interface) را ارئه کند تا بتواند به راحتی عملکردهای خود را به شکل های مختلف ارائه کند یا برای هر بخشی عملکردهای مختص آن را ارئه کند و این مسئله بویژه در سیستم های بزرگ و پیچیده باعث افزایش آزادی ارتقا بخش های مختلف میشود.

تفکیک نگرانی ها ، شکلی از انتزاء است . مانند خیلی از انتزاء های دیگر باید رابط ها (Interface) اضافه شوند تا کد داخل هر بخش به شکل خالص تری اجرا شود (یعنی برای اجرا کمترین وابستگی را به بخش های دیگر و جزئیات آنها داشته باشد).بنابراین با وجود مزایای بالای SOC ، شما باید جریمه ایجاد ارتباطات و رابط ها را بپردازید. البته مطمئن باشید که ارزشش را دارد.

تفکیک نگرانی های تجاری و سیستمی
تفکیک نگرانی های تجاری و سیستمی


پیاده سازی :

در زبان های برنامه نویسی ، مکانیسم هایی برای برنامه نویسی شیئ گرا و ایجاد SOC ارئه شده است. برای مثال در زبان های شیئ گرا مثل #C و ++C و Java و امثال آن از آبجکت ها برای جداسازی استفاده میکنند و همچنین توسط الگوهای معماری مانند MVC و MVP ، مدل محتوا ، نحوه ارائه آن و پردازش آن را جدا میکنند. طراحی سرویس گرا (Service oriented design) نگرانی ها را در سرویس ها جدا میکند. زبان های ساخت یافته ، مثل C و پاسکال نگرانی ها را تنها در Function ها و Procedure ها جدا میکنند . زبان های برنامه نویسی جنبه گرا(Aspect Oriented) میتوانند نگرانی ها را در آبجکت ها و جنبه ها (Aspect) جدا کنند.


تفکیک نگرانی به شکل عمودی و افقی
تفکیک نگرانی به شکل عمودی و افقی


تفکیک نگرانی ها (SOC) ، یک اصل مهم در مراحل برنامه ریزی ، معماری و طراحی است. هدف ، درک ، طراحی و مدیریت موثر سیستم هایی با وابستگی های پیچیده است. به طوری که عملکردها بتوانند استفاده مجدد بشوند و به طور مستقل از سایر عملکردها بهبود داده بشوند و توسعه پیدا کنند و از خرابی های بلقوه عملکردهای دیگر ایزوله باشند و در امان بمانند.


در علوم دیگر :

اصل SOC نه تنها در علوم کامپیوتر، بلکه در بسیاری از علوم و فعالیت های دیگر نیز کاربرد دارد. برای مثال جدا کردن یک فضای کلی به اتاق های مختلف که فعالیت عده ای در یک اتاق مزاحم فعالیت عده ای در اتاق دیگر نشود یا جدا کردن مدار الکتریکی بخاری برقی و روشنایی به طوری که بتوان هر کدام را مستقل کنترل کرد و روشن و خاموش کردن یکی به دیگری ربطی نداشته باشد و همچنین بتوان لامپ روشنایی را با هر مدلی جایگزین کرد بدون آنکه فرقی به حال بخاری برقی داشته باشد.
مثال اتاق ها نمونه ای از کپسوله سازی است ، به طوری که اتفاقات درون اتاق برای اتاق های دیگر در دسترس نیست مگر از طریق رابط آن ، که همان درب آن است. به همین ترتیب در مثال مدارهای الکتریکی ، اتفاقات هر ماژول الکتریکی و مدار آن به ماژول های دیگر و مدارهای دیگر مربوط نیست.

منشا :
اصطلاح و لفظ SOC احتمالا توسط Edsger W. Dijkstra در مقاله او در سال ۱۹۷۴ درباره نقش اندیشه علمی ، ابداع شده است. SOC فقط مختص به رشته نرم افزار و برنامه نویسی نیست و در همه علوم کاربرد دارد به طور کلی SOC میگوید که اگر بخواهید مسئله ای را حل کنید باید از جنبه های مختلف به آن نگاه کنید و آن را بررسی کنید. شما نمیتوانید روی همه جنبه های مسئله به طور همزمان تمرکز کنید خصوصا که ممکن است هر کدام از آنها نیاز به تخصص خاصی داشته باشند . شما باید بر روی هر جنبه آن مسئله به طور خاص تمرکز کنید، آن را حل کنید و بعد سراغ جوانب دیگر بروید، حتی ممکن است لازم شود تا بررسی برخی از جوانب مسئله را به افراد دیگر بسپارید. این اصل در خیلی از علوم قرار دارد و به ویژه در علوم کامپیوتر راه پیدا کرده است.

۱۵ سال بعد بدیهی بود که ، SOC به یک ایده مورد قبول تبدیل شد. در سال ۱۹۸۹، کریس رید کتابی با عنوان «عناصر برنامه ریزی کاربردی» را نوشت، که تفکیک نگرانی ها را توصیف می کند.
برنامه نویس مجبور است در یک زمان چندین کار انجام دهد، یعنی :
1- توصیف آنچه که محاسبه می شود.
2- سازماندهی ترتیب محاسبات در مراحل کوچکتر.
3- سازماندهی مدیریت حافظه ، در زمان محاسبات.


تفکیک نگرانی ها در زمینه مدیریت پروژه و توسعه نرم افزار:

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

socseparation of concernsتفکیک نگرانی هانگرانیجداسازی نگرانی ها
برنامه نویس ، توسعه دهنده و تحلیلگر نرم افزار
شاید از این پست‌ها خوشتان بیاید