Separation of concerns
Separation of concerns is a design principle that organizes a system so distinct responsibilities are handled by separate, independently manageable parts.
Practices of the Python Pro
A software design technique that organizes a system so each part addresses a distinct concern and dissimilar concerns remain isolated.
- How it is used
- Uses separation to make Python code understandable, maintainable, extensible, and easier to change precisely.
- How deep it goes
- Explains boundaries from functions through packages and application layers, then applies them to refactoring examples and interfaces.
- Examples
- Demonstrates name formatting, Rock Paper Scissors, layered bookmarks, response formatting, and query cleaning.
- What you can do after
- Apply separation by extracting focused functions, organizing modules, layering applications, and exposing simpler interfaces.
Read how Practices of the Python Pro explains separation of concerns →
A Pythonic Adventure: From Python basics to a working web app
Separation of concerns is a software design principle that divides a system into components with distinct responsibilities.
- How it is used
- Separates order retrieval from web-page display so each part can change independently.
- How deep it goes
- Demonstrates the principle through database retrieval, route handling, and a template loop without exploring broader design theory.
- Examples
- Uses an order database, get_orders(), list(), and list.html to display customer orders.
- What you can do after
- Apply it by changing order retrieval without changing the template that displays returned orders.
C++ Concurrency in Action, Second Edition
Separation of concerns is a software design principle that organizes a system so distinct concerns are handled independently.
- How it is used
- Uses task-specific threads to keep simultaneous responsibilities separate without manually interleaving their control flow.
- How deep it goes
- Explains task-based thread division and illustrates message-driven state changes, without giving a general procedure for assigning responsibilities.
- Examples
- Illustrates the principle with DVD playback and user input, then an ATM divided among machinery, logic, and bank communication.
- What you can do after
- Practice/perform it by assigning distinct tasks to threads and identifying where they must exchange messages or events.
Read how C++ Concurrency in Action, Second Edition explains separation of concerns →
Machine Learning Platform Engineering
Separation of concerns is a software design principle that isolates distinct responsibilities into separate components or layers.
- How it is used
- Separates RAG processing from chat interfaces so one core can serve web, API, and batch contexts.
- How deep it goes
- Works through core extraction, async initialization, query methods, and Chainlit integration.
- Examples
- Uses a reusable RAG class and Chainlit startup and message handlers.
- What you can do after
- Build it from scratch by extracting RAG logic into a reusable core and connecting it to a Chainlit interface.
Read how Machine Learning Platform Engineering explains separation of concerns →
Coding with AI
Separation of concerns is a design principle that assigns distinct responsibilities to separate software components so they do not overlap unnecessarily.
- How it is used
- Guides AI-assisted web application architecture by keeping database, session, retrieval, and interface responsibilities distinct.
- How deep it goes
- Demonstrates responsibility boundaries through database connection and question-retrieval classes, without a broader theoretical treatment.
- Examples
- Uses a SQLite DatabaseConnection class, a cursor-injected Questions class, and separate session creation, question retrieval, and interface units.
- What you can do after
- Evaluate/understand whether generated web-application code assigns database and application responsibilities to separate, testable units.
Build Python Web Apps with Streamlit
Separation of concerns is a software design principle in which distinct components focus on distinct responsibilities and interact through controlled interfaces.
- How it is used
- Guides app organization by separating frontend, backend, configuration, and service responsibilities behind explicit contracts.
- How deep it goes
- Defines the principle, illustrates its contract boundary, and applies it through backend functions and focused service classes.
- Examples
- Uses a restaurant menu, a unit-conversion backend, and UserService, HaikuService, and LimerickService examples.
- What you can do after
- Build modular applications that extend and maintain frontend, backend, and domain actions independently.
Read how Build Python Web Apps with Streamlit explains separation of concerns →
ASP.NET Core in Action, 3e
Separation of concerns is a design principle that isolates distinct aspects of an application so each can change with minimal impact on the others.
- How it is used
- Organizes Razor Pages and MVC applications by separating request handling, business logic, and HTML generation.
- How deep it goes
- Explains component responsibilities, coupling risks, and service delegation through a complete request, but does not detail implementation code.
- Examples
- Uses a filtered to-do list and a complete Razor Pages request from URL routing through HTML response.
- What you can do after
- Apply it via ASP.NET Core Razor Pages by assigning validation, business logic, and presentation to separate components.
Read how ASP.NET Core in Action, 3e explains separation of concerns →
Akka in Action, Second Edition
Separation of concerns is the division of software into parts whose responsibilities are distinct and independently manageable.
- How it is used
- Separates normal actor message processing from fault-recovery decisions in a fault-tolerant application.
- How deep it goes
- Contrasts tangled direct-call exception handling with actor supervision, then defers lifecycle and supervision-strategy coding details.
- Examples
- Uses a FileWatcher–LogProcessor–Writer–database pipeline and a supervisor wrapping actor behavior.
- What you can do after
- Apply it via actor supervision by isolating recovery actions from normal message-processing behavior.
Read how Akka in Action, Second Edition explains separation of concerns →
The Art of Code
Separation of concerns is a design technique that divides software into parts responsible for distinct concerns so that each can change more independently.
- How it is used
- Organizes responsibilities and dependencies so software can absorb change without excessive ripple effects.
- How deep it goes
- Explains architectural and class-level application through coupling, cohesion, boundaries, contracts, and automated tests.
- Examples
- Uses mixed OrderTools responsibilities, separated pricing and notification services, layered architectures, and public API contracts.
- What you can do after
- Evaluate designs by locating responsibilities, reducing unnecessary dependencies, protecting domain rules, and testing public contracts.
Functional Design and Architecture: Examples in Haskell
Separation of concerns is a design principle that isolates distinct responsibilities so they can be understood and changed independently.
- How it is used
- Uses interfaces and declarative boundaries to isolate application subsystems and make business logic testable.
- How deep it goes
- Descends from subsystem boundaries to interface rules, mocks, test independence, and hidden-effect risks.
- Examples
- Uses sensor-reporting scripts, labyrinth generation, mock implementations, and independent Hspec tests.
- What you can do after
- Diagnose testability problems and apply interfaces, mocks, and controlled effects to isolate business logic.
Read how Functional Design and Architecture: Examples in Haskell explains separation of concerns →
Building Web APIs with ASP.NET Core
Separation of concerns is a design principle that partitions a system so distinct responsibilities are handled independently.
- How it is used
- Uses client-server architecture to separate user-interface concerns from data-storage concerns in RESTful web APIs.
- How deep it goes
- Defines the principle and its benefits, then applies it conceptually to REST without developing a detailed implementation.
- Examples
- Uses browsers, web applications, user interfaces, and data storage to illustrate separated client and server responsibilities.
- What you can do after
- Evaluate whether a REST API keeps client-interface responsibilities independent from server-side data responsibilities.
Read how Building Web APIs with ASP.NET Core explains separation of concerns →
Build AI-Enhanced Web Apps
Separation of concerns is a software design principle that divides a system into parts with distinct responsibilities.
- How it is used
- Structures AI-enabled web applications by separating feature intent, implementation actions, UI rendering, and state logic.
- How deep it goes
- Explains responsibilities, intent-action mapping, abstractions, and React extraction patterns, but stops short of detailed interface code.
- Examples
- Uses generateText and chatCompletion, plus ChatList and useChatFormSubmit, to demonstrate architectural and React-level separation.
- What you can do after
- Apply it via React custom hooks and abstractions to isolate AI logic, simplify state flow, and improve maintainability and testability.
Read how Build AI-Enhanced Web Apps explains separation of concerns →
Build and Orchestrator in Go (From Scratch)
Separation of concerns is a software design principle that assigns distinct responsibilities to separate components or modules.
- How it is used
- Separates request handling and administration from task execution so each responsibility remains easier to change and reason about.
- How deep it goes
- Defines the principle through component boundaries and operational responsibilities, but does not descend into formal design rules or implementation internals.
- Examples
- Uses a Go worker API, task queues, curl requests, container lifecycle logs, and a control-plane/data-plane analogy.
- What you can do after
- Apply it by assigning request, administrative, and execution responsibilities to distinct components with explicit interactions.
Read how Build and Orchestrator in Go (From Scratch) explains separation of concerns →
AI Agents in Action, Second Edition
Separation of concerns is a software design technique that isolates distinct responsibilities so they can be developed and changed independently.
- How it is used
- Structures agent tools, deployment components, and research workflows so responsibilities communicate through explicit boundaries.
- How deep it goes
- Explains interfaces, private implementations, deployment patterns, and workflow responsibilities, but stops short of general design heuristics beyond these cases.
- Examples
- Uses journal tools behind MCP, containerized agent deployment patterns, and separate research and synthesis agents.
- What you can do after
- Apply it via MCP servers, service boundaries, and separate agent roles to support replacement, scaling, and focused execution.
Read how AI Agents in Action, Second Edition explains separation of concerns →
The Creative Programmer
Separation of concerns is the organization of a system so that distinct responsibilities or decision criteria remain independently managed.
- How it is used
- Applies a software design principle to organizing notes, stages, filters, and related ideas.
- How deep it goes
- Defines the principle through focused notes and workflow stages, but stops short of programming implementation details.
- Examples
- Uses single-idea Zettels, linked filing systems, digital note tools, and separated capture-to-publication stages.
- What you can do after
- Apply it by splitting ideas and workflow stages into focused units, then linking or recombining them when useful.
Read how The Creative Programmer explains separation of concerns →
Authorization in Action
Separation of concerns is a design principle that divides a system into parts with distinct responsibilities and limited overlap.
- How it is used
- Structures authorization so enforcement, policy evaluation, policy management, and contextual data remain independently managed.
- How deep it goes
- Defines four architectural components and their benefits, while stopping short of prescribing one implementation.
- Examples
- Uses Alice’s ACMEProject request, Carol’s policy update, Team Reports access, and identity, time, and network context.
- What you can do after
- Operate authorization as independently reviewable, consistently enforced, auditable policy rather than duplicated application logic.
Read how Authorization in Action explains separation of concerns →
React Quickly, Second Edition
Separation of concerns is a design principle that isolates distinct responsibilities so each part of a system handles a focused concern.
- How it is used
- Organizes interactive React UIs by grouping related structure and behavior into reusable components.
- How deep it goes
- Defines focused responsibilities, contrasts template splitting, and traces three timer state layers without deeper implementation detail.
- Examples
- Uses JSX headings, reusable form controls, autocomplete components, and a timer application with independent component responsibilities.
- What you can do after
- Build reusable React UI components with focused responsibilities and callback-based interfaces.
Read how React Quickly, Second Edition explains separation of concerns →
Elixir in Action, Third Edition
Separation of concerns is a design technique that divides a system into components with distinct responsibilities.
- How it is used
- Organizes systems by extracting reusable responsibilities and keeping interfaces separate from domain operations.
- How deep it goes
- Demonstrates the technique through Elixir modules, composition, request handling, and practical benefits for testing and expansion.
- Examples
- Uses MultiDict and TodoList abstractions plus add_entry and entries HTTP requests backed by Todo.Server.
- What you can do after
- Apply it via Elixir modules and Plug handlers to isolate reusable data behavior, domain logic, and HTTP concerns.
Read how Elixir in Action, Third Edition explains separation of concerns →
Learn Go with Pocket-Sized Projects
Separation of concerns is a design principle that assigns distinct responsibilities to separate software components.
- How it is used
- Uses responsibility boundaries to keep service logic, external dependencies, storage, and API details maintainable.
- How deep it goes
- Explains boundaries, contracts, replacements, and tradeoffs through money conversion and service-package examples.
- Examples
- Uses an exchange-rate API, stubs, caches, an in-memory repository, and separated Gordle session and game packages.
- What you can do after
- Apply it by replacing dependencies, locating logic predictably, and testing evolving components independently.
Read how Learn Go with Pocket-Sized Projects explains separation of concerns →
Tiny CSS Projects
Separation of concerns is a software design principle that divides a system into distinct sections with separate purposes.
- How it is used
- Organizes web development by assigning content, presentation, and functionality to HTML, CSS, and JavaScript.
- How deep it goes
- Explains the principle, benefits, and external-versus-inline CSS trade-offs without descending into detailed architecture or testing procedures.
- Examples
- Uses a crimson heading, repeated paragraph styling, an external stylesheet link, and a diagram of web-page responsibilities.
- What you can do after
- Apply it via external stylesheets to reduce repetition and maintain consistent presentation across HTML pages.
Read how Tiny CSS Projects explains separation of concerns →
Rust Servers, Services, and Apps
Separation of responsibilities is a design principle that assigns distinct concerns to different software components.
- How it is used
- Assigns authentication, sessions, business rules, and data access to separate frontend and backend components.
- How deep it goes
- Explains component boundaries through a registration workflow but stops short of detailing broader decomposition strategies.
- Examples
- Uses tutor registration, browser validation, Actix routes, a Tera template, and a trusted backend deployment boundary.
- What you can do after
- Apply the principle by dividing a registration system between frontend interaction and backend rules and persistence.
Read how Rust Servers, Services, and Apps explains separation of concerns →
Python Concurrency with asyncio
Separation of concerns is a design technique that gives distinct responsibilities to separate components or computations.
- How it is used
- Separates subprocess standard-output reading from standard-input writing so increasingly complex asynchronous I/O remains readable and maintainable.
- How deep it goes
- Defines the split, assigns one responsibility to each coroutine, coordinates them with an event, and runs them concurrently with gather.
- Examples
- Uses interactive echo programs, including randomized repeated output and prompt-driven input, to expose coupling and motivate separate coroutines.
- What you can do after
- Apply it via asyncio by coordinating output consumption and input writing with an Event and gather.
Read how Python Concurrency with asyncio explains separation of concerns →
Related concepts
- concernuses · A concern is a distinct responsibility, requirement, or aspect of behavior that a software system must address.
- single responsibility principleimplements · The single responsibility principle is a software design principle that gives a component one focused responsibility and one primary reason to change.
These guides are generated from the text of Manning books by Manning's knowledge graph and link to the sections they draw on. The full books are available on liveBook and at manning.com.





















