设计模式(一):面向对象设计原则 - 单一责任原则
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");
}
// ...
}