Според мен това е design принцип, много подобен на Inversion of Control, но в по-общ смисъл. Демек, IoC е по-конкретен само за OOP, SoC e по-общ…
Принцип при който чрез разделяне на функционалността на дадена програма по такъв начин, че отделните и компоненти (класове, пакети, библиотеки…) да са както максимално концентрирани само върху своите задачи и предназначения (single responsibility) и да имат максимално тясна специализация.
„In computer science, separation of concerns (SoC) is a design principle for separating a computer program into distinct sections such that each section addresses a separate concern.“
Въпросното „разделяне на задачи“ може да е на различен принцип. Това може да са задачи свързани само с визуалната част на дадената програма, както например HTML и CSS си разделят отговорностите, едното за структурата и семантиката, а другото – за чисто визуалната част на дадената страница. Затова в началото казахме, че „SoC e по-общ“.
Може да е чисто backend разделяне на програмата – един клас да отговаря за валидациите, друг за работа с базата данни…
Или още по-генерално как да се структурира програмата. MVC например е типичен пример за SoC – програмата е разделена на бизнес модел, презентационна част и т.н…