October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsWindows FixRecommendedWindows errors stealing your time? Find the fix fastScan stability, cleanup and performance issues.Fix NowOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
World desk6 min

I’m Exploring Low-Level Design, and SOLID Is Changing How I Look at Code

SOLID shifts low-level design from naming classes to assigning responsibilities, managing change, preserving substitutability, and directing dependencies with purpose.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What are the SOLID principles in low-level design? They are five object-oriented design principles that help you decide how to divide responsibilities, handle change, preserve behavior, scope interfaces, and direct dependencies. Their value is not in creating more classes; it is in making the consequences of a design easier to reason about as code evolves.

That shifts the starting question from “Which class should I create?” to “What is changing, who owns that behavior, and what should its collaborators be allowed to rely on?”

As an Amazon Associate I earn from qualifying purchases.

What SOLID changes about low-level design

Low-level design is often treated as a naming exercise: identify nouns, turn them into classes, and connect the classes. Responsibility-driven design asks a more useful set of questions: what should each object do, and which collaborators does it need? The goal is to distribute responsibilities so related behavior stays together without making one object responsible for unrelated work. A University of Bern lecture presents design methods as guidelines, not fixed rules, and places SOLID within object-oriented design: University of Bern lecture materials.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

SOLID names five pressures to consider when choosing those boundaries. It is most useful when a system changes over time, different groups drive different changes, or dependencies need to be substituted for testing. It is not a checklist that every small class must visibly satisfy.

What the five SOLID principles mean

Single Responsibility: group behavior around a coherent reason to change

Single Responsibility (SRP) is commonly summarized as: “A module should have one, and only one, reason to change.” — Robert C. Martin, as quoted by the SE Book. The important word is not “one” in isolation, but “reason.” A class with many methods can still have one coherent responsibility; a class with only a few methods can mix unrelated concerns.

Consider an order workflow that validates a purchase, calculates its total, saves it, and sends a receipt. If tax rules change for one business reason while receipt formatting changes for another, putting both concerns in a single workflow object can make unrelated changes collide. SRP asks whether those changes come from distinct actors or needs, and whether the behavior belongs together—not whether every operation deserves its own class.

Open/Closed: make likely variation possible without repeatedly rewriting stable policy

Open/Closed (OCP) is phrased as: “Software entities should be open for extension, but closed for modification.” — Robert C. Martin, as attributed by Design Principles. In practice, this means identifying a real variation point and giving new behavior a place to fit, rather than adding conditionals throughout stable code every time a new case appears.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Sale
Game Programming Patterns
  • Brand New in box. The product ships with all relevant accessories

For example, if an order workflow will support different receipt-delivery methods, a focused delivery abstraction may let another method be introduced without rewriting purchase validation. OCP does not mean code can never be changed; it means avoid making likely extensions depend on risky edits to policy that is already stable.

Liskov Substitution: preserve what callers expect

Liskov Substitution (LSP) concerns whether one implementation can stand in for another without breaking the correctness callers rely on. Martin’s attributed formulation is: “Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.” — Design Principles.

A type relationship is not sound merely because one class inherits from another. If a caller expects a storage implementation to save an order and retrieve it under the documented conditions, an alternate implementation must preserve those expectations. A subtype that silently rejects valid inputs, changes the meaning of a successful result, or requires callers to know special rules is not a safe substitute.

Interface Segregation: expose only what a client needs

Interface Segregation (ISP) says clients should not be forced to depend on operations they do not use. Martin’s attributed shorthand is: “Many client-specific interfaces are better than one general-purpose interface.” — Design Principles.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

If an order workflow only needs to save an order, it should not need to depend on a broad storage interface that also exposes unrelated administrative operations. Narrow interfaces make the dependency clearer and reduce the chance that a change to an unused operation ripples into clients that do not need it. The principle is not “make every interface tiny”; the interface should fit a meaningful client responsibility.

Dependency Inversion: keep policy from depending directly on infrastructure

Dependency Inversion (DIP) directs dependencies toward abstractions rather than making core policy depend on concrete low-level details. Martin’s attributed summary is: “One should depend upon abstractions, rather than concrete implementations.” — Design Principles.

In the order example, the workflow can depend on a small persistence contract instead of constructing a particular database adapter itself. The database implementation then fulfills that contract. This separates business policy from storage mechanics and can make substitution for testing possible where that is useful. An abstraction does add indirection, so it should earn its place through a real change, substitution, or testing need.

How to apply SOLID to an order workflow

Use the principles as questions about design pressure, not as a sequence of mandatory refactors. A modest order workflow illustrates how the questions connect:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  1. Map the behavior. List the work involved: validate the purchase, calculate the total, save the order, and send a receipt. Keep this as a behavior map, not an automatic class list.
  2. Find distinct reasons for change. Ask which business needs or actors could request changes to those behaviors. If receipt formatting and purchase validation change for unrelated reasons, consider whether they belong in separate responsibilities (SRP).
  3. Choose a clear owner for each behavior. Keep related rules together, and give each object only the collaborators needed to perform its responsibility. This is responsibility-driven design: objects do work and collaborate rather than serving only as labeled data containers.
  4. Identify likely variation before adding extension points. If a genuinely expected new delivery method would otherwise require edits to stable workflow policy, define a focused way to supply that behavior (OCP). Do not build a framework for hypothetical variants without a reason.
  5. Define client-sized contracts. Give the workflow only the persistence or delivery operations it actually uses (ISP). Check that every implementation of a contract honors the behavior its callers expect (LSP).
  6. Point policy at the contract, not the adapter. Let the workflow depend on the relevant abstraction and provide a concrete storage or delivery implementation at an appropriate boundary (DIP). Keep this indirection only if the flexibility or test seam is valuable.

These choices reinforce one another, but they are not interchangeable. SRP helps decide whether responsibilities belong together; ISP limits what a client sees; DIP controls the direction of dependency; LSP protects behavior when implementations vary; and OCP helps contain the cost of likely extensions.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

How to compare two plausible designs

When deciding whether a design boundary is helping, compare it with the simpler alternative against the pressures that actually matter:

  • Responsibility and cohesion: do related changes land together, or do unrelated actors repeatedly edit the same module?
  • Change cost: can a likely new behavior fit at a clear extension point, or does it require risky edits through stable policy?
  • Substitutability: can callers use another implementation without hidden preconditions or surprising changes in behavior?
  • Interface scope: does each client depend only on the operations it needs?
  • Dependency direction and testability: does high-level policy rely directly on infrastructure, and is substituting that infrastructure useful for the design or its tests?
  • Abstraction cost: is the extra interface or collaborator addressing a real source of change, or only a speculative future?

When SOLID adds more structure than value

SOLID can make code less simple if applied mechanically. The SE Book cautions that the principles can harm simplicity in throwaway code or where only one implementation is expected. A disposable prototype, a one-off script, or a simple value object may not benefit from extra interfaces and collaborators.

Use the smallest design that keeps the current behavior understandable and makes credible changes manageable. Introduce an abstraction when a real variation, dependency boundary, or testing need justifies it; avoid adding one solely to demonstrate a principle. A single implementation is not automatically a reason to reject an interface, but absent a meaningful change or substitution need, the indirection may be unnecessary.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Quick Recap

SaleBestseller No. 1
SaleBestseller No. 2
Game Programming Patterns
Game Programming Patterns
Brand New in box. The product ships with all relevant accessories
$24.95

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Crashes, No Sound, or Screen Glitches?Free driver scan
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.