Skip to content

单一职责原则

单一职责原则(Single Responsibility Principle(SRP)),即一个类应该仅有一个引起它变化的原因。也就是说,一个类只应该有一个职责,它不该因为“不同的事情”而被改动,一个类只能有一个明确的“职责”,专注于自己的本职工作,其他的事情交给其他类!否则未来维护起来会一团乱麻。

举个例子,你不能让一个NPC既负责卖药水、又负责记录剧情进度、还要打怪……

那它真的不是 NPC,它是你!(被迫干活的主角x)

例子

假设你在做一个保存系统,你写了个 GameManager 类:

csharp
public class GameManager
{
    public void SaveGame() { /* 保存游戏状态到文件 */ }
    public void LoadGame() { /* 读取游戏状态 */ }
    public void SwitchScene() { /* 切换场景 */ }
    public void CalculateEnemyAI() { /* 敌人 AI 的判断 */ }
    public void UpdateUI() { /* 更新界面 */ }
}
gdscript
class_name GameManager

func save_game():
    # 保存游戏状态到文件

func load_game():
    # 读取游戏状态

func switch_scene():
    # 切换场景

func calculate_enemy_ai():
    # 敌人 AI 的判断

func update_ui():
    # 更新界面

虽然这个类叫 “管理器”,但它管得是不是有点太多了

这已经不是管理器,是世界管理员

它承担了UI 控制、场景管理、AI 逻辑、存档功能等一堆职责,每一项都可能因为需求变更而修改这个类,

这种情况下,应该把这些拆开来,让每个类只管自己该管的那一块

csharp
public class SaveManager
{
    public void SaveGame() {}
    public void LoadGame() {}
}

public class SceneManager
{
    public void SwitchScene() {}
}

public class EnemyAI
{
    public void Calculate() {}
}

public class UIManager
{
    public void UpdateUI() {}
}
gdscript
class_name SaveManager
func save_game(): pass
func load_game(): pass

class_name SceneManager
func switch_scene(): pass

class_name EnemyAI
func calculate(): pass

class_name UIManager
func update_ui(): pass