Jump to content

[SOLVED] style guide: request


photo

Recommended Posts

  • 2 weeks later...
  • 2 months later...

Форматирование Автоформатирование

/source/tools/scripts/Indent/indent.py

Правильно раставляет табуляции и убирает висячие строки. На выходе получается name + _indent файл, в консоль выводится информация по висячим строкам. Фигурные скобки прилипшие к тексту или находящиеся в коментариях обрабатываются неправильно.

Табуляция

Размер табуляции 4 символа.

Пробелы

Пробелы в инструкциях:

for(int i = 0; i < 10; i++) {

int j = 0;

int k = 0; // лучше новую переменную с новой строки или:

int l,m,n; // а если надо инициализацию, то с пробелом:

int x = 10, y = 11, z = 12;

if(i == 10) {

return 10;

}

int counter = 0;

while(1) {

if(counter++ == 10) break;

}

}

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

Node::Node(int type) : Instance<Node>(this), type(type) {

enabled = 1;

immovable = 0;

}

Но если у нас много переменных передается в класс, то в несколько строк.

MeshEnumProc::MeshEnumProc(const char *name,int prompt,int selected,int multi_sub,int align,float scale,int digits) :

selected(selected), multi_sub(multi_sub),

align(align), scale(scale), digits(digits) {

}

Скобки не переносятся никогда.

Висячие запятые

В массивах и енумах последние запятые надо оставлять. Так проще добавлять новые члены. Если забыть поставить запятую, строки могут склеиться.

enum {

ONE = 1,

TWO,

THREE,

};

int a[3] = { 0, 1, 2, };
int a[] = ( 0, 1, 2, );
Разделители

Функции отделяются друг от друга или пустым комментарием:

/*

*/

void foo() {

 

}

или комментарием с описанием:

/* it's foo

*/

void foo() {

    

}

Крупные фрагменты между функциями и классами отделяются с помощью разделителя (длиной 80 столбцов):

/******************************************************************************\

*

* it's a heap of code

*

\******************************************************************************/

Если функция сильно сложная, она разделяется на логические блоки:

/////////////////////////////////

// depth texture

////////////////////////////////

Внутри классов:

/*

*/

class Foo {

<- две табуляции

public:

<- две табуляции

 

Foo();

virtual ~Foo();

 

// variable interface <- комментарий к функции сверху, сначала set, потом get

void setVariable(int value);

int getVariable();

 

<- никаких пустых строк, табуляции

 

private:

 

// it's a some function

void some_func();

 

int variable; // it's variable <- комментарии переменных справа

};

Именование

Имена всего, что не класс и не структура, начинаются с маленькой буквы:

void function() {

int variable = 10;

}

В именах не используются префиксные подчеркивания, в крайнем случае можно заюзать постфиксные. Но лучшее решение сокращение имени до одной буквы:

void setEnabled(int e) { enabled = e; }

void inside(const &vec3 min_,const vec3 &max_);

Имена классов и структур начинаются с больших букв:

class Foo {

struct FooImpl;

};

Все имена функций, являющиеся интерфейсными, не содержат подчеркиваний. Подчеркивания используются в именах protected и private функций классов, в простых функциях, не смотрящих наружу, и в переменных.

class Foo {

public:

void setName(const char *name);

int getVariable() const;

private:

void do_set_name();

void do_get_variable() const;

 

int my_variable;

};

file.h:

void createWindow(int width,int height);

file.cpp:

static void do_create_window(int width,int height) {

 

}

 

void createWindow(int width,int height) {

do_create_window(width,height);

}

C/C++, UnigineScript Модификаторы

Притягивание модификаторов идет к переменным, никаких лишних пробелов:

void foo(const int *vertex,int num_vertex);

void foo(int **vertex,int &num_vertex);

Фигурные скобки

Фигурные скобки идут без переноса строк:

int func(int a) {

 

if(a = 10) {

return 10;

} else if(a == 11) {

return 11;

}

 

// для уменьшения ряби можно так:

if(a = 10) {

return 10;

}

else if(a == 11) {

return 11;

}

 

// или так, если простая конструкция:

if(a == 10) return 10;

else if(a == 11) return 11;

 

return 1;

}

Значения

Инты все понятно просто число:

int i = 12;

Флоаты всегда писать с точкой даже если значение целое. И не забывать про модификатор f.

float f = 12.12f;
Циклы

В UnigineScript? использовать forloop вместо for везде где только можно, он быстрее.

стандарно:

for(int i = 0; i < 10; i++) { }

быстрее стандартного:

forloop(int i = 0; 10) { }
Файлы

Имена файлов начинаются с больших букв и ими же разделяются:

SkinnedMesh.h

UserInterface.cpp

Единственное отличие: main.cpp

Инкременты/декременты

Для интов все инкременты декременты постфиксные, префиксные только на итераторах.

int i = j++;

std::vector<int>::iterator i = ++j;

 
Link to comment

Спасибо, очень полезно! 

Вопрос по поводу XML.

Какую программу используете для работы?

Я работаю в VIM, настроил себе сниппеты необходимые, но все равно немного не удобно.

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

Еще вопрос по VIM. Подскажите какие нибудь интересные плагины, которые вы используете.

 

Thank you, very useful!
Question about XML.
What program use to work?
I work in VIM, set up the necessary snippets, but still a bit inconvenient.
Especially when you do something big, like a dictionary, where it is necessary add all the variables. A still further and to put hyphens, newline, etc.
Another question for VIM. Tell me what some interesting plug-ins that you use.
Link to comment
×
×
  • Create New...