JavaScript对象设计终极指南:7个实战技巧告别面条代码
在JavaScript开发中,对象设计是构建高质量应用的基础。不良的对象设计会导致代码难以维护、扩展性差,最终形成令人头疼的"面条代码"。本文将分享7个基于clean-code-javascript项目的实战技巧,帮助你编写更优雅、可维护的对象代码。
1. 使用有意义且可发音的变量名
变量名应清晰表达其用途,避免模糊或过于简短的命名。一个好的变量名能让代码自文档化,减少注释需求。
反面示例:
const yyyymmdstr = moment().format("YYYY/MM/DD");
正面示例:
const currentDate = moment().format("YYYY/MM/DD");
这种命名方式不仅提高了可读性,也使代码更易于搜索和重构。在clean-code-javascript项目中,我们可以看到大量遵循此原则的代码示例,如使用expectedSalary而非es,使用githubLink而非gh等。
2. 避免不必要的上下文重复
当对象或类名已经提供了足够的上下文时,属性名不应重复这些信息。这会使代码更加简洁。
反面示例:
const Car = {
carMake: "Honda",
carModel: "Accord",
carColor: "Blue"
};
function paintCar(car, color) {
car.carColor = color;
}
正面示例:
const Car = {
make: "Honda",
model: "Accord",
color: "Blue"
};
function paintCar(car, color) {
car.color = color;
}
通过移除重复的"car"前缀,代码变得更加简洁,同时保持了清晰的含义。这种做法在整个clean-code-javascript项目中都有体现,如使用make而非carMake。
3. 函数参数应控制在2个以内
理想情况下,函数应只接受1-2个参数。当需要更多参数时,应考虑使用对象来封装这些参数,提高代码的可读性和可维护性。
反面示例:
function createMenu(title, body, buttonText, cancellable) {
// ...
}
createMenu("Foo", "Bar", "Baz", true);
正面示例:
function createMenu({ title, body, buttonText, cancellable }) {
// ...
}
createMenu({
title: "Foo",
body: "Bar",
buttonText: "Baz",
cancellable: true
});
使用对象作为参数有多个好处:参数顺序不再重要,新增参数时不会破坏现有调用,且通过解构语法可以清晰地看到函数使用了哪些属性。clean-code-javascript项目中的createMenu函数就是这种模式的典型应用。
4. 函数应该只做一件事
这是软件 engineering中最重要的原则之一。当函数只做一件事时,它们更容易被理解、测试和维护。
反面示例:
function emailClients(clients) {
clients.forEach(client => {
const clientRecord = database.lookup(client);
if (clientRecord.isActive()) {
email(client);
}
});
}
正面示例:
function emailActiveClients(clients) {
clients.filter(isActiveClient).forEach(email);
}
function isActiveClient(client) {
const clientRecord = database.lookup(client);
return clientRecord.isActive();
}
通过将功能分解为更小的函数,每个函数专注于单一职责,代码变得更加清晰和可重用。clean-code-javascript项目中的emailActiveClients和isActiveClient函数展示了这种分离关注点的方法。
5. 使用类和继承实现多态
避免使用大量条件语句来处理不同类型的对象,而是利用类和继承来实现多态行为。
反面示例:
class Airplane {
getCruisingAltitude() {
switch (this.type) {
case "777":
return this.getMaxAltitude() - this.getPassengerCount();
case "Air Force One":
return this.getMaxAltitude();
case "Cessna":
return this.getMaxAltitude() - this.getFuelExpenditure();
}
}
}
正面示例:
class Airplane {
// ...
}
class Boeing777 extends Airplane {
getCruisingAltitude() {
return this.getMaxAltitude() - this.getPassengerCount();
}
}
class AirForceOne extends Airplane {
getCruisingAltitude() {
return this.getMaxAltitude();
}
}
class Cessna extends Airplane {
getCruisingAltitude() {
return this.getMaxAltitude() - this.getFuelExpenditure();
}
}
通过创建不同的子类并覆盖方法,我们消除了条件语句,使代码更易于扩展。当需要添加新的飞机类型时,只需创建一个新的子类,而不必修改现有代码。clean-code-javascript项目中的飞机类层次结构展示了这种设计模式的优势。
6. 优先使用ES6类而非原型
ES6引入的class语法提供了更清晰、更简洁的方式来创建对象和实现继承,相比传统的原型语法更易于理解和维护。
反面示例:
function Animal() {}
Animal.prototype.move = function move() {};
function Mammal() {
Animal.call(this);
}
Mammal.prototype = Object.create(Animal.prototype);
Mammal.prototype.liveBirth = function liveBirth() {};
function Human() {
Mammal.call(this);
}
Human.prototype = Object.create(Mammal.prototype);
Human.prototype.speak = function speak() {};
正面示例:
class Animal {
move() {}
}
class Mammal extends Animal {
liveBirth() {}
}
class Human extends Mammal {
speak() {}
}
ES6类语法使继承关系更加清晰,代码结构更加直观。clean-code-javascript项目推荐使用这种现代语法来组织对象层次结构,如Animal、Mammal和Human类的实现。
7. 实现方法链以提高可读性
通过在类方法中返回this,可以实现方法链,使代码更加简洁和可读。
示例:
class Car {
setColor(color) {
this.color = color;
return this;
}
setMake(make) {
this.make = make;
return this;
}
setModel(model) {
this.model = model;
return this;
}
}
const car = new Car()
.setColor("red")
.setMake("Honda")
.setModel("Accord");
方法链允许我们在一行中调用多个方法,使代码更加流畅和易于理解。clean-code-javascript项目中提到,在类函数的末尾返回this,可以将更多的类方法链接到它上面,从而提高代码的可读性和表达力。
总结
良好的对象设计是编写高质量JavaScript代码的关键。通过遵循上述7个技巧——使用有意义的变量名、避免不必要的上下文重复、控制函数参数数量、确保函数只做一件事、利用类和继承实现多态、优先使用ES6类语法以及实现方法链——你可以编写出更优雅、更可维护的代码,告别面条代码的困扰。
这些原则不仅适用于对象设计,也是clean-code-javascript项目所倡导的整体代码质量理念的重要组成部分。通过持续实践这些技巧,你的JavaScript代码将变得更加专业、高效和令人愉悦。
要开始使用这些最佳实践,你可以通过以下命令克隆clean-code-javascript项目:
git clone https://gitcode.com/GitHub_Trending/cl/clean-code-javascript
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



