如何避免将所有类都命名为 <WhatEver>Manager

如何避免将所有类都命名为Manager

技术背景

在软件开发中,为类命名是一项重要且具有挑战性的任务。很多时候,开发者习惯使用 ManagerHelperUtil 等通用词汇来命名类,但这可能导致类名缺乏明确的语义,难以准确传达类的具体职责。因此,寻找合适的类命名方式,避免过度使用 Manager 这样的通用词汇,是提高代码可读性和可维护性的关键。

实现步骤

参考已有框架命名

可以参考 .NETJavaAndroid 等框架中的命名方式。例如,在 .NET 框架中,常见的后缀有 BuilderWriterReaderHandlerContainer 等,它们都有特定的语义。

分析常用后缀

  • Builder:使用一些参数来构造特定类型的实例,通常是一次性使用的。如果需要重复创建对象,建议使用 Factory;如果负责创建多个不同类型的对象,则使用 Factories
  • Writer:将变量写入某个对象。
  • Reader:将某个对象读取为变量。
  • Handler:用于处理特定情况或事务。
  • Container:可以将对象放入其中。

考虑设计模式

根据所使用的设计模式来命名类。例如,使用工厂模式时,可以使用 Factory 后缀;使用策略模式时,可以使用 Policy 后缀。

保持一致性

在代码的可见范围内保持命名的一致性。如果公司有命名规范,遵循公司的规范;如果没有,可以创建自己的命名规范,并与同事交流和反馈。

核心代码(示例)

以下是一些使用不同后缀命名类的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Builder 示例
public class UserBuilder
{
private string name;
private int age;

public UserBuilder WithName(string name)
{
this.name = name;
return this;
}

public UserBuilder WithAge(int age)
{
this.age = age;
return this;
}

public User Build()
{
return new User(name, age);
}
}

// Factory 示例
public class UserFactory
{
public User CreateUser(string name, int age)
{
return new User(name, age);
}
}

// Writer 示例
public class UserWriter
{
public void WriteUser(User user, StreamWriter writer)
{
writer.WriteLine($"Name: {user.Name}, Age: {user.Age}");
}
}

// Reader 示例
public class UserReader
{
public User ReadUser(StreamReader reader)
{
string line = reader.ReadLine();
string[] parts = line.Split(',');
string name = parts[0].Split(':')[1].Trim();
int age = int.Parse(parts[1].Split(':')[1].Trim());
return new User(name, age);
}
}

// Handler 示例
public class UserHandler
{
public void HandleUser(User user)
{
// 处理用户的逻辑
}
}

// Container 示例
public class UserContainer
{
private List<User> users = new List<User>();

public void AddUser(User user)
{
users.Add(user);
}

public List<User> GetUsers()
{
return users;
}
}

public class User
{
public string Name { get; set; }
public int Age { get; set; }

public User(string name, int age)
{
Name = name;
Age = age;
}
}

最佳实践

  • 使用通用且明确的后缀:选择如 BuilderFactoryWriter 等具有明确语义的后缀,使类名更具可读性。
  • 遵循设计模式:根据系统所使用的设计模式来命名类,例如使用工厂模式时使用 Factory 后缀。
  • 保持一致性:在整个项目中保持命名规范的一致性,方便其他开发者理解和维护代码。
  • 避免使用隐喻命名:尽量避免使用如 “nanny”、“shepherd” 等基于隐喻的命名,因为这些命名可能因文化或个人理解的不同而产生歧义。

常见问题

过度使用通用词汇

如果过度使用 ManagerHelper 等通用词汇,会导致类名缺乏明确的语义,难以准确传达类的具体职责。解决方法是参考已有框架的命名方式,使用更具体的后缀。

命名不一致

在项目中如果命名规范不一致,会给其他开发者带来困扰。解决方法是制定统一的命名规范,并在团队中推广和遵循。

隐喻命名带来的歧义

使用基于隐喻的命名可能会导致不同开发者对类的职责理解不一致。解决方法是避免使用隐喻命名,选择更直接、明确的命名方式。


如何避免将所有类都命名为 <WhatEver>Manager
https://119291.xyz/posts/how-to-avoid-calling-everything-a-what-ever-manager/
作者
ww
发布于
2025年6月24日
许可协议