跳转到内容

字段改名

字段改名(Rename Field)给一个记录或类的字段换一个准确的名字,并改掉所有引用它的地方。 它解决的痛是:字段名和它存的东西对不上,每个读到它的人都要想一下“这个 nm 其实是什么”。

一个早期写的组织信息记录,字段叫 nm 和 cty,当时觉得省几个字母。现在团队来了新人,每次看到都要问。

"""组织记录:改名前。"""
class Organization:
def __init__(self, nm: str, cty: str) -> None:
self.nm = nm
self.cty = cty
def label(org: Organization) -> str:
return f"{org.nm}({org.cty})"
if __name__ == "__main__":
print(label(Organization("多练学社", "CN")))
# 输出:
# 多练学社(CN)
// 组织记录:改名前。
class Organization {
constructor(
readonly nm: string,
readonly cty: string,
) {}
}
function label(org: Organization): string {
return `${org.nm}(${org.cty})`;
}
console.log(label(new Organization("多练学社", "CN")));
// 输出:
// 多练学社(CN)
"""组织记录:改名后。"""
class Organization:
def __init__(self, name: str, country: str) -> None:
self.name = name
self.country = country
def label(org: Organization) -> str:
return f"{org.name}({org.country})"
if __name__ == "__main__":
print(label(Organization("多练学社", "CN")))
# 输出:
# 多练学社(CN)
// 组织记录:改名后。
class Organization {
constructor(
readonly name: string,
readonly country: string,
) {}
}
function label(org: Organization): string {
return `${org.name}(${org.country})`;
}
console.log(label(new Organization("多练学社", "CN")));
// 输出:
// 多练学社(CN)

name 和 country 不用解释。类的字段改名用 IDE 的 Rename 最安全,它会改掉所有引用(IDE 可自动完成)。

字段改名:修改字段的名字,并同步修改所有对它的引用。如果字段属于一个还没封装的字典(第 13 章),IDE 找不到所有用法,因为字典的键只是字符串,这时先封装记录,再改名就只改类内部一处。如果字段名出现在持久化的数据里(数据库列、JSON 接口、配置文件),代码里的名字可以先改,对外的名字通过映射保持不变,或者走迁移式改法:新旧名字同时接受一段时间,再去掉旧的,与第 6 章改函数声明的迁移式做法相同。

字段名虽不完美但全团队都习惯了,且它出现在对外接口里,改名的成本可能比收益大,这时在文档里说清楚即可。