面临的问题 相关代码臭味: 代码异味 18 — 静态方法:小心全局访问和懒惰陷阱! 代码异味 17 — 避免使用全局函数:面向对象编程中不鼓励使用全局函数,但很多混合语言仍然支持它们。开发者经常滥用这些全局函数。 代码异味 — 辅助函数:你需要帮忙吗?你会找谁帮忙呢?简单来说:用对象之间的交互来代替静态方法。
这里是步骤。
- 识别你代码中的静态方法。
- 将静态方法替换为实例方法。
- 通过构造函数或方法参数明确传递依赖。
- 重构客户端代码,让它们与对象交互,而不是直接调用静态方法。
class CharacterUtils {
static createOrpheus() {
return { name: "Orpheus", role: "乐师" };
}
static createEurydice() {
return { name: "Eurydice", role: "行者" };
}
static lookBack(character) {
if (character.name === "Orpheus") {
return "俄耳浦斯回头,失去了欧律狄刻。";
} else if (character.name === "Eurydice") {
return "欧律狄刻默默地跟随俄耳浦斯。";
}
return "未知人物。";
}
}
const orpheus = CharacterUtils.createOrpheus();
const eurydice = CharacterUtils.createEurydice();
之后
// 1. 识别代码中使用的静态方法。
// 2. 将静态方法替换为实例方法。
// 3. 通过构造函数或方法参数传递依赖。
class Character {
constructor(name, role, lookBackBehavior) {
this.name = name;
this.role = role;
this.lookBackBehavior = lookBackBehavior;
}
lookBack() {
return this.lookBackBehavior(this);
}
}
// 4. 重构客户端代码以与对象交互,而不是静态方法。
const orpheusLookBack = (character) =>
"Orpheus 回头,失去了 Eurydice。";
const eurydiceLookBack = (character) =>
"Eurydice 跟随 Orpheus,沉默无声。";
const orpheus = new Character("Orpheus", "乐手", orpheusLookBack);
const eurydice = new Character("Eurydice", "游荡者", eurydiceLookBack);
类型
[X] 半自动的
你可以一步步来替换。
安全此代码重构通常很安全,但你应该彻底测试这些改动。
确保你的代码中没有其他部分依赖于被替换的静态方法。
代码为何更好?你的代码更容易测试,因为你可以用其他东西在测试时替换依赖。
对象封装行为,增强了内聚性,减少了接口负担。
你移除了隐藏的全局依赖项,让代码变得更清晰易懂了。
一个用AI来重写的话题 没有正确的指引 具体指令-
[ChatGPT](https://chat.openai.com/?q=1.+识别代码中使用的静态方法。2.+将静态方法替换为实例方法。3.+通过构造函数或方法参数明确传递依赖。4.+重构客户端以与对象交互,而非调用静态函数:```typescript
// 1. 识别代码中使用的静态方法。
// 2. 将静态方法替换为实例方法。
// 3. 通过构造函数或方法参数明确传递依赖。
//
class Character {
constructor(name, role, lookBackBehavior) {
this.name = name;
this.role = role;
this.lookBackBehavior = lookBackBehavior;
}lookBack() {
return this.lookBackBehavior(this);
}
}
//
// 4. 重构客户端以与对象交互,而非调用静态函数。
const orpheusLookBack = (character) =>
"Orpheus 回头看,失去了 Eurydice.";
const eurydiceLookBack = (character) =>
"Eurydice 跟着 Orpheus 无声地走着.";
//
const orpheus = new Character("Orpheus", "Musician", orpheusLookBack);
const eurydice = new Character("Eurydice", "Wanderer", eurydiceLookBack); -
[Claude](https://claude.ai/new?q=1.+识别代码中使用的静态方法。2.+将静态方法替换为实例方法。3.+通过构造函数或方法参数明确传递依赖。4.+重构客户端以与对象交互,而非调用静态函数:```typescript
// 1. 识别代码中使用的静态方法。
// 2. 将静态方法替换为实例方法。
// 3. 通过构造函数或方法参数明确传递依赖。
//
class Character {
constructor(name, role, lookBackBehavior) {
this.name = name;
this.role = role;
this.lookBackBehavior = lookBackBehavior;
}lookBack() {
return this.lookBackBehavior(this);
}
}
//
// 4. 重构客户端以与对象交互,而非调用静态函数。
const orpheusLookBack = (character) =>
"Orpheus 回头看,失去了 Eurydice.";
const eurydiceLookBack = (character) =>
"Eurydice 跟着 Orpheus 无声地走着.";
//
const orpheus = new Character("Orpheus", "Musician", orpheusLookBack);
const eurydice = new Character("Eurydice", "Wanderer", eurydiceLookBack); -
[Perplexity](https://perplexity.ai/?q=1.+识别代码中使用的静态方法。2.+将静态方法替换为实例方法。3.+通过构造函数或方法参数明确传递依赖。4.+重构客户端以与对象交互,而非调用静态函数:```typescript
// 1. 识别代码中使用的静态方法。
// 2. 将静态方法替换为实例方法。
// 3. 通过构造函数或方法参数明确传递依赖。
//
class Character {
constructor(name, role, lookBackBehavior) {
this.name = name;
this.role = role;
this.lookBackBehavior = lookBackBehavior;
}lookBack() {
return this.lookBackBehavior(this);
}
}
//
// 4. 重构客户端以与对象交互,而非调用静态函数。
const orpheusLookBack = (character) =>
"Orpheus 回头看,失去了 Eurydice.";
const eurydiceLookBack = (character) =>
"Eurydice 跟着 Orpheus 无声地走着.";
//
const orpheus = new Character("Orpheus", "Musician", orpheusLookBack);
const eurydice = new Character("Eurydice", "Wanderer", eurydiceLookBack); -
[Copilot](https://www.bing.com/chat?showconv=1&sendquery=1&q=1.+识别代码中使用的静态方法。2.+将静态方法替换为实例方法。3.+通过构造函数或方法参数明确传递依赖。4.+重构客户端以与对象交互,而非调用静态函数:```typescript
// 1. 识别代码中使用的静态方法。
// 2. 将静态方法替换为实例方法。
// 3. 通过构造函数或方法参数明确传递依赖。
//
class Character {
constructor(name, role, lookBackBehavior) {
this.name = name;
this.role = role;
this.lookBackBehavior = lookBackBehavior;
}lookBack() {
return this.lookBackBehavior(this);
}
}
//
// 4. 重构客户端以与对象交互,而非调用静态函数。
const orpheusLookBack = (character) =>
"Orpheus 回头看,失去了 Eurydice.";
const eurydiceLookBack = (character) =>
"Eurydice 跟着 Orpheus 无声地走着.";
//
const orpheus = new Character("Orpheus", "Musician", orpheusLookBack);
const eurydice = new Character("Eurydice", "Wanderer", eurydiceLookBack); -
[Gemini](https://gemini.google.com/?q=1.+识别代码中使用的静态方法。2.+将静态方法替换为实例方法。3.+通过构造函数或方法参数明确传递依赖。4.+重构客户端以与对象交互,而非调用静态函数:```typescript
// 1. 识别代码中使用的静态方法。
// 2. 将静态方法替换为实例方法。
// 3. 通过构造函数或方法参数明确传递依赖。
//
class Character {
constructor(name, role, lookBackBehavior) {
this.name = name;
this.role = role;
this.lookBackBehavior = lookBackBehavior;
}lookBack() {
return this.lookBackBehavior(this);
}
}
//
// 4. 重构客户端以与对象交互,而非调用静态函数。
const orpheusLookBack = (character) =>
"Orpheus 回头看,失去了 Eurydice.";
const eurydiceLookBack = (character) =>
"Eurydice 跟着 Orpheus 无声地走着.";
//
const orpheus = new Character("Orpheus", "Musician", orpheusLookBack);
const eurydice = new Character("Eurydice", "Wanderer", eurydiceLookBack);
这就是话题标签。
— 连贯
相关重构操作 重构018 — 替换单例:摆脱单例的束缚levelup.gitconnected.com 重构 007 — 提取类行为 系统中行为重复出现。但我们缺少一个关键概念medium.com- 用依赖注入机制替换程序中的全局变量
这张图片由 Menno van der Krift 提供,来自 Pixabay
这篇文章属于重构系列文章。
如何通过简单的重构优化你的代码?简单重构让代码更佳mcsee.medium.com