Russian Qt Forum

Qt => Общие вопросы => Тема начата: Odyssey от Март 30, 2011, 16:10



Название: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: Odyssey от Март 30, 2011, 16:10
Добрый день!
У меня общий вопрос о том, как надежнее и/или эффективнее объявить некие функции, которые могут пригодиться для нескольких классов.

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

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

Можно что-нибудь посоветовать или всё зависит от ситуации и решающего преимущества ни одна техника не имеет? :)


Название: Re: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: Пантер от Март 30, 2011, 16:27
Зачем по 10 раз писать одно и то же? ;)


Название: Re: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: Igors от Март 30, 2011, 17:40
Добрый день!
У меня общий вопрос о том, как надежнее и/или эффективнее объявить некие функции, которые могут пригодиться для нескольких классов.

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

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

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


Название: Re: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: set от Март 30, 2011, 17:48
можно конечно написать общий класс со всеми функциями проверки а потом отнаследоваться от этого класса... но я бы сделал как Igors


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


Название: Re: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: Akon от Март 30, 2011, 18:59
+1


Название: Re: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: madRoger от Март 30, 2011, 21:46
Как известно, все программы используют функции операционной системы. Для этого функции ОС объединяют в библиотеки. Например в Windows это dll-ки. Может вам просто создать свою библиотеку.


Название: Re: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: Fat-Zer от Март 30, 2011, 21:56
Как известно, все программы используют функции операционной системы. Для этого функции ОС объединяют в библиотеки. Например в Windows это dll-ки. Может вам просто создать свою библиотеку.
а к библиотеке нужен хедер с биндингами cpp. И как лучше его оформить его содержимое? в виде хедера с глобальными функциями, или в виде класса со статическими методами, или в виде обычных классов? Так к чему это я... вопросы проектирования и стиля не решаются тем во что это упаковывать.


Название: Re: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: Пантер от Март 30, 2011, 22:16
По вопросам проектирования лучше обратиться к соответствующей литературе. Рекомендую книги серии C++ In-Depth.


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

Это как вариант, конечно если это реально и не разрушит вашу иерархию классов.


Название: Re: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: Igors от Март 31, 2011, 07:20
А вы не рассматривали следующий вариант: оба этих класса сделать потомками одного родителя, у которого реализовать функцию проверки правильности фамилии.
Нередко бывает что ф-ция не использует ни один член класса, поэтому наследование "не в масть". Согласен что это "не горит" и можно какое-то время обойтись "просто ф-цией". Однако с ростом проекта число "ничьих" утилит увеличивается и начинает мешать/раздражать, выделять их в namespace или static класс все равно придется.


Название: Re: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: GreatSnake от Март 31, 2011, 08:42
Цитировать
выделять их в namespace или static класс все равно придется.
Либо использовать старый и проверенный способ - просто добавить namespace-подобный префикс к имени функции )


Название: Re: Стиль программирования: глобальные функции vs инкапсулированные
Отправлено: Odyssey от Март 31, 2011, 09:04
Всем большое спасибо! )) Будем думать и прикидывать...