skills/fundamentals/oop-design-principles/SKILL.md
Apply core OOP design principles: Encapsulate What Varies, Program to an Interface, Favor Composition over Inheritance. Trigger: When designing extensible systems, refactoring brittle hierarchies, or evaluating coupling.
npx skillsauth add johnnystefan/test-saas-business fundamentals/oop-design-principlesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill provides the agent with three fundamental principles for high-quality software design: separating volatile code from stable code, reducing coupling through abstractions, and choosing flexible object relationships over rigid hierarchies.
getOrderTotal).TaxCalculator class).// BAD: Tax logic embedded directly — changes here break the whole order
class Order {
getTotal(items: Item[]): number {
const subtotal = items.reduce((sum, i) => sum + i.price, 0);
return subtotal * 1.21; // Tax hardcoded — what happens with different regions?
}
}
// GOOD: Tax logic isolated — swap TaxCalculator without touching Order
interface TaxCalculator {
calculate(subtotal: number): number;
}
class StandardTax implements TaxCalculator {
calculate(subtotal: number) {
return subtotal * 0.21;
}
}
class Order {
constructor(private tax: TaxCalculator) {}
getTotal(items: Item[]): number {
const subtotal = items.reduce((sum, i) => sum + i.price, 0);
return subtotal + this.tax.calculate(subtotal);
}
}
// BAD: Company depends on a concrete Designer
class Company {
private employee = new Designer();
createSoftware() {
this.employee.doWork();
}
}
// GOOD: Company depends on the Employee interface
interface Employee {
doWork(): void;
}
class Designer implements Employee {
doWork() {
/* ... */
}
}
class Developer implements Employee {
doWork() {
/* ... */
}
}
class Company {
constructor(private employees: Employee[]) {}
createSoftware() {
this.employees.forEach((e) => e.doWork());
}
}
// BAD: Class explosion — SportsCar, ElectricSportsCar, ElectricSUV...
class Car extends Vehicle {
/* ... */
}
class SportsCar extends Car {
/* ... */
}
class ElectricSportsCar extends SportsCar {
/* ... */
}
// GOOD: Compose behaviors independently
interface Engine {
start(): void;
}
class ElectricEngine implements Engine {
start() {
/* ... */
}
}
class GasEngine implements Engine {
start() {
/* ... */
}
}
class Car {
constructor(private engine: Engine) {}
start() {
this.engine.start();
}
}
tools
Zustand 5 state management patterns. Trigger: When implementing client-side state with Zustand (stores, selectors, persist middleware, slices).
databases
Zod 4 schema validation patterns. Trigger: When creating or updating Zod v4 schemas for validation/parsing (forms, request payloads, adapters), including v3 -> v4 migration patterns.
development
Vitest unit testing patterns with React Testing Library. Trigger: When writing unit tests for React components, hooks, or utilities.
tools
Vite 8 (Rolldown-powered) build tool configuration, plugin API, SSR, and migration guide. Trigger: When working with vite.config.ts, Vite plugins, building libraries, or SSR apps with Vite.