AgentSkillsCN

core-principles

践行 SOLID、DRY、KISS 等基础编码原则,以及常用的设计模式。在为提升代码可维护性而重构代码、审查设计模式的使用情况、传授 SOLID 原则,或依据工程标准评估代码质量时,可使用此技能。

SKILL.md
--- frontmatter
name: "core-principles"
description: 'Apply fundamental coding principles including SOLID, DRY, KISS, and common design patterns. Use when refactoring code for maintainability, reviewing design pattern usage, teaching SOLID principles, or evaluating code quality against engineering standards.'
metadata:
  author: "AgentX"
  version: "1.0.0"
  created: "2025-01-15"
  updated: "2025-01-15"
compatibility:
  languages: ["csharp"]

Core Principles

Purpose: Fundamental principles guiding production code development.
Focus: SOLID, DRY, KISS, design patterns.


When to Use This Skill

  • Reviewing code for SOLID principle compliance
  • Refactoring code for maintainability
  • Choosing appropriate design patterns
  • Teaching or evaluating engineering standards

Prerequisites

  • Basic OOP programming knowledge

SOLID Principles

Single Responsibility (SRP)

Each class has one reason to change.

csharp
// ❌ Multiple responsibilities
public class User
{
    public string Name { get; set; }
    public void SaveToDatabase() { } // Persistence
    public void SendEmail() { } // Communication
}

// ✅ Single responsibility
public class User
{
    public string Name { get; set; }
}
public class UserRepository
{
    public void Save(User user) { }
}
public class EmailService
{
    public void SendEmail(User user) { }
}

Open/Closed (OCP)

Open for extension, closed for modification.

csharp
// ✅ Extend via abstraction
public interface IPaymentProcessor
{
    Task<PaymentResult> ProcessAsync(decimal amount);
}

public class CreditCardProcessor : IPaymentProcessor { }
public class PayPalProcessor : IPaymentProcessor { }

public class PaymentService
{
    public async Task ProcessPaymentAsync(IPaymentProcessor processor, decimal amount)
    {
        return await processor.ProcessAsync(amount);
    }
}

Liskov Substitution (LSP)

Subtypes must be substitutable for base types.

csharp
// ✅ Derived classes extend, don't break behavior
public abstract class Bird
{
    public abstract void Move();
}

public class Sparrow : Bird
{
    public override void Move() => Fly();
}

public class Penguin : Bird
{
    public override void Move() => Walk(); // Different but valid
}

Interface Segregation (ISP)

Many specific interfaces > one general interface.

csharp
// ❌ Fat interface
public interface IWorker
{
    void Work();
    void Eat();
    void Sleep();
}

// ✅ Segregated interfaces
public interface IWorkable { void Work(); }
public interface IFeedable { void Eat(); }
public interface IRestable { void Sleep(); }

Dependency Inversion (DIP)

Depend on abstractions, not concretions.

csharp
// ✅ Depend on interface
public class OrderService
{
    private readonly IOrderRepository _repository;
    
    public OrderService(IOrderRepository repository)
    {
        _repository = repository;
    }
}

DRY (Don't Repeat Yourself)

csharp
// ❌ Duplication
public class UserService
{
    public User GetUser(int id)
    {
        var conn = new SqlConnection(connectionString);
        conn.Open();
        // ... query logic
    }
    
    public Order GetOrder(int id)
    {
        var conn = new SqlConnection(connectionString);
        conn.Open();
        // ... query logic
    }
}

// ✅ Extract common logic
public abstract class BaseRepository
{
    protected SqlConnection GetConnection()
    {
        var conn = new SqlConnection(connectionString);
        conn.Open();
        return conn;
    }
}

KISS (Keep It Simple, Stupid)

csharp
// ❌ Overengineered
public class UserValidator
{
    public bool Validate(User user)
    {
        var strategy = ValidatorStrategyFactory
            .CreateStrategy(user.UserType)
            .GetValidationChain()
            .Execute(new ValidationContext(user));
        return strategy.IsValid;
    }
}

// ✅ Simple
public class UserValidator
{
    public bool Validate(User user)
    {
        return !string.IsNullOrEmpty(user.Email) &&
               user.Email.Contains("@") &&
               user.Age >= 13;
    }
}

YAGNI (You Aren't Gonna Need It)

Don't build features "just in case". Build what's needed now.


Best Practices

✅ DO

  • Follow SOLID - Especially SRP and DIP
  • Keep functions small - One thing, well
  • Use meaningful names - Self-documenting code
  • Favor composition - Over inheritance
  • Write tests - Design for testability
  • Refactor regularly - Improve as you go
  • Document complex logic - Why, not what

❌ DON'T

  • Violate SOLID - Leads to rigid, fragile code
  • Duplicate code - Extract to methods/classes
  • Overcomplicate - Simple solutions first
  • Build unused features - YAGNI
  • Skip code reviews - Catch issues early
  • Ignore tech debt - Pay it down regularly

See Also: Code OrganizationTesting

Last Updated: January 13, 2026

Troubleshooting

IssueSolution
Over-engineering with patternsApply YAGNI - only use patterns when complexity warrants them
DRY violation detectedExtract shared logic into a utility method or base class

References