如果有两种类型Car
,Big
,我就有一个实体Small
。
我的HTML页面包含两种形式。根据所选的形式,我知道类型:Big
,Small
。
我的TypeScript外观为:
public type: "Big" | "Small";
public CarSmall: Car;
public CarBig: Car;
提交表单后,我会调用函数:
public save(): void {
if (this.type == "Big") {
const bigCarProperties = {}; // Get data specialized for this type
save(bigCarProperties) ;
}
if (this.type == "Small") {
const smallCarProperties = {}; // Get data specialized for this type
save(smallCarProperties);
}
}
save()
函数接受不同数量的参数。
所以,我不喜欢这种方法,如何在TypeScript中使用OOP改进它?
当然,我可以使用方法Save();
创建两个扩展父类Car的类,但是方法Save()
不是Car的属性,而是另一个职责范围。
我不需要关心结果车的结果,无论哪种类型,我只需要保存它即可。
答案 0 :(得分:1)
不是在调用save方法,我只是将与获取汽车属性相关的逻辑移到另一个函数,无论大小汽车中的代码都基于Car类,所以save方法应该对两个对象均有效< / p>
getCarProperties(type:string) {
if (this.type == "Big") {
return bigCarProperties = {};
} else {
return smallCarProperties = {};
}
}
public send(): void {
this.save(this.getCarProperties(this.type));
}
public save(car:Car) : void {
....
}
答案 1 :(得分:1)
如果遵循使用if
和switch
语句来处理差异的模式,则最终将得到许多条件语句。
一种基本策略将把这些差异移到一个类中,而不是测试属性或类型来分支逻辑。
interface Car {
save(): void;
}
class SmallCar implements Car {
protected hasTrolleyHandle: boolean = true;
save() {
console.log('Save small car properties.', JSON.stringify(this));
}
}
class BigCar implements Car {
protected hasBullBars: boolean = false;
save() {
console.log('Save big car properties.', JSON.stringify(this));
}
}
// Examples
const smallCar = new SmallCar();
smallCar.save();
const bigCar = new BigCar();
bigCar.save();
// More examples
function saveCar(car: Car) {
car.save();
}
saveCar(smallCar);
saveCar(bigCar);
有一点违反了单一责任,因为我认为汽车不应该自救-但这并不能解决这个问题。当事情变大时,您可能会从存储库和工厂中受益。
您可以继续使用此模式,以对大型和小型汽车进行不同的验证,并处理其他差异。
如果大卡片和小卡片之间有很多相似之处,则可以创建一个基类,或者委托一个可以处理相似内容的类。