/*! \contentpage{index.html}{Qt Creator} \page coding-style.html \title Qt Creator Coding Rules THIS IS PRELIMINARY. \section1 Introduction The aim of this section is to serve as a guide for the developers, to aid us to build understandable and maintainable code, to create less confusion and surprises when working on Qt Creator. As usual: Rules are not set in stone. If there's a good reason to break one, do it, preferably after making sure that there are others agreeing. This document is incomplete. In general, if you want to contribute to the main source, we expect at least that you: \list 1 \o The most important rule first: KISS (keep it simple ...): always use a simple implementation in favor of a more complicated one. This eases maintenance a lot. \o Write good C++ code: Readable, well commented when necessary, and taking advantage of the OO model. Follow the \l{Formatting} guidelines. There are also certain \l{Code Constructs} that we try to follow. \o Adapt the code to the structures already existing in Qt Creator, or in the case that you have better ideas, discuss them with other developers before writing the code. \o Take advantage of Qt. Don't re-invent the wheel. Think about what parts of your code are generic enough that they might be incorporated into Qt proper. \o Document interfaces. Right now we use qdoc, but changing to doxygen is being considered. \endlist \section1 Submitting Code Send your contributions to qt-creator@trolltech.com It is implicitly understood that all patches contributed to The Qt Creator Project are made under under the Gnu General Public License, version 2 or later and currently we require that you sign a copyright assignment form. We are working on a better solution. If you have a problem with that, don't contribute code. Also please don't just pop up out of the blue with a huge patch (or small) that changes something substantial in Qt Creator. Always discuss your ideas with the other developers on mailing list first. When you create the patch, please use git or use "diff -up" since we find that a lot easier to read than the other diff formats. Also please do not send patches that implement or fixes several different things; several patches is a much better option. Or send as your a url to pull from. We also require you to provide a commit message entry with every patch, that describes in detail what the patch is doing. \section1 Code Constructs We have several guidelines on code constructs, some of these exist to make the code faster, others to make the code clearer. Yet others exist to allow us to take advantage of the strong type checking in C++. \list 1 \o Declaration of variables should wait as long as possible. The rule is: "Don't declare it until you need it." In C++ there are a lot of user defined types, and these can very often be expensive to initialize. This rule connects to the next rule too. \o Make the scope of a variable as small as possible. \o Prefer preincrement to postincrement whenever possible. Preincrement has potential of being faster than postincrement. Just think about the obvious implementations of pre/post-increment. This rule applies to decrement too. \code ++T; --U; -NOT- T++; // not used in Qt Creator U--; // not used in Qt Creator \endcode \o Try to minimize evaluation of the same code over and over. This is aimed especially at loops. \code Container::iterator end = large.end(); for (Container::iterator it = large.begin(); it != end; ++it) { ...; } -NOT- for (Container::iterator it = large.begin(); it != large.end(); ++it) { ...; } \endcode \o Using Qt's foreach is ok in non-time critical code when using a QTL container. It is a nice way to keep line noise down and to give the loop variable a proper name: \code foreach (QWidget *widget, container) doSomething(widget); -VS- Container::iterator end = container.end(); for (Container::iterator it = container.begin(); it != end; ++it) doSomething(*it); \endcode If the loop variable can be made const, do so. This can prevent unnecessary detaching of shared data in some cases. So: \code foreach (const QString &name, someListOfNames) doSomething(name); - NOT - foreach (QString name, someListOfNames) doSomething(name); \endcode \section1 Formatting \section2 Declarations Only one declaration on each line. \code int a; int b; -NOT- int a, b; // not used in Qt Creator \endcode This is especially important when initialization is done at the same time. \code QString a = "Joe"; QString b = "Foo"; -NOT- QString a = "Joe", b = "Foo"; // not used in Qt Creator \endcode [Note that 'QString a = "Joe"' is formally calling a copy constructor on a temporary constructed from a string literal and therefore has the potential of being more expensive then direct construction by 'QString a("joe")'. However the compiler is allowed to elide the copy (even if it had side effects), and modern compilers typically do so. Given these equal costs, Qt Creator code favours the '=' idiom as it is in line with the traditional C-style initialization, _and_ cannot be mistaken as function declaration, _and_ reduces the level of nested parantheses in more initializations.] \section2 Pointers and references \code char *p = "flop"; char &c = *p; -NOT- char* p = "flop"; // not used in Qt Creator char & c = *p; // not used in Qt Creator \endcode This is simply in line with the official Qt guide lines. Also note that we will have: \code const char *p; -NOT- char const * p; // not used in Qt Creator \endcode Using a plain 0 for Null pointer constants is always correct and least effort to type. So: \code void *p = 0; -NOT- void *p = NULL; // not used in Qt Creator -NOT- void *p = '\0'; // not used in Qt Creator -NOT- void *p = 42 - 7 * 6; // also not used in Qt Creator \endcode Note: As an exception, imported third party code as well as code interfacing the "native" APIs (src/support/os_*) can use NULL. \section2 Operator names and parentheses \code operator==(type) -NOT- operator == (type) // not used in Qt Creator \endcode The == is part of the function name, separating it makes the declaration look like an expression. \section2 Function names and parentheses \code void mangle() -NOT- void mangle () // not used in Qt Creator \endcode \section2 Naming rules Simply follow the style of Qt proper. As examples: \list \o Use descriptive but simple and short names. Do not abbreviate. \o Class names are capitalized, and function names lowercased. Enums are named like Classes, values are in lower-case. \endlist \section2 Formatting We are using the Qt Coding style, please follow the guidelines below. Indentation 4 spaces, no tabs Declaring variables Declare each variable on a separate line Avoid short (e.g., a,rbarr,nughdeget) names whenever possible Single character variable names are only okay for counters and temporaries, where the purpose of the variable is obvious Wait with declaring a variable until it is needed Variables and functions start with a small letter. Each consecutive word in a variable's name starts with a capital letter Avoid abbreviations // Wrong int a, b; char *c, *d; // Correct int height; int width; char *nameOfThis; char *nameOfThat; Whitespace Use blank lines to group statements together where suited Always use only one blank line Always use a single space after a keyword, and before a curly brace. // Wrong if(foo){ } // Correct if (foo) { } For pointers or references, always use a single space before '*' or '&', but never after. Avoid C-style casts when possible. // Wrong char* blockOfMemory = (char* ) malloc(data.size()); // Correct char *blockOfMemory = (char *)malloc(data.size()); char *blockOfMemory = reinterpret_cast(malloc(data.size())); Braces As a base rule, the left curly brace goes on the same line as the start of the statement: // Wrong if (codec) { } // Correct if (codec) { } Exception: Function implementations and class declarations always have the left brace on the start of a line: static void foo(int g) { qDebug("foo: %i", g); } class Moo { }; Use curly braces when the body of a conditional statement contains more than one line, and also if a single line statement is somewhat complex. // Wrong if (address.isEmpty()) { return false; } for (int i = 0; i < 10; ++i) { qDebug("%i", i); } // Correct if (address.isEmpty()) return false; for (int i = 0; i < 10; ++i) qDebug("%i", i); Exception 1: Use braces also if the parent statement covers several lines / wraps // Correct if (address.isEmpty() || !isValid() || !codec) { return false; } Exception 2: Use braces also in if-then-else blocks where either the if-code or the else-code covers several lines // Wrong if (address.isEmpty()) --it; else { qDebug("%s", qPrintable(address)); ++it; } // Correct if (address.isEmpty()) { --it; } else { qDebug("%s", qPrintable(address)); ++it; } // Wrong if (a) if (b) ... else ... // Correct if (a) { if (b) ... else ... } Use curly braces when the body of a conditional statement is empty // Wrong while (a); // Correct while (a) {} Parentheses Use parentheses to group expressions: // Wrong if (a && b || c) // Correct if ((a && b) || c) // Wrong a + b & c // Correct (a + b) & c Line breaks Keep lines shorter than 100 characters; insert line breaks if necessary. Commas go at the end of a broken line; operators start at the beginning of the new line. The operator is at the end of the line to avoid having to scroll if your editor is too narrow. // Wrong if (longExpression + otherLongExpression + otherOtherLongExpression) { } // Correct if (longExpression + otherLongExpression + otherOtherLongExpression) { } \section2 Declarations - Use this order for the access sections of your class: public, protected, private. The public section is interesting for every user of the class. The private section is only of interest for the implementors of the class (you). [Obviously not true since this is for developers, and we do not want one developer only to be able to read and understand the implementation of class internals. Lgb] - Avoid declaring global objects in the declaration file of the class. If the same variable is used for all objects, use a static member. - Avoid global or static variables. \section2 API/ABI stability We currently do not gurantee any API nor ABI compatibility between releases. \section2 File headers If you create a new file, the top of the file should include a header comment equal to the one found in other source files of Qt Creator. \section2 Documentation The documentation is generated from source and header files. You document for the other developers, not for yourself. In the header you should document interfaces, i.e. what the function does, not the implementation. In the .cpp files you document the implementation if the implementation in non-obvious. */