0.导言

在学习 C 语言时,我们很少去谈论“可拓展性”,“可维护性”等等之类概念。但随着我们学习计算机更加深入,工程的代码量也越来越大,如果还只是以实现功能为目的,增加新代码的难度会越来越大。此外,大型的项目往往需要更多维护者参与进来,如果没有一个统一的代码设计规范,则会显著增加各个维护者的心智负担,并且会导致项目的代码越来越难以维护和低效。

为了避免这种情况,面向对象及面向对象的设计模式应运而生,这是一套设计可维护、低耦合代码的设计范式和方法论。遵循这套规则,我们可以写出更加可维护可拓展的项目。

1.单一责任原则

单一职责原则(Simple Responsibility Principle,SRP)是最简单的面向对象设计原则,它用于控制类的粒度大小。

一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。

假设我们在设计一个 Person 类:

public abstract class Person(int age, string name)
{
    public int Age { get; set; } = age;
    public string Name { get; set; } = name;
    
    // 走路
    public void Walk()
    {
        Console.WriteLine("I am walking");
    }
    
    // 吃饭
    public void Eat()
    {
        Console.WriteLine("I am eating");
    }
    
    // 写代码
    public void Code()
    {
        Console.WriteLine("I am coding");
    }
    
    // 画画
    public void Draw()
    {
        Console.WriteLine("I am drawing");
    }
    
    // 唱歌
    public void Sing()
    {
        Console.WriteLine("I am singing");
    }
    
    // 跳舞
    public void Dance()
    {
        Console.WriteLine("I am dancing");
    }
    
    // ...
}

可以看到,这个类包含了很多人类能做到的事情,但现实情况往往是:一个人只会人类知识库中的很小一部分,终其一生都在自己的专业领域中工作,而不是十八般武艺样样精通。因此,这个类实现的过于臃肿,当我们修改这个类时,可能需要修改代码库中的多个地方以适应 Person 类的改变。

因此,根据单一责任原则,我们可以将该类拆解成不同职业的人来进行更明确的划分:

public abstract class Person(int age, string name)
{
    public int Age { get; set; } = age;
    public string Name { get; set; } = name;
    
    // 走路
    public void Walk()
    {
        Console.WriteLine("I am walking");
    }
    
    // 吃饭
    public void Eat()
    {
        Console.WriteLine("I am eating");
    }
}

public class Programmer(int age, string name) : Person(age, name)
{
    // 编程
    public void Coding()
    {
        Console.WriteLine("I am coding");
    }
    
    // ...
}

public class Artist(int age, string name) : Person(age, name)
{
    // 画画
    public void Draw()
    {
        Console.WriteLine("I am drawing");
    }
    
    // ...
}

public class Singer(int age, string name) : Person(age, name)
{
    // 唱歌
    public void Sing()
    {
        Console.WriteLine("I am singing");
    }
    
    // ...
}

public class Dancer(int age, string name) : Person(age, name)
{
    // 跳舞
    public void Dance()
    {
        Console.WriteLine("I am dancing");
    }
    
    // ...
}

设计模式(一):面向对象设计原则 - 单一责任原则

作者

WhitePaper 白芷

发布日期

2024 - 11 - 29