Структуры данных и их состояния

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Ответить
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

28 май 2004, 10:49

Предлагаю ещё одну тему для обсуждения, это не совсем алгоритм но всеже этот раздел больше всего подходит для неё. Надеюсь я не слишком тут увлёкся и кто-нить да и дочитает до конца.

Короче у меня есть какой-то обьект, допустим окно с текстом. У него есть несколько параметров, такие например как цвет фона, цвет текста, параметры шрифта, фоновая картинка и т.п. (как наверно уже догадались речь идет о скинабельности). Все параметры описываются ну например в xml.

Кроме параметров у обьекта есть ещё и состояния. Самые основные это выбран обект или нет. Кроме основных могут быть ещё и неограниченное количество лубых состояний которые нужны этому обьекту. Ну там например если это окно предназначенно для вывода текущего дня недели, у него дополнительно есть 2 состояния - выходные и будни например, в выходные надо писать текст одним цветом в будни другим.

Теперь как это описывается. В для любого из состояний можно задать специфические для этого состояния параметры. Ну например для состояния когда окно выделено можно задать другой цвет фона, или болдовый шрифт для надписи. Так же как и для состояния выходных можно изменить цвер текста.

Проблема в том, как описать эти состояния в самом обьекте. Я сперва сделал структуру в которой отбьявил все параметры состояния. И создал два экземпляра этой структуры для выделенного и не выделенного состояния. Сначала записал туда все дефолтовые значения а потом поверх специфические для этих состояний значения. И при отрисовке выбирается одно из состояний и берутся его параметры. Тут все нормально.
Но когда появляются другие перекрывающиеся состояния возникает большая проблема. Т.е. если обект например выделен и сейчас выходной день, он должен кроме дефолтовых значений учесть специфические значения для как для выделенного состояния так и для состояния выходных. Если взять структуру в которой хранится состояние выделенного и скопировать туда структуру выходного, то она перепишет все её не нужные параметры. Ну т.е.

Код: Выделить всё

состояние: номальное
{
  цвет фона - белый // дефолтовое 
  цвет текста - черный // дефолтовое 
}

состояние: выделенное
{
  цвет фона - синий //специфическое 
  цвет текста - черный  //дефолтовое 
}

состояние: будни
{
  цвет фона - белый // дефолтовое 
  цвет текста - черный // дефолтовое 
}

состояние: выходные 
{
  цвет фона - белый // дефолтовое 
  цвет текста - красный //специфическое 
}

состояние: выделенное + выходные //которое болжно быть по логике
{
  цвет фона - синий //специфическое 
  цвет текста - красный //специфическое 
}

Короче проблема в том, как частично обьединить структуры, конечно можно делать флаг для каждого елемента структуры, но как-то это слишком уж топорно. Может кто знаком с более изяящным способом обьединения? Или что вообще можно в данной ситуатции может совсем другой подход какой-нить?
Я вот подумал ещё, что можно сразу на стадии создания структур создать по структуре для всех комбинаций состояний. Т.е. номальное+будни, нормальное+выходные, выделенное+будни и выделенное+выходные, но в этом случае если будет расти количество перекрестных состояний, может получиться очень приличный обьем этих структур
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

30 май 2004, 00:21

IMHO, нужно задать дефолтовое состояние для всех параметоров, а для элементарных состояний (назовем так) задавать только недефолтовые значения параметров. Например:

Код: Выделить всё

состояние: номальное (дефолтовое)
{ 
  цвет фона - белый // дефолтовое 
  цвет текста - черный // дефолтовое 
} 

состояние: выделенное 
{ 
  цвет фона - синий //специфическое 
} 

состояние: будни 
{ 
} 

состояние: выходные 
{ 
  цвет текста - красный //специфическое 
} 

состояние: выделенное + выходные //как и должно быть по логике :)
{ 
  цвет фона - синий //специфическое 
  цвет текста - красный //специфическое 
} 
Если параметры эл.состояний могут пересекаться , можно для них дополнительно определить приоритеты и реализовать соотв. логику присваивания.
Ответить