如何使用OOP改进解决方案?

时间:2018-11-23 11:36:58

标签: typescript oop

如果有两种类型CarBig,我就有一个实体Small

我的HTML页面包含两种形式。根据所选的形式,我知道类型:BigSmall

我的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的属性,而是另一个职责范围。

我不需要关心结果车的结果,无论哪种类型,我只需要保存它即可。

2 个答案:

答案 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)

如果遵循使用ifswitch语句来处理差异的模式,则最终将得到许多条件语句。

一种基本策略将把这些差异移到一个类中,而不是测试属性或类型来分支逻辑。

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);

有一点违反了单一责任,因为我认为汽车不应该自救-但这并不能解决这个问题。当事情变大时,您可能会从存储库和工厂中受益。

您可以继续使用此模式,以对大型和小型汽车进行不同的验证,并处理其他差异。

如果大卡片和小卡片之间有很多相似之处,则可以创建一个基类,或者委托一个可以处理相似内容的类。