Как улучшить решение с помощью ООП? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть одна сущность 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?

Определенно, я могу создать два класса, которые расширяют родительский класс Car с помощью метода Save(); Но метод Save() это не собственность автомобиля, это еще одна зона ответственности.

Мне не нужно заботиться о результате исходящего объекта автомобиля, независимо от того, какого типа, мне нужно просто сохранить его.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Если вы будете следовать шаблонам использования операторов 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);

Существует небольшое нарушение единственной ответственности, так как я не думаю, что автомобиль должен сам себя спасать - но не стоит решать проблему вэтот масштаб.Когда дела больше, вы можете воспользоваться хранилищами и фабриками.

Вы можете продолжить эту процедуру, чтобы иметь различную валидацию для больших и маленьких автомобилей и обрабатывать другие различия.

Если есть многосхожести между большими и маленькими картами, вы можете создать базовый класс или делегировать класс, который может обрабатывать подобные вещи.

0 голосов
/ 23 ноября 2018

не то, что вы вызываете метод save в save, я просто перемещаю логику, связанную с получением свойств автомобиля, в другую функцию, в вашем коде как для маленькой, так и для большой машины используется класс Car, поэтому метод save должен работать для обоих объектов

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 {
 ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...