ОО шаблон проектирования для методов, зависящих от заказа - PullRequest
0 голосов
/ 07 октября 2018

Этот вопрос относится ко всем объектно-ориентированным языкам, но в моих примерах я буду использовать Java.

У меня есть проект, основанный на общем интерфейсе Renderable:

public interface Renderable {
    Point getSize();
    void render(Bounds bounds);
}

Предположим, что классы Point и Bounds являются классами POD, чтобы уменьшить объем кода в следующих примерах:

public final class Point { public int x, y; }
public final class Bounds { public int x, y, width, height; }

Цель этого интерфейса - разрешить коду в другом месте сначала вычислять размеробъекта, используя getSize, определите позицию на экране для объекта, создайте Bounds, используя эту позицию и размер, затем визуализируйте объект, используя render.

Также есть ограничениеэтот код, подобный этому, должен быть возможен , поэтому методы нельзя объединить в один:

// Ordered by dependency on size, e.g. parents come after children
Renderable[] renderables = { /* ... */ };
Map<Renderable, Point> sizes /* = ... */;

for(Renderable renderable : renderables) {
    sizes.put(renderable, renderable.getSize());
}

// rearrangeObjects is an arbitrary function that may do things
// such as place children inside their parents
Map<Renderable, Bounds> bounds = rearrangeObjects(sizes);

for(Renderable renderable : renderables) {
    renderable.render(bounds.get(renderable));
}

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

Есть еще одна проблема с этим решением: он заставляет код вызывать getSize до render, и все значения, используемые в render , должны быть кэшированы getSize,или между ними может измениться состояние памяти.

Есть ли способ реализовать эту систему таким образом, чтобы избежать всех этих проблем?

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