Russian Qt Forum

Qt => Общие вопросы => Тема начата: Alex Custov от Октябрь 30, 2011, 18:35



Название: Всегда ли вы используете QString?
Отправлено: Alex Custov от Октябрь 30, 2011, 18:35
Всегда, даже если можно обойтись const char *:

Код
C++ (Qt)
void anotherFunc(const QString &)
{
   ...
}
 
void func()
{
   QString a;
 
   if(...)
       a = "action1";
   else if(...)
       a = "action2";
   else
       a = "action3";
 
   anotherFunc(a);    
}
 

Не всегда, если можно обойтись const char *, и это безопасно:

Код
C++ (Qt)
void anotherFunc(const QString &)
{
   ...
}
 
void func()
{
   const char *a;
 
   if(...)
       a = "action1";
   else if(...)
       a = "action2";
   else
       a = "action3";
 
   anotherFunc(a);    
}
 


Название: Re: Всегда ли вы используете QString?
Отправлено: andrew.k от Октябрь 30, 2011, 19:06
Можно, только зачем?
Какие плюсы у второго куска, по сравнению с первым?


Название: Re: Всегда ли вы используете QString?
Отправлено: Igors от Октябрь 30, 2011, 19:44
Можно, только зачем?
Какие плюсы у второго куска, по сравнению с первым?
Если будет хороший объем текста - то очень существенные


Название: Re: Всегда ли вы используете QString?
Отправлено: Авварон от Октябрь 30, 2011, 19:48
Код
C++ (Qt)
void anotherFunc(const QString &)
{
   ...
}
 
void func()
{
   const char *a;
 
   if(...)
       a = "action1";
   else if(...)
       a = "action2";
   else
       a = "action3";
 
   anotherFunc(QLatin1String(a));    
}
 
fxd


Название: Re: Всегда ли вы используете QString?
Отправлено: andrew.k от Октябрь 30, 2011, 20:11
Где в приведенном примере хороший объем текста?
Понятное дело, что массив чаров быстрее чем QString. Но в большинстве случаев эта разница не существенна.
И что такое существенные? 32 секунды вместо 35?


Название: Re: Всегда ли вы используете QString?
Отправлено: ufna от Октябрь 30, 2011, 22:20
Больших сравнений текста вообще нужно избегать, таким образом по крайней мере :)


Название: Re: Всегда ли вы используете QString?
Отправлено: zenden от Октябрь 30, 2011, 23:34
Экономим на спичках?
Покажите мне код, в котором QString является узкой частью.

Имхо, QString - лучший класс строки, который есть для C++. Очень жаль, что его нельзя использовать не в Qt проектах.
по идее, он должен быть быстрее, чем std::vector, т.к. использует механизм copy-on-write.

А что вы предлагаете делать с char *?? Его даже сравнить нормально нельзя.Использовать  strcmp? (кстати, в стандарте C++ даже нет функции сравнения без учета регистра!! ). Да и вообще, сырые указатели - это не модно и не безопасно.


Название: Re: Всегда ли вы используете QString?
Отправлено: Авварон от Октябрь 30, 2011, 23:35
Экономим на спичках?
Покажите мне код, в котором QString является узкой частью.
QtXml. Только и делает, что гоняет utf-8 (или другую 8битную кодировку внутри xml) в utf-16 и обратно.


Название: Re: Всегда ли вы используете QString?
Отправлено: andrew.k от Октябрь 30, 2011, 23:59
Больших сравнений текста вообще нужно избегать, таким образом по крайней мере :)
Ну это понятно.
В общем я за повсеместный QString, кроме случаев, когда это очень критично по производительности.
Но тогда зачем вообще qt использовать?
Меня лично бесит, когда в проекте то QString, то char *.


Название: Re: Всегда ли вы используете QString?
Отправлено: andrew.k от Октябрь 31, 2011, 00:02
Экономим на спичках?
Покажите мне код, в котором QString является узкой частью.
QtXml. Только и делает, что гоняет utf-8 (или другую 8битную кодировку внутри xml) в utf-16 и обратно.
По-моему неудачный пример.
раз гоняет, значит нужно. как раз экономия на спичках.
Храни данные в PlainText и читай их сишными функциями, и будет тебе очень производительно.

в qt-проектах смысла нет в char *.


Название: Re: Всегда ли вы используете QString?
Отправлено: Авварон от Октябрь 31, 2011, 00:46
Экономим на спичках?
Покажите мне код, в котором QString является узкой частью.
QtXml. Только и делает, что гоняет utf-8 (или другую 8битную кодировку внутри xml) в utf-16 и обратно.
По-моему неудачный пример.
раз гоняет, значит нужно. как раз экономия на спичках.
Очень удачный. Тролли теперь страдают, что ничего с этим модулем сделать не могут, тк написали его через жопу, а совместимость не дает ничего изменить. И это не мои выдумки, это проверенная инфа.

Да, яхз зачем использовать char* если есть QByteArray.


Название: Re: Всегда ли вы используете QString?
Отправлено: andrew.k от Октябрь 31, 2011, 00:52
поверю на слово.
Но в любом случае, получается, что проблема не собственно в QString, а в том, что написано через жопу.
Не QString же виноват, что QtXml его туда-сюда гоняет?)


Название: Re: Всегда ли вы используете QString?
Отправлено: Авварон от Октябрь 31, 2011, 01:06
andrew.k
Просто надо думать, когда пишите. В очень многих случаях можно обойтись батареем. Пример - QObject::objectName нафиг не нужен кустринг, достаточно батарея. Покажите мне извращенца, к-ый дает объектам в программе локализованные имена.


Название: Re: Всегда ли вы используете QString?
Отправлено: andrew.k от Октябрь 31, 2011, 01:52
Дело не в локализованности.
Можно, например, имена использовать динамически.
Например, в калькуляторе PushButton0, PushButton1, PushButton2, ..., PushButton9
И выделять из имени последний символ в единственной для всех кнопок функции обработчике.
Тут же QString и пригодится.
И таких примеров можно массу придумать.


Название: Re: Всегда ли вы используете QString?
Отправлено: Авварон от Октябрь 31, 2011, 02:05
Дело не в локализованности.
Можно, например, имена использовать динамически.
Например, в калькуляторе PushButton0, PushButton1, PushButton2, ..., PushButton9
И выделять из имени последний символ в единственной для всех кнопок функции обработчике.
Тут же QString и пригодится.
И таких примеров можно массу придумать.

Батарей всё это позволяет. Можно вспомнить, что значение символа - это его код - '0'.
Для более сложных случаев гораздо более адекватно засовывать данные в проперти (а еще у некоторых классов есть спец userData), а не в имя.


Название: Re: Всегда ли вы используете QString?
Отправлено: andrew.k от Октябрь 31, 2011, 02:25
В qt3 name был как раз батареем, если мне не изменяет память, но в 4 стал уже QString.
objectName() используется частенько в qt-проектах. Поэтому совершенно логично его было проапргейдить до QString.

У QPushButton я не нашел что-то UserData.

Код
C++ (Qt)
{
 QList<QPushButton *> list = this->findChild<QPushButton *>( QRegExp( "PushButton" ) );
 foreach ( QPushButton * pb, list )
    connect( pb, SIGNAL( clicked() ), SLOT( someSlot() ) );
}
 
someSlot()
{
 // проверить sender()!
 input += sender()->objectName().right(1);
}
 
 
Что может быть элегантнее?

С кучей однотипных элементов иногда удобнее работать по имени, чем где-то еще данные для них хранить.


Название: Re: Всегда ли вы используете QString?
Отправлено: Авварон от Октябрь 31, 2011, 02:39
andrew.k
В qt3 не было нормального батарея; обжект нейм там был тупо char*, с к-оторым ничего действительно сделать нельзя. В 4ке же было повальное увлечение делать все подряд QString'ом не думая.
Обжект нейм _не_предназначен_ для того, чтобы хранить данные. Обжект нейм _не_предназначен_ для перевода на другие языки. Следовательно QString здесь излишен.

Элегантнее может быть только код, который сторонний человек может понять, а не гадать, какого хрена вы выцепляете из имени объекта последний символ, и чем этот символ так значим. Метод через проперти ему удовлетворяет. Еще _специально_ для таких вещей есть сигнал мапппер.
А в 1й функции вам еще придется следить за тем, чтобы _другие_ кнопки не подпадали под регэксп. Удачной отладки через годик.
Ну и напоследок - метод sender()
Цитировать
Warning: This function violates the object-oriented principle of modularity.


Название: Re: Всегда ли вы используете QString?
Отправлено: andrew.k от Октябрь 31, 2011, 03:11
В неэлегантности убедил.
По сабжу не убедил.

Ну и напоследок - метод sender()
Цитировать
Warning: This function violates the object-oriented principle of modularity.
Порадовал)


Название: Re: Всегда ли вы используете QString?
Отправлено: Igors от Октябрь 31, 2011, 10:28
Экономим на спичках?
Задач в которых эти спички измеряются порядками не так уж мало. Напр при разборе текстовика хотя бы метров 10 разница уже будет видна невооруженным глазом.

по идее, он должен быть быстрее, чем std::vector, т.к. использует механизм copy-on-write.
std::string использует copy-on-write. QString использует implicit sharing. Это не одно и то же.

Да и вообще, сырые указатели - это не модно и не безопасно.
Конечно QString безумно удобен, но за это приходится платить. Мое мнение: если человек не умеет работать с char * значит он не знает языка, сколько бы чужих классов он не выучил  :)


Название: Re: Всегда ли вы используете QString?
Отправлено: Sancho_s_rancho от Октябрь 31, 2011, 11:25

по идее, он должен быть быстрее, чем std::vector, т.к. использует механизм copy-on-write.
std::string использует copy-on-write. QString использует implicit sharing. Это не одно и то же.
Разработчики Qt с вами не согласны: "QString uses implicit sharing (copy-on-write) to reduce memory usage and to avoid the needless copying of data... " copy-on-write является более общим определением, вот и все.


Название: Re: Всегда ли вы используете QString?
Отправлено: andrew.k от Октябрь 31, 2011, 17:05

Да и вообще, сырые указатели - это не модно и не безопасно.
Конечно QString безумно удобен, но за это приходится платить. Мое мнение: если человек не умеет работать с char * значит он не знает языка, сколько бы чужих классов он не выучил  :)
Это почти то же самое, что говорить, что тот, кто никогда не ездил на автомате, не умеет водить машину.