浅谈JavaScript 代码整洁之道(10)
好:
class Shape { constructor() {} setColor(color) { // ... } render(area) { // ... } } class Rectangle extends Shape { constructor() { super(); this.width = 0; this.height = 0; } setWidth(width) { this.width = width; } setHeight(height) { this.height = height; } getArea() { return this.width * this.height; } } class Square extends Shape { constructor() { super(); this.length = 0; } setLength(length) { this.length = length; } getArea() { return this.length * this.length; } } function renderLargeShapes(shapes) { shapes.forEach((shape) => { switch (shape.constructor.name) { case 'Square': shape.setLength(5); case 'Rectangle': shape.setWidth(4); shape.setHeight(5); } let area = shape.getArea(); shape.render(area); }) } let shapes = [new Rectangle(), new Rectangle(), new Square()]; renderLargeShapes(shapes);
接口隔离原则(ISP)
JavaScript 中没有接口,所以实行这个原则不能像其它语言那样严格。然而即使对 JavaScript 的弱类型系统来说,它仍然是重要的相关。
ISP 指出,“客户不应该依赖于那些他们不使用的接口。” 由于 Duck Typing 理论,接口在 JavaScript 中是个隐性契约。
在 JavaScript 中有一个很好的例子来演示这个原则,即一个拥有巨大设置对象的类。比较好的做法是不要求客户设置大量的选项,因为多数时候他们不需要所有设置。让这些选项成为可选的有助于防止“胖接口”。
不好:
class DOMTraverser { constructor(settings) { this.settings = settings; this.setup(); } setup() { this.rootNode = this.settings.rootNode; this.animationModule.setup(); } traverse() { // ... } } let $ = new DOMTraverser({ rootNode: document.getElementsByTagName('body'), animationModule: function() {} // 多数时候我们不需要动画 // ... });
好:
class DOMTraverser { constructor(settings) { this.settings = settings; this.options = settings.options; this.setup(); } setup() { this.rootNode = this.settings.rootNode; this.setupOptions(); } setupOptions() { if (this.options.animationModule) { // ... } } traverse() { // ... } } let $ = new DOMTraverser({ rootNode: document.getElementsByTagName('body'), options: { animationModule: function() {} } });
依赖倒置原则(DIP)
这个原则说明了两个基本问题:
1. 上层模块不应该依赖下层模块,两者都应该依赖抽象。
2. 抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
这一开始可能很难理解,但是如果你使用 Angular.js,你已经看到了对这个原则的一种实现形式:依赖注入(DI)。虽然它们不是完全相同的概念,DIP 阻止上层模块去了解下层模块的细节并设置它们。它可以通过 DI 来实现。这带来的巨大好处降低了模块间的耦合。耦合是种非常不好的开发模式,因为它让代码难以重构。