если у вас typescript, вы можете так сделать
class Rectangle {
readonly x: number
readonly y: number
readonly w: number
readonly h: number
constructor(x: number, y: number, w: number, h: number) {
this.x = x
this.y = y
this.w = w
this.h = h
}
}
class Canvas {
private w: number
private h: number
constructor(w: number, h: number) {
this.w = w;
this.h = h;
}
public drawRect(rect: Rectangle) {
//draw implementation
}
}
В этом случае Rectangle просто контейнер для чисел и никто его менять не может. Но поля публичные и то позволяет его отрисовать.
Но это решение справедливо только для этого случая. В целом вопрос более глубокий и не имеет единого ответа.
Рекомендую почитать про
Rich model и
Anaemic model, это даст некоторое понимание про разницу подходов и то какие плюсы\минусы есть.