در علوم رایانه، **تفکیک دغدغه‌ها** یا **جداسازی نگرانی‌ها** (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
```
class Bear
 def hunt
 # TODO: return some food
 end
end

```

bear\_eating.rb

```
 class Bear
 def eat( food )
 raise "#{food} is not edible!" unless food.respond\_to? :nutrition\_value
 food.nutrition\_value
 end
 end

```

bear\_hunger.rb

```
class Bear
 attr\_accessor :hunger
 def monitor\_hunger
 if @hunger> 50 then
 @hunger -= self.eat( self.hunt )
 end
 end
end

```

پانویس
------

1. ↑


| * ن
* ب
* و
ادسخر دیکسترا |
| --- |
| ادسخر دیکسترا | 
* *A Primer of ALGOL 60 Programming* (book)
* *Structured Programming* (book)
* *A Discipline of Programming* (book)
* *A Method of Programming* (book)
* *Predicate Calculus and Program Semantics* (book)
* *Selected Writings on Computing: A Personal Perspective* (book)
* ادسخر دیکسترا
* ادسخر دیکسترا
* *A Note on Two Problems in Connexion with Graphs*
* *Cooperating Sequential Processes*
* *Solution of a Problem in Concurrent Programming Control*
* *The Structure of the 'THE'-Multiprogramming System*
* *Goto*
* *Notes on Structured Programming*
* *The Humble Programmer*
* *Programming Considered as a Human Activity*
* *How Do We Tell Truths That Might Hurt?*
* *On the Role of Scientific Thought*
* *Self-stabilizing Systems in Spite of Distributed Control*
* *On the Cruelty of Really Teaching Computer Science*

 |
| علوم رایانه | 
* علوم نظری رایانه
* مهندسی نرم‌افزار
* علوم سامانه‌ها
* الگوریتم
* رایانش همزمان
* رایانش توزیع‌شده
* روش‌های صوری
* فرایند توسعه نرم‌افزار
* نظریه زبان‌های برنامه‌نویسی
* طراحی نرم‌افزار and توسعه نرم‌افزار
* معماری نرم‌افزار
* فلسفه علوم رایانه

 |
| ادسخر دیکسترا | 

|  |  |
| --- | --- |
| ادسخر دیکسترا | 
* الگول ۶۰ implementation
* پشته فراخوانی
* هم‌روندی
* رایانش همزمان
* Cooperating sequential processes
* بخش بحرانی
* بن‌بست (علوم رایانه) (بن‌بست (علوم رایانه))
* مسئله غذا خوردن فیلسوف‌ها
* Dutch national flag problem
* تاب‌آوری خطا
* برنامه‌نویسی ساخت‌یافته
* Guarded Command Language
* لایه انتزاع in معماری نرم‌افزار
* لایه انتزاع
* ریسه (رایانه)
* انحصار متقابل (قفل (رایانه))
* مسئله تولیدکننده-مصرف‌کننده (مسئله تولیدکننده-مصرف‌کننده)
* خط تولید نرم افزار
* Predicate transformer semantics
* همگام‌سازی (علوم رایانه)
* Self-stabilizing distributed system
* نشان‌بر
* تفکیک دغدغه‌ها
* مسئله آرایشگر خواب‌آلود
* Software crisis
* تحلیل ساختمند
* برنامه‌نویسی ساخت‌یافته
* THE multiprogramming system
* Unbounded nondeterminism
* Weakest precondition calculus

 |
| ادسخر دیکسترا | 
* الگوریتم بانکدار
* الگوریتم دکسترا
* الگوریتم پریم (الگوریتم پریم)
* الگوریتم دایکسترا – شولتن
* الگوریتم دکر (generalization)
* مرتب‌سازی روان
* الگوریتم محوطه تعویض خط
* Tri-color marking algorithm
* رایانش همزمان
* Distributed algorithms
* الگوریتم‌های جلوگیری از بن‌بست
* انحصار متقابل
* Self-stabilizing algorithms

 |

 |
| Related people | 
* Shlomi Dolev
* پر برینچ هنسن
* تونی هور
* اوله-یوهان دال
* لزلی لمپورت
* دیوید پارناس
* Adriaan van Wijngaarden
* نیکلاوس ویرت

 |
| Other topics | 
* Dijkstra Prize (Edsger W. Dijkstra Prize in Distributed Computing)
* Centrum Wiskunde & Informatica
* E.W. Dijkstra Archive (دانشگاه تگزاس در آستین)
* List of pioneers in computer science
* List of important publications in computer science
* List of important publications in theoretical computer science
* List of important publications in concurrent, parallel, and distributed computing
* International Symposium on Stabilization, Safety, and Security of Distributed Systems

 |
| 
* **Wikiquote**

 |