Лучший шаблон для таблицы поиска с различными внутренними представлениями? Наблюдатель шаблон?

Я пишу свой собственный класс LookupTable, который получает в качестве ввода

  • карта ключевых точек и соответствующих значений RGB

ИЛИ ЖЕ

  • 3 канала (красный, зеленый, синий), и в каждом канале есть ключевые точки для этого канала и соответствующие значения в этих ключевых точках для красного, зеленого и синего.

Класс LookupTable может быть построен по-разному, из разных структур данных.
Я храню 3 внутренних структуры данных:

1. map<point, pixel>
2. vector<pixel>
3. struct my{
map<float, value> red;
map<float, value> green;
map<float, value> blue; }

Класс LookupTable может быть построен из 1 или же 3 а также 2 всегда рассчитывается, поэтому «зависит» от них.

Проблемы:

  1. как узнать из какой структуры данных (1 или же 3) я должен рассчитать 2 ?
  2. если первый 1 заполнен, то 3 заполнен, как следить за тем, что происходит в моем классе? Шаблон наблюдателя кажется излишним …
  3. Простое решение — использовать несколько логических значений — не очень хорошо, сложно поддерживать и добавлять новые представления данных в будущем, даже я это понимаю.
  4. В идеале,

construct(map<point, pixel>) ИЛИ ЖЕ

construct(struct my)

нужно выполнить только один раз, а в другой раз он вызывается — просто вернуть значение

(Эти методы вместо конструкторов, которые являются частными)

0

Решение

У вас должен быть только один способ сделать что-то в вашей реализации. Нет необходимости хранить разные структуры для достижения одной и той же цели. Просто предоставьте пользователю два фасада через ваш публичный API.

Если предположить, pixel выглядит примерно так (предупреждение о псевдокоде):

class pixel{
float red, green, blue;
pixel(float, float, float);
float getRed();
...
}

Тогда ваш LookupTable (кстати, ужасное имя … ColourPanel или что-то в этом роде будет более наглядным):

class LookupTable{
std::map<point, pixel> pointColours;
void colourThePoint(point, pixel);
void colourThePoint(point, float, float, float);
// the pixel returned gives them "getRed" "getGreen" etc...
// So Don't Repeat Yourself (DRY) by replicating that functionality here.
pixel getThePointColout(point);
void applyManipulation(std::function<void(pixel)> manip) {
std::for_each( pointColours.begin(), pointColours.end(), manip );
}
...
}

НА ОСНОВЕ ВАШИХ КОММЕНТАРИЙ Я добавил способ применить функцию манипуляции к элементам.
Эта функция манипуляции может выглядеть примерно так:

void colourMePurple( pixel& original ){
pixel.increaseBlue(32).increaseRed(32).decreaseGreen(32);
}

И будет использоваться так:

LookupTable myColours;
...
myColours.applyManipulation(colourMePurple);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]