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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Стиль программирования: глобальные функции vs инкапсулированные  (Прочитано 6197 раз)
Odyssey
Гость
« : Март 30, 2011, 16:10 »

Добрый день!
У меня общий вопрос о том, как надежнее и/или эффективнее объявить некие функции, которые могут пригодиться для нескольких классов.

Например, есть формы двух классов, в поля которых вводится фамилия. Нужно проверить ее правильность.
Как выполнить функцию проверки фамилии? Реализовать ее как глобальную один раз или по отдельности внутри разных классов?

Или еще более сложная функция, устанавливающая второе подключение к БД и считывающая из таблицы определенные данные. Алгоритм одинаков, но он используется сразу в двух разных классах. Ставить ее глобальной почему-то неуютно: кажется, будто нарушается принцип инкапсуляции...

Можно что-нибудь посоветовать или всё зависит от ситуации и решающего преимущества ни одна техника не имеет? Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 30, 2011, 16:27 »

Зачем по 10 раз писать одно и то же? Подмигивающий
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Март 30, 2011, 17:40 »

Добрый день!
У меня общий вопрос о том, как надежнее и/или эффективнее объявить некие функции, которые могут пригодиться для нескольких классов.

Например, есть формы двух классов, в поля которых вводится фамилия. Нужно проверить ее правильность.
Как выполнить функцию проверки фамилии? Реализовать ее как глобальную один раз или по отдельности внутри разных классов?

Или еще более сложная функция, устанавливающая второе подключение к БД и считывающая из таблицы определенные данные. Алгоритм одинаков, но он используется сразу в двух разных классах. Ставить ее глобальной почему-то неуютно: кажется, будто нарушается принцип инкапсуляции...

Можно что-нибудь посоветовать или всё зависит от ситуации и решающего преимущества ни одна техника не имеет? Улыбающийся
Напр так
Код
C++ (Qt)
class MyFormUtils {
public:
 static bool CheckName( const QString & name );
 static bool CheckTable( ... );
 static ...
 
};
 
// использование
..
if (!MyFormUtils::CheckName(name)) {..
 
По существу - глобальная ф-ция, но это хорошо видно
Записан
set
Гость
« Ответ #3 : Март 30, 2011, 17:48 »

можно конечно написать общий класс со всеми функциями проверки а потом отнаследоваться от этого класса... но я бы сделал как Igors
Записан
asvil
Гость
« Ответ #4 : Март 30, 2011, 18:12 »

А зачем так много думать. Нужна функция - сделайте. Нужно заюзать еще где-нибудь - вынесите в отдельные *.c/h. Начала конфликтовать с другими функциями (что вообщем-то редко случается, если не специально) оберните пространством имен. Зачем Вы придумываете себе проблемы там, где их еще нет?
Записан
Akon
Гость
« Ответ #5 : Март 30, 2011, 18:59 »

+1
Записан
madRoger
Гость
« Ответ #6 : Март 30, 2011, 21:46 »

Как известно, все программы используют функции операционной системы. Для этого функции ОС объединяют в библиотеки. Например в Windows это dll-ки. Может вам просто создать свою библиотеку.
Записан
Fat-Zer
Гость
« Ответ #7 : Март 30, 2011, 21:56 »

Как известно, все программы используют функции операционной системы. Для этого функции ОС объединяют в библиотеки. Например в Windows это dll-ки. Может вам просто создать свою библиотеку.
а к библиотеке нужен хедер с биндингами cpp. И как лучше его оформить его содержимое? в виде хедера с глобальными функциями, или в виде класса со статическими методами, или в виде обычных классов? Так к чему это я... вопросы проектирования и стиля не решаются тем во что это упаковывать.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Март 30, 2011, 22:16 »

По вопросам проектирования лучше обратиться к соответствующей литературе. Рекомендую книги серии C++ In-Depth.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
madRoger
Гость
« Ответ #9 : Март 30, 2011, 22:25 »

Цитировать
Например, есть формы двух классов, в поля которых вводится фамилия. Нужно проверить ее правильность.
Как выполнить функцию проверки фамилии? Реализовать ее как глобальную один раз или по отдельности внутри разных классов?
А вы не рассматривали следующий вариант: оба этих класса сделать потомками одного родителя, у которого реализовать функцию проверки правильности фамилии.
Цитировать
еще более сложная функция, устанавливающая второе подключение к БД и считывающая из таблицы определенные данные. Алгоритм одинаков, но он используется сразу в двух разных классах. Ставить ее глобальной почему-то неуютно: кажется, будто нарушается принцип инкапсуляции...
Аналогично.

Это как вариант, конечно если это реально и не разрушит вашу иерархию классов.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Март 31, 2011, 07:20 »

А вы не рассматривали следующий вариант: оба этих класса сделать потомками одного родителя, у которого реализовать функцию проверки правильности фамилии.
Нередко бывает что ф-ция не использует ни один член класса, поэтому наследование "не в масть". Согласен что это "не горит" и можно какое-то время обойтись "просто ф-цией". Однако с ростом проекта число "ничьих" утилит увеличивается и начинает мешать/раздражать, выделять их в namespace или static класс все равно придется.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Март 31, 2011, 08:42 »

Цитировать
выделять их в namespace или static класс все равно придется.
Либо использовать старый и проверенный способ - просто добавить namespace-подобный префикс к имени функции )
Записан

Qt 5.11/4.8.7 (X11/Win)
Odyssey
Гость
« Ответ #12 : Март 31, 2011, 09:04 »

Всем большое спасибо! )) Будем думать и прикидывать...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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