Паттерн для представления разных состояний
От: Аноним  
Дата: 26.09.10 20:06
Оценка:
C#, ASP.net Веб-проект , есть таблица , по сути подобие баг-трекинга, в зависимости от состояния записи ее нужно отображать по разному. Но состояние не одно, а несколько независимых. Например есть состояния "на исполнении", "не назначено". А есть еще тип проекта "веб", "gui" и т.п. В зависимости от комбинаций этих состояний нужно по разному раскрашивать ( фон, шрифт ), активировать разные линки в какой-то колонке делать активной ссылку, в другой прятать совсем.

Сейчас это делается при помощи if-ов в методе RowBound читается очень плохо, логику работы восприять очень сложно.
Какой паттерн для этих случаев использовать ?
Re: Паттерн для представления разных состояний
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 26.09.10 20:25
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>C#, ASP.net Веб-проект , есть таблица , по сути подобие баг-трекинга, в зависимости от состояния записи ее нужно отображать по разному. Но состояние не одно, а несколько независимых. Например есть состояния "на исполнении", "не назначено". А есть еще тип проекта "веб", "gui" и т.п. В зависимости от комбинаций этих состояний нужно по разному раскрашивать ( фон, шрифт ), активировать разные линки в какой-то колонке делать активной ссылку, в другой прятать совсем.


А>Сейчас это делается при помощи if-ов в методе RowBound читается очень плохо, логику работы восприять очень сложно.

А>Какой паттерн для этих случаев использовать ?

Если у тебя действие зависит от какого-то параметра, то это паттерн Стратегия.
Re: Паттерн для представления разных состояний
От: ZevS Россия  
Дата: 27.09.10 11:43
Оценка:
Здравствуйте, Аноним, Вы писали:

http://en.wikipedia.org/wiki/State_pattern
Re: Паттерн для представления разных состояний
От: okman Беларусь https://searchinform.ru/
Дата: 27.09.10 11:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>C#, ASP.net Веб-проект , есть таблица , по сути подобие баг-трекинга, в зависимости от состояния записи ее нужно отображать по разному. Но состояние не одно, а несколько независимых. Например есть состояния "на исполнении", "не назначено". А есть еще тип проекта "веб", "gui" и т.п. В зависимости от комбинаций этих состояний нужно по разному раскрашивать ( фон, шрифт ), активировать разные линки в какой-то колонке делать активной ссылку, в другой прятать совсем.


А>Сейчас это делается при помощи if-ов в методе RowBound читается очень плохо, логику работы восприять очень сложно.

А>Какой паттерн для этих случаев использовать ?

State, конечно.
А объекты брать из фабрики, чтобы понапрасну память не дергать.
Re[2]: Паттерн для представления разных состояний
От: Lloyd Россия  
Дата: 27.09.10 11:55
Оценка:
Здравствуйте, okman, Вы писали:

А>>Какой паттерн для этих случаев использовать ?


O>State, конечно.

O>А объекты брать из фабрики, чтобы понапрасну память не дергать.

State — не к месту тут. Он нужен, когда у объекта меняется состояние в ходе жизни. Тут, как уже посоветовал gandjustas, больше подходит Статегия.
Re[3]: Паттерн для представления разных состояний
От: ZevS Россия  
Дата: 27.09.10 12:04
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>State — не к месту тут.


Я бы не был настолько категоричен. Неозвученные в исходном посте вводные могут неоднократно все изменить.
Re[4]: Паттерн для представления разных состояний
От: Lloyd Россия  
Дата: 27.09.10 12:06
Оценка:
Здравствуйте, ZevS, Вы писали:

L>>State — не к месту тут.


ZS>Я бы не был настолько категоричен. Неозвученные в исходном посте вводные могут неоднократно все изменить.


Там достаточно озвучено, чтобы понять, что State тут непричем.
Re[5]: Паттерн для представления разных состояний
От: okman Беларусь https://searchinform.ru/
Дата: 27.09.10 14:34
Оценка: -1 :)
Здравствуйте, Lloyd, Вы писали:

L>State — не к месту тут.

L>Там достаточно озвучено, чтобы понять, что State тут непричем.

Там слово "состояние" встречается четыре раза, а "стратегия" — ни разу.
Как по мне, так это верный признак того, что нужно использовать State.
Ну а если серъезно, то нужно намного больше вводных данных, чтобы сказать однозначно.
Re[6]: Паттерн для представления разных состояний
От: Lloyd Россия  
Дата: 27.09.10 14:56
Оценка:
Здравствуйте, okman, Вы писали:

O>Там слово "состояние" встречается четыре раза, а "стратегия" — ни разу.

O>Как по мне, так это верный признак того, что нужно использовать State.

Нет, не нужно. State — это не когда слово "состояние" используется, а когда состояние объекта меняется во времени, это важно.
Re[7]: Паттерн для представления разных состояний
От: ZevS Россия  
Дата: 27.09.10 15:05
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Нет, не нужно. State — это не когда слово "состояние" используется, а когда состояние объекта меняется во времени, это важно.

Ну возможно. Я бы вообще ни тот ни другой паттерн тут не использовал. Привык находить паттерны в дизайне, а не применять для.
Re[7]: Паттерн для представления разных состояний
От: okman Беларусь https://searchinform.ru/
Дата: 27.09.10 15:15
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>State — это не когда слово "состояние" используется, а когда состояние объекта меняется во времени, это важно.


Всегда считал, что паттерны должны выражать решение в терминах задачи.
В общем, готов с Вами и поспорить, но не вижу особого смысла.
Re[8]: Паттерн для представления разных состояний
От: Lloyd Россия  
Дата: 27.09.10 15:20
Оценка:
Здравствуйте, okman, Вы писали:

L>>State — это не когда слово "состояние" используется, а когда состояние объекта меняется во времени, это важно.


O>Всегда считал, что паттерны должны выражать решение в терминах задачи.


Отлично. Перименуем поле "Состояние" в "Статус", так сразу State Pattern исчезнет? Сильно.

O>В общем, готов с Вами и поспорить, но не вижу особого смысла.


Тут нет предмета для спора. Достачточно открыть описание этого паттерна.
Re: Паттерн для представления разных состояний
От: Aikin Беларусь kavaleu.ru
Дата: 27.09.10 15:37
Оценка: +4 :)
Здравствуйте, <Аноним>, Вы писали:

А>Какой паттерн для этих случаев использовать ?

Эээ, как обычно, мой любимый: "Здравый смысл".


А>Сейчас это делается при помощи if-ов в методе RowBound читается очень плохо, логику работы восприять очень сложно.

Не вижу ничего плохого в if-ах, когда они сконцентрированы в одном месте и не мешают восприятию логики (тем более даже фабрика стратегий будет на иф-ах).



В данном же случе мне больше по душе сл. подход (но, боюсь, паттернами там и не пахнет):
(Непонятно зачем здесь стратегия, раз алгоритм рисования всегда один и тот же?)


1) Заводим структуру содержащую всю информацию о стиле:
public class PageStyle 
{
    Color BackgroundColor;
    Font Font;
    
    bool ActivateXYZLink;
    bool HideDFGLink;
}


2) Фабрика стилей:
public PageStyle GetStyleFor(PageState type)
{
    if (type == PageState.InWork)
        return getInWorkStyle();
    if (type == PageState.Assigned)
        return getAssignedStyle();
    if (type == PageState.InQA)
        return getInQAStyle();

    // ...
}


3) Использование:
{
    var style = Styles.GetStyleFor(page.State);
    
    //...
    if (style.ActivateXYZLink)
        //activate
    else
        //deactivate

    //...
}


Как бонус, этот подход легко расширяем для хранения стилей в базе.


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

СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[2]: Паттерн для представления разных состояний
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.09.10 17:09
Оценка: 2 (1)
Здравствуйте, Aikin, Вы писали:

А>>Сейчас это делается при помощи if-ов в методе RowBound читается очень плохо, логику работы восприять очень сложно.

A>Не вижу ничего плохого в if-ах, когда они сконцентрированы в одном месте и не мешают восприятию логики (тем более даже фабрика стратегий будет на иф-ах).
Избыточное количество ифов банально заменяется таблицей.

A>В общем, задачи нужно решать, а не искать какие бы паттерны заиспользовать.


Поймал себя на мысли что полностью прочитал пост ТС только после твоего сообщения.
Обычно в вопросе про паттерны ответ содержится в последнем предложении. Вот и читаю с конца, часто не доходя до середины. А ведь действительно во многих случаях паттерны и не нужны.
Re[3]: Паттерн для представления разных состояний
От: ZevS Россия  
Дата: 27.09.10 19:03
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Обычно в вопросе про паттерны ответ содержится в последнем предложении. Вот и читаю с конца, часто не доходя до середины. А ведь действительно во многих случаях паттерны и не нужны.


Да они если и не нужны, то только чтобы в документации написать или класс назвать. А применять можно некоторые базовые принципы (они же паттерны )), как то: абстракцию, делегирование, разделение (объединение) поведения и данных, диспатчеризицию (данными или поведением)... А уж если их комбинация на выходе дает Визитера, то так и запишем. Я конечно утрирую...
Re[7]: Паттерн для представления разных состояний
От: sVenom Россия  
Дата: 28.09.10 05:20
Оценка:
Спор ниочем. Далеко не всегда можно взять и четко применить паттерн в чистом в виде к определенной проблеме. На мой взгляд здесь более четко прослеживается State, так как именно внутреннее состояние и меняется под действием каких-то внешних факторов.

class AbstractState {
abstract void paint();
}

class Incident {
AssignedState assignedState;
InProgressState inProgressState;
ClosedState closedState;
AbstractState currentState;

void paint() {
...
currentState.paint();
...
}
}

А вот для типа проекта (веб, гуи) наверное больше подойдет стратегия как раз, так как оно часто меняться не будет и скорее всего будет задаваться только один раз при создании.
Re[8]: Паттерн для представления разных состояний
От: Lloyd Россия  
Дата: 28.09.10 06:26
Оценка:
Здравствуйте, sVenom, Вы писали:

V>А вот для типа проекта (веб, гуи) наверное больше подойдет стратегия как раз, так как оно часто меняться не будет и скорее всего будет задаваться только один раз при создании.


Тип проекта тут не вообще не при чем. А по поводу того, что состояние не меняется вы правы, но это-то как раз аргумент против использования State-а.
Re[9]: Паттерн для представления разных состояний
От: okman Беларусь https://searchinform.ru/
Дата: 28.09.10 07:31
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Тут нет предмета для спора. Достачточно открыть описание этого паттерна.


Действительно, тут и так все ясно.
Re[9]: Паттерн для представления разных состояний
От: sVenom Россия  
Дата: 28.09.10 08:18
Оценка:
Я имею ввиду не тип проекта, в котором автор пишет это приложение , а требования, которые он озвучил. У исследуемого объекта есть несколько параметров: статус и тип проекта. Статус меняется часто — используем State. Тип проекта (просто другое поле этого объекта) меняется редко, как правило выставляется только при создании объекта, — используем Strategy.
Получается своеобразный гибрид.
Re[8]: Паттерн для представления разных состояний
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.09.10 08:56
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Lloyd, Вы писали:


L>>State — это не когда слово "состояние" используется, а когда состояние объекта меняется во времени, это важно.


O>Всегда считал, что паттерны должны выражать решение в терминах задачи.


Вобще говоря это так. Но есть нюансы, которые все меняют.

Например — м стейт и стратегия это состояние
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.