Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Названия классов и типов


Автор: Piphon 20.10.2010, 12:01
В проекте принята примерно такой стандарт именования  классов и типов:
  •  ClassName - Класс, структура
  •  IPureVirtualClassName - виртуальный класс
Но в большинстве случаев эти имена используются только в реализациях своих методов и местах где создаются объекты этих классов (не полностью вирутальных):
Код

void ClassName::someMethod()
{

}

а в других местах используются типы являющиеся "умными" ссылками на них (В голову сразу лезут boost::shared_ptr и boost::weak_ptr). Писать код вроде этого:
Код

boost::shared_ptr<ProjectEntry> projectEntry;
boost::weak_ptr<ProjectEntry> projectEntry;

устанешь, да и с моей точки зрения в объявлениях членов классов это выглядит не слишком красиво(особенно если используются вложенные пространства имен). Вот тут на помощь приходит typedef. Все бы хорошо, но встает вопрос как именовать эти типы:
  • ClassName - исходный класс
  • ClassNameShared | ClassNameRef - ссылка на объект класс
  • ClassNameWeak - слабая ссылка
или использовать венгерскую нотацию (примерно так):
  • SClassName - исходный класс
  • RClassName - ссылка на объект класс
  • WClassName - слабая ссылка
Если встречались с таким вопросом поделитесь опытом. а если нет предложите свои варианты.

P.S. Если в орфографии ошибки, перевод с языка ??? прошел не много не удачно.

Автор: Леопольд 20.10.2010, 12:06
Цитата(Piphon @  20.10.2010,  12:01 Найти цитируемый пост)
Если встречались с таким вопросом поделитесь опытом. а если нет предложите свои варианты.
Дело вкуса и личных предпочтений...

Автор: azesmcar 20.10.2010, 12:10
Какая разница как называть? главное, чтобы понятно было читающему и придерживаться одного стиля (хотя бы в рамках одного проекта).
Я предпочитаю так
Код

class X
{
public:
    typedef boost::shared_ptr<X> shared_ptr;
    typedef boost::weak_ptr<X> weak_ptr;
};

X::shared_ptr x = ...


Автор: djamshud 20.10.2010, 12:24
Мой код-стайл:

Код

class classNameIface; - (pure) virtual
class className;
typedef className typedef_t;
className var_name, varname;
struct structName;
struct structName var_name,varname;

Автор: Sartorius 20.10.2010, 12:54
Piphon, почитай "Чистый Код" Роберта Мартина. ИМХО там довольно толково описано как выбирать идентификаторы и почему не нужно использовать префиксы вроде венгерской нотации. 

Автор: Piphon 20.10.2010, 13:31
Леопольд, да это дело вкуса, но зато есть из чего выбирать smile.

Sartorius, единственное место где я использую венгерскую нотацию это интерфейсы в PHP и C#, или полностью(не помню точно как они называются) виртуальные классы C++. А книгу еще не встречал, на досуге надо будет почитать.

Автор: EgorTheBlade 20.10.2010, 13:34
AClassName абстрактный класс
В МFC писал CClassName;
еще существуют приставки с названием проектов Например проект для медицины:

medClassName;
В целом это дело вкуса - главное правило чтобы код написаный вами смогли правильно прочитать и понять другие люди.

Автор: Леопольд 20.10.2010, 14:27
Цитата(Piphon @  20.10.2010,  13:31 Найти цитируемый пост)
Леопольд, да это дело вкуса, но зато есть из чего выбирать

NamespaceName

$AbstractType
ConcreteType

m_dataField
functionName

m_privateDataField_
m_protectedDataField_
privateFunctionName_
protectedFunctionName_

aVarible

Автор: mes 20.10.2010, 14:35
Цитата(Леопольд @  20.10.2010,  13:27 Найти цитируемый пост)
$AbstractType

что в данном случае означает доллар ?

Автор: Леопольд 20.10.2010, 14:38
Цитата(mes @  20.10.2010,  14:35 Найти цитируемый пост)
что в данном случае означает доллар ? 

Просто ANSI символ, g++ компиляет без проблем, студия, вроде, тоже нормально "проглатывала". Пытаюсь найти в стандарте 2003 допустимые символы в именах С++, пока не нашёл...

Автор: mes 20.10.2010, 14:43
Цитата(Леопольд @  20.10.2010,  13:38 Найти цитируемый пост)
просто ANSI символ, g++ компиляет без проблем. 

Цитата

The basic source character set consists of 96 characters: the space character, the control characters representing horizontal tab, vertical tab, form feed, and new-line, plus the following 91 graphical characters:
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) < > % : ; . ? * + - / ˆ & | ˜ ! = , \ " ’


Цитата

2.10 Identifiers
nondigit: one of
universal-character-name
_ a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
digit: one of
0 1 2 3 4 5 6 7 8 9

 smile

Автор: Леопольд 20.10.2010, 14:47
mes, увы... smile 
Тогда 

NamespaceName

IAbstractType
ConcreteType

m_dataField
functionName

m_privateDataField_
m_protectedDataField_
privateFunctionName_
protectedFunctionName_

aVarible

Автор: mes 20.10.2010, 14:52
Цитата(Леопольд @  20.10.2010,  13:38 Найти цитируемый пост)
g++ компиляет без проблем,

Цитата

4.25 Знак Доллара в Идентификаторах

В GNU C вы можете использовать знак доллара в идентификаторах. Это потому что многие традиционные реализации C позволяют такие идентификаторы.

На некоторых машинах, знак доллара разрешается в идентификаторах, если вы указываете '-traditional'. В некоторых системах они разрешаются по умолчанию, даже если вы не используете '-traditional'. Но он никогда не позволяется, если вы указываете '-ansi'.

http://www.opennet.ru/docs/RUS/gcc/gcc1-4.html#ss4.25

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)