Как бы вы обновили более 100 переменных, если что-то изменилось в другом классе? - PullRequest
0 голосов
/ 10 июня 2010

У меня есть класс Grid, который создает диаграмму, похожую на сетку, в области рисования.Затем у меня есть 5 других классов для рисования различных фигур;Линия, Полигон, Эллипс, Кривая, Дуга

Теперь эти 5 классов используют экземпляр Grid, потому что Grid имеет разрешение и масштаб.Внутри Grid у меня есть:

public function set resolution(x:Number):void {
    _gap = (modBy10(x) / 10);
    _scale = (modBy10(x) / (this.resolution * _scale));

    draw();
}

public function get resolution():Number {
    return (_gap * 10);
}

public function set scale(x:Number):void {
    _scale = (this.resolution / x);
}

public function get scale():Number {
    return _scale;
}

/**/

public function scaleLength(x:Number):Number {
    return (x * this.scale);
}

public function scaleLengthDown(x:Number):Number {
    return (x / this.scale);
}

public function scaleArea(x:Number):Number {
    return (x / Math.pow(this.scale, 2));
}

Я просто потерялся из-за того, как обновить каждый экземпляр моих 5 классов рисования, когда Grid изменяется.до нескольких экземпляров Line, Line (длина, угол), где «length» - в дюймах, футах, см или м.Если пользователь желает изменить масштаб с 10 футов на разрешение 100 пикселей до 20 футов на 80 пикселей. Есть ли более простой способ, чем перерисовывать каждую линию внутри полигона?

Ответы [ 2 ]

1 голос
/ 10 июня 2010

У меня не будет всех других объектов, зависящих от Сетки для масштаба.

Скорее у меня был бы контейнер, называемый чем-то вроде ScaledDrawingSurface, который содержит все объекты формы и объект Grid.

В этом случае контейнер будет иметь свойство масштаба, которое можно изменить.

У вас есть два варианта изменения свойства масштаба:

  1. Имейте событие, которое отправляется ScaledDrawingSurface, когда изменяется масштаб. Все фигуры и сетка будут прослушивать это событие и обновляться соответственно. Если вы сделаете это, вы захотите создать собственное событие ScaleChangedEvent, включающее свойство для нового масштаба.

  2. Сделайте так, чтобы ScaledDrawingSurface перебирал все свои дочерние элементы, устанавливая их масштабы соответствующим образом. Если вы сделаете это, вам понадобится интерфейс IScalable с методом SetScale, который реализуют фигуры и сетка.

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

Одним приятным бонусом этого подхода является то, что было бы очень легко иметь несколько наложенных сеток (например, миллиметровую бумагу), которые обновляются до масштаба поверхности - вам просто нужно свойство в классе Grid, чтобы задать интервал для каждого сетка относительно глобального масштаба (и, возможно, свойства цвета и толщины)

1 голос
/ 10 июня 2010

способ справиться с этим - составной шаблон и инверсия зависимостей .

или же вы можете поместить все нарисованные объекты в один контейнер и просто масштабироватьконтейнер соответственно.

greetz
back2dos

...