AgentSkillsCN

principles

在代码设计中践行 SOLID、KISS、DRY、YAGNI 等原则。无论是从零开始构建新功能,还是在做出设计决策时,亦或是审查代码是否存在违背原则的问题,都可加以运用。

SKILL.md
--- frontmatter
name: principles
description: Apply SOLID, KISS, DRY, YAGNI principles to code design. Use when building new features from scratch, making design decisions, or reviewing code for principle violations.

Applicability Rubric

ConditionPassFail
New feature from scratchBuilding without existing referenceModifying existing code
Design decision neededChoosing between approachesImplementation is clear
Code quality reviewEvaluating design qualityNo review needed
No existing patternsNo codebase conventions applyCan follow existing code

Apply when: Any condition passes

Core Principles

SOLID

PrincipleDescriptionViolation Sign
Single ResponsibilityOne reason to changeClass does too many things
Open/ClosedOpen for extension, closed for modificationFrequent changes to existing code
Liskov SubstitutionSubtypes must be substitutableType checks or conditional logic on types
Interface SegregationMany specific interfaces over one generalClients implement unused methods
Dependency InversionDepend on abstractions, not concretionsDirect instantiation of dependencies

KISS (Keep It Simple, Stupid)

  • Prefer straightforward solutions
  • Avoid unnecessary complexity
  • Write code that's easy to understand
  • If it's hard to explain, it's too complex

DRY (Don't Repeat Yourself)

  • Extract repeated logic into functions
  • BUT: Premature abstraction is worse than duplication
  • Rule of three: Abstract after third repetition
  • Accept some duplication for clarity

YAGNI (You Aren't Gonna Need It)

  • Don't build features until needed
  • Avoid speculative generality
  • Solve today's problem, not tomorrow's

Completion Rubric

Single Responsibility

CriterionPassFail
Clear purposeOne responsibility per class/functionMultiple unrelated responsibilities
DescribableCan describe in one sentenceNeeds paragraph to explain
Change isolationChanges for only one reasonChanges for multiple reasons

Open/Closed

CriterionPassFail
Extension over modificationNew behavior via extensionModifying existing code
Abstraction usageVariation points use abstractionsHardcoded variations
Core stabilityCore logic unchangedCore frequently modified

Liskov Substitution

CriterionPassFail
Contract adherenceSubtypes honor base contractsSubtypes break expectations
No type checkingClient uses base type onlyinstanceof/type checks in client
Precondition consistencyPreconditions not strengthenedStricter preconditions
Postcondition consistencyPostconditions not weakenedWeaker postconditions

Interface Segregation

CriterionPassFail
Focused interfacesInterfaces are cohesiveFat interfaces
Client-specificClients use all methodsUnused method implementations
No bloatNo "fat" interfacesInterface has unrelated methods

Dependency Inversion

CriterionPassFail
Abstraction dependencyHigh-level depends on abstractionsDepends on concretions
Bidirectional abstractionBoth levels use abstractionsDirect low-level dependency
InjectionDependencies injectedDependencies created internally

Simplicity Check

CriterionPassFail
Junior-friendlyUnderstandable by junior devRequires expert knowledge
Minimal complexitySimplest working solutionOver-engineered
Current focusSolves only current problemSolves hypothetical problems

Anti-Patterns to Avoid

Anti-PatternSymptomRemedy
God ClassDoes everything, knows everythingExtract Class
Shotgun SurgeryOne change requires many editsMove Method, consolidate
Feature EnvyMethod uses another class moreMove Method
Primitive ObsessionOveruse of primitivesIntroduce Value Object