تفکیک دغدغه‌ها

در علوم رایانه، **تفکیک دغدغه‌ها** یا **جداسازی نگرانی‌ها** (Separation of concerns) یک قاعده‌ی طراحی با روش تفکیک برنامه به بخش‌های متمایز است، به گونه‌ای که عملکرد هر بخش، یک دغدغه‌ی متمایز را پاسخ می‌دهد. دغدغه، مجموعه اطلاعاتی است که کد یک برنامه‌ی کامپیوتری را تحت تأثیر قرار می‌دهد. این دغدغه ممکن است خیلی کلّی باشد مثلاً جزئیات سخت افزاری که کد برنامه را برای اجرا روی آن بهینه می‌کنیم، یا دغدغه ممکن است خیلی مشخص و جزئی باشد مثلاً نام کلاسی که از آن اشیاء ساخته می‌شوند. برنامه‌ای که تفکیک دغدغه‌ها را به کار می‌گیرد، برنامه‌ی پودمانی یا قطعه‌ای (Modular) می‌گویند. قطعه‌بندی یا پودمان (Modularity)، و در نتیجهٔ آن، تفکیک دغدغه‌ها از طریق کپسوله‌سازی یا بسته‌بندی (encapsulation) اطلاعات در بخشی از کد که دارای یک رابط (interface) مناسب می‌باشد، حاصل می‌شود. کپسوله‌سازی یک روش نهان‌سازی یا اخفا اطلاعات است . طراحی لایه‌ای (layered design) در سامانه‌های اطلاعاتی، نمونه‌ی دیگری از به کارگیری تفکیک دغدغه‌هاست(مثلاً لایه‌ی نمایش یا ارائه (presentation layer) یا لایه‌ی منطق کار (business logic layer) و لایه‌ی دسترسی به داده (data access layer)، لایه‌ی تداوم اطلاعات (persistence layer)

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

## پیاده‌سازی
ساز و کار برنامه‌نویسی شی‌گرا یا برنامه‌نویسی پودمانی که یک زبان برنامه‌نویسی امکانش را فراهم می‌آورد، ساز و کارهایی هستند که به توسعه‌دهندگان، اجازهٔ برقراری تفکیک دغدغه‌ها را می‌دهند. برای مثال زبان‌های برنامه‌نویسی شئ گرا مانند سی‌شارپ یا سی‌پلاس‌پلاس یا دلفی، و جاوا می‌توانند دغدغه‌ها را به اشیاء تفکیک و تقسیم کنند و الگوهای طراحی معماری مانند MVC و MVP امکان تفکیک محتوا و نحوهٔ نمایش محتوا و همینطور تفکیک نحوهٔ نمایش محتوا از پردازش داده(مدل) را فراهم می‌آورند. طراحی مبتنی بر سرویس امکان جداسازی دغدغه‌ها به سرویس‌ها را فراهم می‌کند. برنامه‌نویسی رویه‌ای مانند زبان سی و پاسکال امکان تفکیک دغدغه‌ها به رویه‌ها یا توابع را فراهم می‌آورد. برنامه‌نویسی جنبه‌گرا، امکان تفکیک دغدغه‌ها به جنبه‌ها و اشیاء را فراهم می‌کند.

تفکیک دغدغه‌ها یک قاعدهٔ طراحی مهم در سایر حوزه‌ها مانند معماری و طراحی اطلاعات و نیز برنامه‌ریزی شهری به حساب می‌آید. هدف از تفکیک دغدغه‌ها، فهم بهتر طراحی و مدیریت سامانه‌های مسقل و پیچیده است تا عملکردها بدون وابستگی به عملکردهای دیگر ، قابل استفادهٔ مجدد و قابل بهینه‌سازی باشند.

از مثال‌های رایج می‌توان به تفکیک فضای خانه به اتاق‌هایی به منظور جلوگیری از تداخل و تأثیر فعالیت‌هایی که در یک اتاق انجام می‌شود بر قسمت‌های دیگر خانه، اشاره کرد. این مثال، بر ویژگی کپسوله‌سازی تأکید می‌کند، که در آن اطلاعات یک اتاق مثلاً بهم ریختگی اتاق، از چشم اتاق‌های دیگر پنهان است و فقط از طریق رابط(interface) که همان در آن اتاق است می‌توان به این اطلاعات دست یافت.

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

## مثال‌ها

### پشتهٔ پروتوکل اینترنت
تفکیک دغدغه‌ها یکی از اساسی‌ترین مفاهیم در طراحی اینترنت می‌باشد. در مجموعهٔ پروتوکل اینترنت، تلاش‌های فراوانی در جهت تفکیک دغدغه‌ها به لایه‌های مختلف شده‌است. این موجب می‌شود تا طراحان پروتوکل‌ها فارغ از لایه‌های دیگر، بر روی دغدغه‌های مربوط به یک لایه، تمرکز کنند. به عنوان مثال SMTP که یک پروتوکل لایهٔ اپلیکیشن می‌باشد، درگیر تمام جزئیات مربوط به چگونگی ایجاد یک فرایند مربوط به ارسال رایانامه از طریق سرویس انتقال داده( معمولاً TCP) است، اما به هیچ وجه درگیر اینکه سرویس انتقال داده به چه نحو امنیت در ارسال را بر قرار می‌کند، نیست. به‌طور مشابه، TCP هم درگیر نحوهٔ مسیریابی پکت‌های داده‌ای، که در لایهٔ اینترنت انجام می‌گیرد، نیست.

### اچ‌تی‌ام‌ال و سی‌اس‌اس و جاوااسکریپت
زنگام(HTML)، شیوه‌نامهٔ آبشاری(CSS) و جاوااسکریپت(JS) زبان‌های مکمل یکدیگر هستند، که در توسعهٔ تارنما مورد استفاده قرار می‌گیرند. زنگام برای ساختاردهی و سازماندهی محتوای صفحه وب، سی‌اس‌اس به منظور مشخص کردن سبک و شیوهٔ ارائه محتوا و جاوااسکریپت به منظور تعریف چگونگی رفتار و اثر متقابل محتوا و کاربر، مورد استفاده قرار می‌گیرند. پیش از اینکه سی‌اس‌اس به وجود بیاید، اچ‌تی‌ام‌ال هر دو دغدغه و وظیفهٔ تعریف محتوا و آرایش آن را بر عهده داشت.

### برنامه‌نویسی جنبه‌گرا
برنامه‌نویسی جنبه‌گرا، دغدغه‌های مشترک‌الحوزه (cross-cutting) را به عنوان دغدغه‌های ثانوی ارائه می‌کند. مثلاً بسیاری از برنامه‌ها نیاز به شکلی از امنیت(security) و لاگینگ(logging) دارند. امنیت و لاگینگ معمولاً دغدغه‌های ثانوی محسوب می‌شوند، در حالی که دغدغه‌های اصلی معمولاً مربوط به اهداف کاری(business goals) هستند. اما وقتی که یک برنامه طراحی می‌شود، می‌بایست امنیت آن از ابتدای کار در طراحی در نظر گرفته و پیاده شود، و همانند یک دغدغهٔ ثانوی با آن برخورد نشود. اِعمال امنیت در مراحل پایانی، معمولاً موجب ایجاد مدل‌های امنیتی ناکار آمد می‌شود که برنامه را در مقابل حملات احتمالی آینده آسیب‌پذیر می‌کند.

### تفکیک دغدغه‌ها از طریق کلاس‌های تکه تکه(Partial Classes)
تفکیک دغدغه‌ها را می‌توان با استفاده از کلاس‌های تکه‌تکه پیاده‌سازی و اِعمال کرد.

#### تفکیک دغدغه‌ها از طریق کلاس‌های تکه‌تکه در زبان Ruby
; bear_hunting.rb
```ruby
class Bear
  def hunt
    # TODO: return some food
  end
end
```

; bear_eating.rb

```ruby
class Bear
   def eat( food )
     raise "#{food} is not edible!" unless food.respond_to? :nutrition_value
     food.nutrition_value
   end
 end
```

; bear_hunger.rb

```ruby
class Bear
  attr_accessor :hunger
  def monitor_hunger
    if @hunger> 50 then
      @hunger -= self.eat( self.hunt )
    end
  end
end
```


## پانویس

رده:ادسخر دیکسترا
رده:اصول برنامه‌نویسی
رده:برنامه‌نویسی
رده:تقلیل‌گرایی
رده:ویکی‌سازی رباتیک