liveBook · Manning

Separation of concerns

Separation of concerns is a design principle that organizes a system so distinct responsibilities are handled by separate, independently manageable parts.

How 22 Manning books explain it

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.

Read how A Pythonic Adventure: From Python basics to a working web app explains separation of concerns →

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.

Read how Coding with AI explains separation of concerns →

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.

Read how The Art of Code explains separation of concerns →

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

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.