Russian Qt Forum
Май 04, 2024, 18:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 38 39 [40] 41 42 ... 88   Вниз
  Печать  
Автор Тема: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].  (Прочитано 752903 раз)
b-s-a
Гость
« Ответ #585 : Октябрь 03, 2011, 22:43 »

Ревизия текущего состояния библиотеки:
1. Считаю, что методы SerialPortPrivate::setReadNotificationEnabled и пр. следует перенести в AbstractSerialPortPrivate. В том числе и нотификатор, дабы не плодить сущностей.
2. Считаю, что SerialPort не должен вызывать приватные/защищенные методы SerialPortPrivate/AbstractSerialPortPrivate (начал работать с этим, но лучше пусть автор сделает)
3. serialport_p.h, думаю, стоит разделить по архитектурам. Не нравятся мне такие нагромождения.

Работоспособность библиотеки пока еще не проверял, но под Linux компилировал.
Все мои изменения в MR.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #586 : Октябрь 04, 2011, 08:01 »

2 b-s-a

Спасибо огромное.
Я вот жду жду пока кто-то покритикует и наставит на путь истинный,
а то что-то зачумел совсем Улыбающийся
Цитировать
1. Считаю, что методы SerialPortPrivate::setReadNotificationEnabled и пр. следует перенести в AbstractSerialPortPrivate. В том числе и нотификатор, дабы не плодить сущностей.
Ок, вечером сделаем. Я и сам думал об этом.

Цитировать
2. Считаю, что SerialPort не должен вызывать приватные/защищенные методы SerialPortPrivate/AbstractSerialPortPrivate (начал работать с этим, но лучше пусть автор сделает)
Согласен.
Т.е. типа их (эти приватные/защищенные методы) сделать открытыми?
Но лучше примерчик замерж.

Цитировать
3. serialport_p.h, думаю, стоит разделить по архитектурам. Не нравятся мне такие нагромождения.
Ок. Мне тоже уже не нравится.
Вопросы:
При раскидке по архитектурам, имя класса SerialPortPrivate оставлять таким же или что-то типа WinSerialPortPrivate, UnixSerialPortPrivate, и т.п. ?
И если имя менять - то как быть с конструкторами SerialPort:
Цитата: cpp
SerialPort::SerialPort(QObject *parent)
: QIODevice(parent)
, d_ptr(new SerialPortPrivate(this)) // << вот с этим именем SerialPortPrivate как быть тогда?
{
}

Цитировать
Все мои изменения в MR.
Ок, посмотрел, вечером объединю всё.
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #587 : Октябрь 04, 2011, 20:34 »

Цитата: kuzulis
Цитата: b-s-a
1. Считаю, что методы SerialPortPrivate::setReadNotificationEnabled и пр. следует перенести в AbstractSerialPortPrivate. В том числе и нотификатор, дабы не плодить сущностей.
Ок, вечером сделаем. Я и сам думал об этом.
Нет, нифига при таком подходе не получается.
ИМХО, все-таки нужно было делать через промежуточный класс engine

2 b-s-a
Также глянул твой цикл где ты применяешь бинарный поиск и заметил, что если скорость будет равна 4000000 бод, то она в
список не добавится, т.к. её адрес равен standardRates_end.
Нужно наверное в массив еще добавить любое значение больше чем 4000000 - и тогда должно работать. Не?
« Последнее редактирование: Октябрь 04, 2011, 20:44 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #588 : Октябрь 04, 2011, 20:36 »

С именами варианта 2:
1. Для всех архитектур одно имя
2. Для каждой архитектуры свое имя, но в конце хидера typedef на общее имя. typedef лучше стоит делать в общем хидере, который будет условно подключать нужный платформенный.

Цитировать
Нет, нифига при таком подходе не получается.
ИМХО, все-таки нужно было делать через промежуточный класс engine
Почему не получается? Сделай их абстрактными, а в SerialPortPrivate переопредели. Какие проблемы?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #589 : Октябрь 04, 2011, 20:47 »

Цитировать
Почему не получается? Сделай их абстрактными, а в SerialPortPrivate переопредели. Какие проблемы?
С нотификатором хрень получается. Хотя.. хз..

Не, переопределять
Цитировать
    bool isReadNotificationEnabled() const;
    void setReadNotificationEnabled(bool enable);
    bool isWriteNotificationEnabled() const;
    void setWriteNotificationEnabled(bool enable);
скорее всего не придется, т.к. у этих методов одна и таже реализация.


ЗЫ:
И глянь выше мое сообшение (я отредактировал) про бинарный поиск.
« Последнее редактирование: Октябрь 04, 2011, 20:53 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #590 : Октябрь 05, 2011, 11:14 »

Также глянул твой цикл где ты применяешь бинарный поиск и заметил, что если скорость будет равна 4000000 бод, то она в
список не добавится, т.к. её адрес равен standardRates_end.
Нужно наверное в массив еще добавить любое значение больше чем 4000000 - и тогда должно работать. Не?
Именно что "не". Смотри, если у тебя массив из N элементов, то что лежит по индексу N (ведь *(array + N) - это аналог array[N])?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #591 : Октябрь 05, 2011, 14:04 »

>Именно что "не". Смотри, если у тебя массив из N элементов, то что лежит по индексу N (ведь *(array + N) - это аналог array[N])?
Да, точно, по индексу N переменная будет за пределом (N-1) массива лежать и в ней будет всякая хрень. Тупил ночью  Строит глазки

Но с архитектурой приватных классов библиотеки срочно нужно что-то предпринять/переделать. А то какая то хрень получилась.
Но вот что - хз.
« Последнее редактирование: Октябрь 05, 2011, 14:07 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #592 : Октябрь 05, 2011, 16:09 »

И какая же?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #593 : Октябрь 05, 2011, 16:58 »

И какая же?
ХЗ какая, но я вот предлагаю теперь такую, с учетом твоих пожеланий о разделении по платформам.
Я приаттачил простенький проектик с наброском новой архитектуры.

Там изменения коснулись только приватных классов SerialPortPrivate и SerialPortNotifier.
Теперь классы SerialPortPrivate и  SerialPortNotifier являются абстрактными, и имеют статический метод create(),
который создает наследников SerialPortPrivate и SerialPortNotifier в зависимости от платформы.

т.е. наследниками являются WinSerialPortPrivate, UnixSerialPortPrivate  и т.п., WinSerialPortNotifier , UnixSerialPortNotifier и т.п.
и, соответственно, теперь в конструкторе SerialPort вместо
Код
C++ (Qt)
SerialPort::SerialPort(QObject *parent)
   : QIODevice(parent)
   , d_ptr(new SerialPortPrivate(this))
{}
 
теперь
Код
C++ (Qt)
SerialPort::SerialPort(QObject *parent)
   : QObject(parent)
   , d_ptr(SerialPortPrivate::create(this))
{
}
 

В общем, зацени наметаным глазом, если будет время (желательно побыстрее).
« Последнее редактирование: Октябрь 08, 2011, 21:52 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #594 : Октябрь 05, 2011, 21:41 »

Можно и так. А можно реализацию этого SerialPortPrivate::create кинуть в платформенные cpp-файлы.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #595 : Октябрь 05, 2011, 23:38 »

Цитировать
Там изменения коснулись только приватных классов SerialPortPrivate и SerialPortNotifier.
Теперь классы SerialPortPrivate и  SerialPortNotifier являются абстрактными, и имеют статический метод create(),
который создает наследников SerialPortPrivate и SerialPortNotifier в зависимости от платформы.

.е. наследниками являются WinSerialPortPrivate, UnixSerialPortPrivate  и т.п., WinSerialPortNotifier , UnixSerialPortNotifier и т.п.


А почему не выбрали для всех архитектур одно имя? Зачем так сложно: абстрактный класс, наследование, статический метод? API данных класов я так понимаю одинаковое. Разместить объявление в одном общем *.h и разнести определение по *.cpp для каждой платформы: *_win.cpp, *_unix.cpp, *_mac.cpp, etc.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
b-s-a
Гость
« Ответ #596 : Октябрь 06, 2011, 10:39 »

А почему не выбрали для всех архитектур одно имя? Зачем так сложно: абстрактный класс, наследование, статический метод? API данных класов я так понимаю одинаковое. Разместить объявление в одном общем *.h и разнести определение по *.cpp для каждой платформы: *_win.cpp, *_unix.cpp, *_mac.cpp, etc.
В принципе, можно и так. Но... У всех приватных классов есть общие данные. Логично их вынести в общий предок, чтобы не дублировать код. А виртуальные методы были сделаны для того, чтобы добавить немного контроля над реализациями...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #597 : Октябрь 06, 2011, 11:37 »

Цитировать
У всех приватных классов есть общие данные. Логично их вынести в общий предок, чтобы не дублировать код.

Да, с этим согласен. Общие данные нужно вынести конечно

2 b-s-a: А эти данные общие для SerialPortPrivate и SerialPortNotifier или у этих классов свои данные?
« Последнее редактирование: Октябрь 06, 2011, 11:41 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
b-s-a
Гость
« Ответ #598 : Октябрь 06, 2011, 13:06 »

Notifier, я так понимаю, входит в состав Private в виде члена. Не помню точно, но кажется он платформозависимый.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #599 : Октябрь 06, 2011, 13:33 »

Цитата: pastor
API данных класов я так понимаю одинаковое. Разместить объявление в одном общем *.h и разнести определение по *.cpp для каждой платформы: *_win.cpp, *_unix.cpp, *_mac.cpp, etc.
так оно и было (есть)

Цитата: b-s-a
Notifier, я так понимаю, входит в состав Private в виде члена. Не помню точно, но кажется он платформозависимый.
Именно.

Ну так что, годится новая структура?

Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: 1 ... 38 39 [40] 41 42 ... 88   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.092 секунд. Запросов: 23.