Должно ли название моих классов начинаться с 'Q' в Qt? - PullRequest
16 голосов
/ 27 мая 2010

Когда я впервые начал работать с Qt, было очень неприятно, что у каждого класса есть имя, начинающееся с 'Q', но теперь я привык к нему.

Я использую Qt Creator, и он довольно хорошо выделяет код.
Тем не менее, он только выделяет имена классов, начинающиеся с 'Q'. И он подсвечивает все, начинающееся с 'Q', даже если такого типа нет.
Он не выделяет имена пользовательских классов.

Это заставляет меня задуматься, а не начинать ли я все имена классов с "Q"?
Или хотя бы многоразовые?
(Я имею в виду те, которые я помещаю в библиотеку классов или повторно использую в другом приложении.)

Я видел несколько мест, где они так называли свои классы. Это хорошо?

Я нашел эту страницу об соглашениях об именах Qt, но она не имеет отношения к этому вопросу.

Также я не понимаю, почему Qt не использует пространства имен.

EDIT:

Большое спасибо всем, кто поделился со мной своими мыслями.

РЕДАКТИРОВАТЬ 2:

Кажется, что более новые версии Qt Creator теперь также выделяют имена классов, не начинающиеся с 'Q'. Nice!

Ответы [ 7 ]

25 голосов
/ 27 мая 2010

Я не понимаю, почему вы вообще хотите применять это на своих собственных классах. Позвольте Qt делать то, что он хочет сделать с его соглашением об именах классов, и вы делаете это самостоятельно.

11 голосов
/ 27 мая 2010

Лично я бы не стал добавлять префиксы в свои собственные классы. Поскольку Qt имеет собственную реализацию множества вещей (строка, список ...), это помогает узнать, что вы используете.

Правильный способ - использовать пространства имен. Я думаю, что Qt не использовал их, потому что он довольно старый. C ++ сильно изменился за последнее время.

И вообще, адаптация ваших соглашений об именах в соответствии с окраской синтаксиса - плохая идея (даже если я понимаю, что это только заставило вас задуматься о вашем названии).

8 голосов
/ 27 мая 2010

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

5 голосов
/ 27 мая 2010

Я не использовал Qt, но если вы на самом деле не расширяете части Qt, я думаю, что будет очень плохой идеей ставить перед вашими классами префикс Qt, особенно из-за особого поведения (IMO), о котором вы сообщаете от Qt Creator.

Довольно часто группировать связанные классы вместе с префиксами, но сейчас это довольно устаревший подход. Лучший способ сделать это - использовать пространства имен - это дает преимущество, позволяя определить область видимости, которую простой префикс не даст вам.

Если вы используете пространства имен, убедитесь, что ваше пространство имен отличает то, что вы делаете, от кода, против которого вы пишете, например, не используйте

Qt::MyClass theClass;

использование

venemo::MyClass theClass;

Я уверен, что вы поняли картину. Вы также можете захотеть взглянуть на QtCreator и заменить редактор (или всю IDE) на что-то, что лучше выделяет код C ++.

4 голосов
/ 08 июня 2010

Если вы хотите добавить к своим классам префикс «Q» только для того, чтобы Creator выделил их для вас, тогда вы можете захотеть перейти на основную ветку Creators.

Создатель использовал "хак Q", потому что постоянно искать все было слишком дорого. Тем временем механизм C ++ был значительно улучшен, и эти поиски можно выполнять без замедления пользовательского интерфейса, поэтому недавно была активирована подсветка для всех типов типов.

К сожалению, это изменение больше не будет вноситься в Qt Creator 2.0, поэтому вам нужно использовать моментальные снимки или создать все это самостоятельно.

2 голосов
/ 27 мая 2010

Что касается пространств имен и Qt, Qt действительно использует пространства имен, но не для всего. Qt работает на многих системах, не все из которых могут иметь поддержку full для пространств имен. Хотя существуют текущие версии Qt, это не означает, что все системы, на которых он работает, также обновились. Учитывая количество кода, использующего Qt в его нынешнем виде, преобразование всего будет огромным делом; предполагая, что все компиляторы / платформы / системы, на которых работает Qt, не нужно обходить, чтобы переместить все в пространства имен.

Qt не нуждается в пространствах имен, у них работает схема именования. Желание назвать ваши классы так, как это делает Qt, потому что вы используете Qt, все равно, что хотеть поместить ваши классы в пространство имен Qt, потому что вы используете Qt. Я согласен с Ноем в том, что желание сделать это - это «запах», и, хотя в целом терпимо, это не очень хороший шаг. Иногда подражание - не самая искренняя форма лести.

2 голосов
/ 27 мая 2010

Ну, вот что я делаю. Я пытаюсь, и в целом терплю неудачу, но ИМХО все равно стоит попробовать, чтобы большая часть моего кода не знала, какую среду пользовательского интерфейса я использую. В частности, для операций рисования пользовательских виджетов я хочу, чтобы они снова работали позже, если я переключусь с WX на Qt. Таким образом, у меня есть свой собственный device_context, который является абстракцией того, что мне нужно. Затем у меня есть WX-версия device_context, которая выполняет вызовы отрисовки wxDC и содержит wxDC *.

Конечно, вы узнаете это как паттерн моста.

Так, как я называю вещи? Ну, нет никакой причины называть device_context wx_device_context, так как я вполне мог говорить с Qt. Я пытаюсь скрыть WX от моего кода, помните?

НО! Специальный подкласс WX, который создается от имени моих клиентов, называется wx_device_context и фактически находится в кармане пространства имен wx, созданном только для таких целей.

Как это относится к вам? Что ж, если у вас возникнет искушение назвать класс QSomething, то вы, вероятно, создаете что-то особенное, связанное с Qt особым образом. Можете ли вы скрыть этот факт через создание подклассов, предоставляя интерфейс, который клиенты могут использовать, который не зависит от библиотеки пользовательского интерфейса? Может ли созданный вами виджет быть сделан таким образом? Если вы когда-нибудь решили, что вам нужно использовать какую-то другую библиотеку пользовательского интерфейса, вы застряли или можете просто переопределить некоторые базовые структуры, чтобы ваши пользовательские виджеты работали с новой библиотекой?

Смысл в том, что ваш соблазн назвать класс QSomething - это «запах», хотя он обычно встречается и обычно допускается, и вы можете подумать о том, что он указывает и что вы можете сделать, если что-нибудь, с ним .

...