powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / пример по принципам архитектуры SOLID
5 сообщений из 5, страница 1 из 1
пример по принципам архитектуры SOLID
    #38735235
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет.
в очередной раз столкнулся со стандартной задачей и стало интересно, как ее могут решить другие люди.
упрощенное описание такое:
имеются сведения об произошедших событиях (все равно каких). каждое событие имеет тип и свой набор атрибутов (тип для упрощения пусть целый).
требуется сформировать свое строковое представление для типа события со значением 2 и свое представление для всех остальных типов для выгрузки представления как word документ на клиента на web странице.
нужно учесть, что в будущем может потребоваться реализовать свое представление для типов событий 3, 4, 5 и т.п. - из заданного списка.
для описания представления предлагаю вот такой интерфейс

Код: c#
1.
2.
3.
4.
5.
public interface IDefaultEventView
    {
        MyEvent EventItem { get; set; }
        StringBuilder CreateEventOutput();
    }


строковое представление события для типа 2 пусть описывается такой его реализацией

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  public class ConnectDeviceEventView : IDefaultEventView
    {
        public MyEvent EventItem { get; set; }

        public StringBuilder CreateEventOutput()
        {
            var sb = new StringBuilder();
            sb.AppendFormat("<b>{0}</b>",EventItem.Description);
            return sb;
        }
    }


строковое представление для всех остальных типов пусть описывается такой реализацией

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public class DefaultEventView : IDefaultEventView
    {
        public MyEvent EventItem { get; set; }

        public StringBuilder CreateEventOutput()
        {
            var sb = new StringBuilder();
            sb.AppendLine(EventItem.Description);
            return sb;
        }
    }



по-моему классы для реализации представления события я сделал вполне приемлемо.

поскольку точно сказано, что выводиться в Http контекст, будем жить проще и сделаем такую функцию вывода для любой реализации представлений
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 private static void WriteEventView(HttpResponse stream, IDefaultEventView viewer)
        {
            var sb = viewer.CreateEventOutput();
            var sr = new StringReader(sb.ToString());
            do
            {
                string line = sr.ReadLine();
                stream.Write(line);
                stream.Write("\r\n");
                stream.Flush();
            }
            while (sr.Peek() != -1);
            sr.Close();
        }



возникает необходимость иметь универсальный механизм выбора этих представлений в зависимости от типа.
вот реализация для обсуждения
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 public class EventViewFactory
    {
        public MyEvent EventItem { get; set; }

        public EventViewFactory(MyEvent eventItem)
        {
            EventItem = eventItem;
        }

        public IDefaultEventView ViewerInstance()
        {
            IDefaultEventView result;
            if (EventItem.EventType == 2)
            {
                result= new ConnectDeviceEventView();
            }
            else
            {
                result= new DefaultEventView();
            }
            return result;
        }
    }



ну и вызывать отображение представления можно примерно так ( считаем, что имеем корректно созданный http контекст)
Код: c#
1.
2.
3.
4.
5.
6.
7.
  static void Main(string[] args)
        {
            var event1 = new MyEvent() { EventType = 2 };
            var factory = new EventViewFactory(event1);
            HttpResponse stream = new HttpResponse(null);// закрываем глаза на это :)
            WriteEventView(stream, factory.ViewerInstance());
        }




по-моему, классы для реализации представлений я реализовал правильно, по SOLID.
вот смущает реализация выбора экземпляра нужного представления - это я и хотел обсудить.
кто какие другие реализации этой задачи может предложить?
...
Рейтинг: 0 / 0
пример по принципам архитектуры SOLID
    #38737245
Фотография @k@DElpher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде как получился паттерн стратегия.
А вот выбор конкретной стратегии отдается клиенту.
Ну разве что передать эту задачу MyEvent, чтоб он для себя выбирал нужную стратегию(представление), но вряд ли вас такой вариант интересует. И тема вроде ближе к разделу программирования)
...
Рейтинг: 0 / 0
пример по принципам архитектуры SOLID
    #38737821
WebSharper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
пример по принципам архитектуры SOLID
    #38739098
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@k@DElpher,

так вопрос то в том как выгод организовать выбор - стратегия или еще как нибудь.
в принципе можно еще использовать абстрактную фабрику.
а при использовании стратегии нужно еще выбрать какую именно стратегию создать.
...
Рейтинг: 0 / 0
пример по принципам архитектуры SOLID
    #38742608
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrU,
а вы не мудрствуйте.
Рано или поздно, всё равно приходится выбирать через простой if ....case ))))
- выбор в ОСи винды типов событий как раз такой;
- можно ещё посмотреть реализацию логировщиков (Log4j) котрые всё многообразие сообщений выводят в строку.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / пример по принципам архитектуры SOLID
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]