我很难写出通常由3-5个较小的模块或类组成的模块。当这些子组件需要扩展,但主模块已经在创建和实现它们的基本版本时,问题就出现了。
示例
// main module design
class Car {
constructor() {
this.horn = new Horn();
this.horn.on('honk', function() {
console.log('honked');
})
}
}
class Horn {
constructor() {
this.sound = 'hornA.wav'
}
}
// extended module design
class RaceCar extends Car {
constructor() {
super();
this.horn = new RaceHorn();
// event handler is now missing
}
}
class RaceHorn extends Horn {
constructor() {
super();
this.horn = 'hornB.wav'
}
}这确实是一个非常简单的例子,而我真正的问题涉及到具有更多组件和更多设置要求的模块。我确实明白我可以把东西放到另一个init或setup或类似的函数中,但对我来说,我似乎做了一些本质上错误的事情。
发布于 2017-02-12 07:12:12
为了解决这个问题,我强烈建议通过参数传递这些值。默认参数可以提供很多帮助
// main module design
class Car {
constructor( parametrizedHorn=Horn ) {
this.horn = new parametrizedHorn();
this.horn.on('honk', function() {
console.log('honked');
})
}
}
class Horn {
constructor() {
this.sound = 'hornA.wav'
}
}
// extended module design
class RaceCar extends Car {
constructor() {
super( RaceHorn );
}
}
class RaceHorn extends Horn {
constructor() {
super();
this.sound = 'hornB.wav'
}
}这可能会变得非常混乱,因此可以使用初始化方法
// main module design
class Car {
constructor() { ... }
init( hornType=Horn ){
this.initHorn( hornType );
}
initHorn( hornType=Horn ){
this.horn = new Horn();
this.horn.on('honk', function() {
console.log('honked');
})
}
}
class Horn {
constructor() {
this.sound = 'hornA.wav'
}
}
// extended module design
class RaceCar extends Car {
constructor() {
super();
}
init( hornType=RaceHorn ){
this.initHorn( hornType );
}
}
class RaceHorn extends Horn {
constructor() {
super();
this.sound = 'hornB.wav'
}
}
const raceCar = new RaceCar();
raceCar.init();这是您可以使用的两种模块化模式,根据您已经使用的结构类型,您可以判断哪一种是最好的。最后的诀窍是参数化你的类的内容,或者用方法进一步模块化它
https://stackoverflow.com/questions/42181886
复制相似问题