第二部分:软件开发中的设计原则

2025-06-09

第二部分:软件开发中的设计原则

在软件开发中,遵循设计原则对于创建健壮、可维护且可扩展的应用程序至关重要。本文将探讨五项基本设计原则:依赖倒置、关注点分离、单一职责、DRY(不要重复自己)和持久化忽略。每一项原则都有助于确保您的代码库保持简洁高效。

1.依赖倒置原则(DIP)

依赖倒置原则是 SOLID 原则的最后一条。它指出,高级模块不应该依赖于低级模块;两者都应该依赖于抽象。此外,抽象不应该依赖于细节。细节应该依赖于抽象。

例子:

public interface IMessageService
{
    void SendMessage(string message);
}

public class EmailService : IMessageService
{
    public void SendMessage(string message)
    {
        // Send email
    }
}

public class Notification
{
    private readonly IMessageService _messageService;

    public Notification(IMessageService messageService)
    {
        _messageService = messageService;
    }

    public void Notify(string message)
    {
        _messageService.SendMessage(message);
    }
}
Enter fullscreen mode Exit fullscreen mode

在此示例中,Notification类依赖于抽象,IMessageService而不是像的具体实现EmailService。这样可以轻松地切换不同的消息服务,而无需修改Notification类。

2.关注点分离(SoC)

关注点分离是指将代码组织成不同的部分,每个部分负责特定的功能。这一原则有助于降低代码复杂性并提高可维护性。

示例:
在典型的 Web 应用程序中,您可能会将关注点分为几层,例如:

  • 表示层:处理 UI 和用户交互。
  • 业务逻辑层:包含核心应用程序逻辑。
  • 数据访问层:管理数据检索和存储。
// Presentation Layer
public class UserController
{
    private readonly IUserService _userService;

    public UserController(IUserService userService)
    {
        _userService = userService;
    }

    public IActionResult GetUser(int id)
    {
        var user = _userService.GetUserById(id);
        return Ok(user);
    }
}

// Business Logic Layer
public interface IUserService
{
    User GetUserById(int id);
}

public class UserService : IUserService
{
    private readonly IUserRepository _userRepository;

    public UserService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public User GetUserById(int id)
    {
        return _userRepository.GetById(id);
    }
}

// Data Access Layer
public interface IUserRepository
{
    User GetById(int id);
}

public class UserRepository : IUserRepository
{
    public User GetById(int id)
    {
        // Retrieve user from database
    }
}
Enter fullscreen mode Exit fullscreen mode

每一层都有特定的职责,使得代码库更易于管理和扩展。

3.单一职责原则(SRP)

单一职责原则断言一个类应该只有一个改变的原因,这意味着它应该只有一项工作或职责。

例子:

public class User
{
    public string Name { get; set; }
    public string Email { get; set; }
}

public class UserRepository
{
    public void Save(User user)
    {
        // Save user to database
    }
}

public class UserValidator
{
    public bool Validate(User user)
    {
        // Validate user data
    }
}
Enter fullscreen mode Exit fullscreen mode

这里,、、UserUserRepository各自UserValidator承担单一职责,遵循 SRP。

4. DRY(不要重复自己)

DRY 原则强调通过将常用功能抽象为可重用的组件来减少代码的重复。

例子:

public class EmailService
{
    public void SendEmail(string to, string subject, string body)
    {
        // Send email
    }
}

public class NotificationService
{
    private readonly EmailService _emailService;

    public NotificationService(EmailService emailService)
    {
        _emailService = emailService;
    }

    public void NotifyUser(string email, string message)
    {
        _emailService.SendEmail(email, "Notification", message);
    }
}
Enter fullscreen mode Exit fullscreen mode

通过使用EmailServicein NotificationService,我们避免了重复电子邮件发送逻辑。

5. 持久性无知

持久化忽略原则是指应用程序的业务逻辑不应该感知数据是如何持久化的。该原则确保核心逻辑与所使用的数据访问技术保持独立。

例子:

public class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public interface IProductRepository
{
    void Save(Product product);
}

public class ProductService
{
    private readonly IProductRepository _productRepository;

    public ProductService(IProductRepository productRepository)
    {
        _productRepository = productRepository;
    }

    public void AddProduct(Product product)
    {
        _productRepository.Save(product);
    }
}
Enter fullscreen mode Exit fullscreen mode

该类ProductService不知道或不关心该类如何ProductRepository持久化数据,遵循持久化无知原则。

结论

理解并运用这些设计原则可以显著提升软件质量。遵循依赖倒置、关注点分离、单一职责、DRY 原则和持久化忽略原则,您可以创建更易于理解、维护和扩展的应用程序。

鏂囩珷鏉ユ簮锛�https://dev.to/moh_moh701/part-1-design-principles-in-software-development-4mgp
PREV
生产力 101:懒惰开发者的 Git 别名 metoo
NEXT
如何修复 Git 中最常见的错误 - 保存此信息以备不时之需 将更改推送到错误的分支 忘记在切换分支之前提交暂存的更改 撤消错误的合并冲突 意外删除分支 恢复到您不想恢复的旧版本代码 意外提交敏感信息(例如密码、个人数据)