Warning, /education/labplot/src/doc/api_design.dox is written in an unsupported language. File is not indexed.
0001 /**\page api_design API design guide 0002 0003 \section header Header files 0004 0005 Try to reduce as much as possible the number of includes in header files. This will generally help reduce the compilation time, especially for developers when just one header has been modified. 0006 It may also avoid errors that can be caused by conflicts between headers. Most of the time, forward declarations are sufficient. 0007 In MyClass.cpp, the first include should be MyClass.h. This ensures that MyClass.h is standalone. 0008 0009 \section naming Naming schemes 0010 0011 Names of classes with pure virtual methods, and of classes whose instances are not usable (e.g., because of virtual methods with a do-nothing implementation, one or more of which are expected to be reimplemented in subclasses), are prefixed with the string ?Abstract?. 0012 Names of classes providing a primary view on an Aspect, and other classes providing the view part of a model/view construct, are suffixed with 'View'. 0013 Methods that return a 'count' value, i.e. the number of objects of some kind, use the singular form for the object name, suffixed with 'Count'. Example: columnCount(). 0014 0015 \section mistakes Avoiding common mistakes 0016 0017 Avoid large, cryptic constructors in favour of sensible defaults plus setter methods. Example (from [http://doc.trolltech.com/qq/qq13-apis.html Designing Qt-Style C++ APIs]): 0018 @code 0019 QSlider *slider = new QSlider(12, 18, 3, 13, Qt::Vertical, 0, "volume"); 0020 @endcode 0021 is much harder to understand for someone reading the code than 0022 @code 0023 QSlider *slider = new QSlider(Qt::Vertical); 0024 slider->setRange(12, 18); 0025 slider->setPageStep(3); 0026 slider->setValue(13); 0027 slider->setObjectName("volume"); 0028 @endcode 0029 Avoid boolean function parameters. It's often hard to figure out what such a function call does without referring to the API documentation every time. Replacements can be either two distinct methods or flags, depending on the details of the problem. Example: 0030 @code 0031 aspect->children(true, true) 0032 @endcode 0033 would be mucher harder to read than 0034 @code 0035 aspect->children(AbstractAspect::IncludeHidden | AbstractAspect::Recursive). 0036 @endcode 0037 Also, this allows you to add more flags later on without breaking binary compatibility, so it can be a good idea even if you only have a single flag for now. Using QFlags is recommended in order to make flags type safe, and because it adds implicit documentation to the API (particularly useful when using an 0038 IDE with code completion). 0039 Except for basic types, parameters should be passed by const reference. This avoids copying the object. Returning references is not a good idea in most cases, because the referenced object changes when calling the method again. Example: 0040 @code 0041 QString myMethod(const QString &string, int number); 0042 @endcode 0043 */