@linesb

Плохая практика менять объект ненапрямую?

Плохо ли так делать?
class Position {
    private x: number;
    private y: number;
    
    constructor(x: number, y: number) {
        this.to(x, y);
    }
    
    public to(x: number, y: number): void {
        this.x = x;
        this.y = y;
    }

    // ...
}

class Character {
    private name: string;
    private position: Position;
    
    constructor(name: string, position: Position) {
        this.name = name;
        this.position = position;
    }
    
    // ...
}

const p = new Position(0, 0);
const character = new Character('Darth Vader', p);
p.to(10, 10);


Получается я меняю character без того чтобы что то с ним делать. Стоит ли так делать или же нет? Нарушает ли это какой нибудь принцип?
  • Вопрос задан
  • 138 просмотров
Пригласить эксперта
Ответы на вопрос 2
DollyPapper
@DollyPapper
Нарушаете принцип инкапсуляции как минимум. Сделайте композицию, чтобы в конструктор передавалась начальная позиция персонажа, и метод чтобы менять эту позицию у самого персонажа. Сейчас у вас p
это не свойство персонажа, а разделенное свойство в области видимости, хотя по логике это именно свойство персонажа.
Ответ написан
@rPman
Согласен с ответом DollyPapper, но формально возможна ситуация когда так можно делать

К примеру, если научить объект Position сообщать о действиях над собой своим овнерам, создав абстрактный класс CanHavePosition с виртуальным методом doMoving который должен быть имплементирован в классе Character (который наследуешь от CanHavePosition) и вызываться на каждое движение Position::to (способы оформления могут другими быть, например наоборот, в конструкторе Character будет вызываться метод init у Position с колбеком, который будет вызываться внутри Position::to) то такое оформление как у вас будет оправдано.

Само собой, нет необходимости так делать всегда, и нет нужды следовать строго прямо гайдлайнам, хотя они и 'написаны кровью и ошметками говнокода', всегда можно найти ситуацию, когда не нужны over engineering.

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

Войдите, чтобы написать ответ

Похожие вопросы