Я пишу свой собственный класс LookupTable, который получает в качестве ввода
ИЛИ ЖЕ
Класс 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
или же 3
) я должен рассчитать 2
?1
заполнен, то 3
заполнен, как следить за тем, что происходит в моем классе? Шаблон наблюдателя кажется излишним …construct(map<point, pixel>)
ИЛИ ЖЕ
construct(struct my)
нужно выполнить только один раз, а в другой раз он вызывается — просто вернуть значение
(Эти методы вместо конструкторов, которые являются частными)
У вас должен быть только один способ сделать что-то в вашей реализации. Нет необходимости хранить разные структуры для достижения одной и той же цели. Просто предоставьте пользователю два фасада через ваш публичный 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);
Других решений пока нет …