Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
3 / 3 / 1
Регистрация: 28.11.2015
Сообщений: 108
1

Как и какие идиомы и паттерны можно (и лучше) применять?

19.04.2018, 13:13. Показов 1793. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Писал я проги для себя ну и так по мелочи, для абы кого, да и проги абы как, не задумываясь о том как какие идиомы (паттерны) можно применять, так получилось что узнал я значит про все и теперь сижу и ломаю голову как все это лучше сделать.
Вот к примеру решил я написать класс Service(создание объектов и предоставление доступа к методам get send) хотел сделать Паттерн Factory Method , для управления сетевыми соединениями (Tcp, serial, ну и тд.) после установки соединения от них нужны методы get и send, с этим понятно, а вот контроль создания Tcp можно отдать Service но так получилось что Tcp у меня singleton и он уже контролирует сам себя.

Добавлено через 21 час 4 минуты
решил я сильно голову не греть и потихоньку приводить проект в нормальный вид, а там уж что получится ))
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2018, 13:13
Ответы с готовыми решениями:

Какие методы есть в C++ для работы с файлами и в каких случаях какой лучше применять
Какие методы есть в С++ для работы с файлами и в каких случаях какой лучше применять? обычно...

Какие паттерны используются в программе и для чего?
Помогите, пожалуйста, разобраться. Определите какие паттерны в программе. для чего они там? class...

Какие паттерны можно применить в данной задачи
Было задание ,интересно, как можно еще решить(какие паттерны проектирования можно применить) есть...

Игра точки. Какие паттерны можно применить?
Пишу курсач по ООП на Java с использованием Swing, тема - игра "точки". Нужно применить хотя бы по...

14
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2018, 13:17 2
Лучший ответ Сообщение было отмечено IGPIGP как решение

Решение

Молодец.
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
19.04.2018, 13:59 3
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
так получилось что Tcp у меня singleton и он уже контролирует сам себя.
Вы уверены что это хорошая идея? Обычно программа может открыть несколько соединений с разными адресами, единственное соединение это все же скорее исключение.
Контроль создания (наверное, подключения?) возможно стоит отдать самому объекту соединения и уже в его "статусе" смотреть подключилось или нет.
Впрочем, саму задачу вы не раскрыли, так что все это только общие соображения, которые в вашем случае могут оказаться совсем неверными.
0
3 / 3 / 1
Регистрация: 28.11.2015
Сообщений: 108
19.04.2018, 14:30  [ТС] 4
COKPOWEHEU, вот Tcp может работать с несколькими соединениями, при новом соединении на стороне сервера Мы получаем новый соккет, а все остальное остается неизменным. Но объект TCP один поэтому и singleton, а вот Serial можно много открывать, Думаю можно создать один SuperSerial для много serial и а при создании объекта получать дескриптор (ключ) по которому отправлять данные в нужный serial. Хотя я пытался что то похожее сделать но запутался и откатился назад.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Контроль создания (наверное, подключения?) возможно стоит отдать самому объекту соединения
RAII идиому хочу по отношению к serial применить. ? Разве правильно что объект будет сам себя контролировать. Если при инициализации будет ошибка вызову деструктор. Зачем объект нерабочий нужен.

Добавлено через 3 минуты
в общем раньше я не парился ))) а сейчас все же охота порядок навести, да и читаемость кода улучшится RAII мне за это и нравится постараюсь полностью избавится от лишних seting ов
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
19.04.2018, 16:09 5
Я бы скорее делал на каждое соединение отдельный объект, но это уже вкусовщина.
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
а вот Serial можно много открывать
Что такое Serial? COM-порт, UDP-соединение?
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
Разве правильно что объект будет сам себя контролировать
А с другой стороны меньше связей с другими объектами, меньше разделения ответственности. В целом это опять вкусовщина.
Любую задачу можно решить несколькими способами. А еще несколькими правильными способами.
Все эти паттерны и идеологии нужны для того чтобы было проще использовать код повторно или выдрать отдельный объект (не обязательно в терминах ООП, это может быть пара cpp-h файлов) и отладить его максимально изолировано. Или просто навести порядок с уровнями абстракции, чтобы низкий уровень железа и битов не смешивался с высоким уровнем конкретных задач и объектов.
1
3 / 3 / 1
Регистрация: 28.11.2015
Сообщений: 108
19.04.2018, 16:17  [ТС] 6
Serial это com , про паттерны я и не задумывался "было проще использовать код повторно или выдрать "
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
23.04.2018, 10:29 7
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
Serial это com
А в чем разница? Что COM-портов может быть несколько, что TCP-соединений. А в некоторых случаях и по нескольку слушателей на "том конце" интерфейса.
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
про паттерны я и не задумывался
Ну вы же хотите их использовать не только "чтобы было", а чтобы упростить разработку.
0
3 / 3 / 1
Регистрация: 28.11.2015
Сообщений: 108
23.04.2018, 11:38  [ТС] 8
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А в чем разница? Что COM-портов может быть несколько, что TCP-соединений.
http://rsdn.org/article/unix/sockets.xml
Функция accept создаёт для общения с клиентом новый сокет и возвращает его дескриптор. Параметр sockfd задаёт слушающий сокет. После вызова он остаётся в слушающем состоянии и может принимать другие соединения.. Поэтому и singleton, да и нет необходимости, Вопрос есть про отладку
C++ (Qt)
1
2
3
#ifdef QT_DEBUG
         qDebug() << "TcpSocket is null";
#endif
стоит ли с макросами колдовать ?? может другие варианты есть;
отладка нужна ведь только мне и когда все будет отлажено нужно ее убрать из кода.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
23.04.2018, 13:29 9
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
Параметр sockfd задаёт слушающий сокет. После вызова он остаётся в слушающем состоянии и может принимать другие соединения.
TCP предназначен для связи двух собеседников. Вы открываете сокет, ждете пока постучится клиент и создаете с ним связь. Если постучится второй клиент, для него можно открыть другой сокет и так далее. И даже разнести эти сокеты по разным потокам. Именно по TCP, правда, только теорию читал, а вот с UDP хочу повозиться на практике, и там предполагается либо один общий сокет для всех клиентов и фильтрация по IP, либо на каждого свой. Пока не знаю как лучше, там видно будет.
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
стоит ли с макросами колдовать ?? может другие варианты есть;
assert()'а не хватит?
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
отладка нужна ведь только мне и когда все будет отлажено нужно ее убрать из кода.
"когда все будет отлажено"! Какой оптимизм. Лучше настроить уровни предупреждений, чтобы собранная с максимальным уровнем писала в логи вообще все и как можно подробнее, а с минимальным (когда ее уже можно отдавать пользователям) - только о самых важных ошибках, которые они могут сами исправить. Никто ведь не застрахован от неправильного ввода или опечаток в коде.
Собственно, я бы предложил логи вообще не отключать.
0
3 / 3 / 1
Регистрация: 28.11.2015
Сообщений: 108
23.04.2018, 14:37  [ТС] 10
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
qDebug() << "TcpSocket is null"
ну это у меня не совсем даже и ошибка просто исключительная ситуация, можно конечно сообщения для пользователя написать "! Alarm TcpSocket is null", пытаюсь минимальный функционал сделать, наверное так и оставлю потом просто signal message("blabla") сделаю вместо qDebug();
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
23.04.2018, 15:29 11
Как вариант - обмазать все макросами:
C
1
2
3
4
5
6
7
8
9
10
11
#define DEBUG
 
#ifdef DEBUG
  #define DBGIF(cond, func...) do{if(cond){func}}while(0)
#else
  #define DBGIF(cond, cunc...)
#endif
 
int main(){
  DBGIF(1>0, printf("AA\n"); printf("BB\n"););
}
В варианте дебага в исходник добавится весь код отладочного вывода, в варианте бага - не добавится. Хотя такая запись макроса, конечно, немного мозговыносящая

Добавлено через 34 минуты
Да, кстати. Вы можете поменять название на более осмысленное? Ну хотя бы "подгонка архитектуры под идеологию RAII"
0
3 / 3 / 1
Регистрация: 28.11.2015
Сообщений: 108
27.04.2018, 04:31  [ТС] 12
Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Как вариант - обмазать все макросами:
решил не обмазывать ))) сделал вот так
C++ (Qt)
1
2
3
4
5
6
#ifdef SERIAL_MODBUS_DEBUG
   connect(this, &SeriaModbus::message, this, [] (QString str)
   {
      qDebug() << str << "<-- SerialModbus";
   });
#endif
а дальше по коду
C++ (Qt)
1
 emit message("bla bla");
0
3 / 3 / 1
Регистрация: 28.11.2015
Сообщений: 108
28.04.2018, 22:43  [ТС] 13
Есть вопрос, в общем есть 2 класса (A, B)с похожим функционалом унаследованные от 1 Абстрактного родителя, классы собирают инфу с сетевых портов (COM, и TCP), что я сделал создал класс SuperService создаю там объекты классов (A, B) соединяю сигналы этих классов с методами SuperService, правильный подход или можно было как то лучше решить, в конечном итоге задача сводится к аккумулированию информации из разных объектов в одном месте.

Добавлено через 8 минут
и 2 вопрос, принципы ООП заставляют меня создавать больше классов чем обычно (раньше все было в куче), обзор проекта в IDE уже глаз начинает резать, как то можно от этого избавится ?

Добавлено через 37 минут
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
обзор проекта в IDE
пробовал includepath, я так понял но просит чтобы реализация методов была в header файле который подключаю ((
0
621 / 941 / 150
Регистрация: 10.08.2015
Сообщений: 5,018
29.04.2018, 06:12 14
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
принципы ООП заставляют меня создавать больше классов чем обычно
классы нужно создавать исходя из принятой объектной модели. их не может быть больше, чем нужно и тем более больше, чем обычно
0
3 / 3 / 1
Регистрация: 28.11.2015
Сообщений: 108
05.05.2018, 10:29  [ТС] 15
Цитата Сообщение от vlisp Посмотреть сообщение
классы нужно создавать исходя из принятой объектной модели. их не может быть больше, чем нужно и тем более больше, чем обычно
только мне знать сколько их нужно и сколько обычно я создаю в скобках я пояснил почему так
Цитата Сообщение от DVyacheslavN Посмотреть сообщение
больше классов чем обычно (раньше все было в куче),
Вообще может спрятать часть классов в статическую библиотеку ) пока других идей нет. Список классов большой а работаю с 3-4 взаимосвязанными классам, жаль в Qt Creator нет фильтра по избранному.
0
05.05.2018, 10:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2018, 10:29
Помогаю со студенческими работами здесь

Какие паттерны можно использовать для совершенствования приложения
Доброго времени суток! У меня есть приложение реализованное на Qt C++ - тестирование студентов....

Я очень хочу выучить JS. Где и как лучше изучать, с чего начинали вы, какие сайты для изучения лучше использовать?
Здраствуйте , я очень хочу выучить JS и поэтому я спрашиваю на многих форумах и сайтах информацию...

Как применять данные из куков на странице до загрузки страницы или как можно раньше?
Всем привет! Есть примерно следующий код: В хедере подключается библиотека jquery, далее в...

Какие паттерны вы используете чаще всего?
Я не сильно знаком с паттернами. Более-менее представляю себе MVC, Фабрику, может еще парочку. Хочу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru