Должен ли я бросить исключение в конструкторах - PullRequest
0 голосов
/ 16 июня 2019

Если у меня есть класс треугольника, например, так:

export default class Triangle {

    sides: number[]

    constructor(...sides: number[]) {
        this.sides = sides
    }

    kind() {
        // returns type of triangle
    {
}

и если стороны, переданные в конструктор, не создают реальный треугольник, лучше выбросить ошибку при создании класса (например, в конструкторе), или когда вызывается функция (и)?

Существует этот ответ , который говорит, что это нормально в Java, и я уверен, что он работает в TypeScript.Я просто хочу знать, есть ли «лучшие практики» в отношении ООП в целом и TypeScript в частности.

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

Допустимо бросать в конструкторе.И, как правило, лучшая практика - быстро терпеть неудачу и рано выходить из строя.В вашем случае, например, лучше всего добавить конструктор, чтобы ошибка могла быть заранее обнаружена в коде, отвечающем за отправку неверных данных.Если вы вместо этого выбрасываете позже, когда фактически используете методы треугольника, код, который будет нарушен этим исключением, не виноват (они ничего не могут сделать по-другому, чтобы предотвратить исключение).Обычно это означает, что вам придется искать, где был создан объект, чтобы устранить ошибку.

Одна из главных обязанностей конструкторов, в первую очередь, состоит в том, чтобы гарантировать, что объекты могут быть созданы только в допустимом состоянии.Таким образом, не только допустимо выбрасывать, если параметры приведут к тому, что объект находится в недопустимом состоянии, но и это правильно, почему конструкторы существуют в первую очередь.

0 голосов
/ 16 июня 2019

Правильного ответа не существует, однако вы всегда должны делать «невозможные» состояния «невозможными» для представления, т. Е. В этом случае треугольник всегда будет иметь 3 стороны, поэтому просто сделайте любое количество сторон вне этого невозможным для прохождения.

export default class Triangle {
    sides: number[]
    constructor(...sides: [number, number, number]) { // tuple now.
        this.sides = sides
    }
}


const test = new Triangle(2,2,2); // no error
const test1 = new Triangle(2,2,2,2) // Error can't have 4 sides.

Преимущество этого состоит в том, что всякий раз, когда пропускается недопустимое количество фрагментов, программа завершится с ошибкой во время компиляции (безопасно), а не во время выполнения (небезопасно)

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