OGRE 编程规范 OGRE Coding Standards

OGRE Coding Standards
This document describes the coding standards all developers are expected to adhere to when writing code for the OGRE project.
Top-level organisation issues
1. All source files must begin with the standard OGRE copyright statement:
2. /*
3. -----------------------------------------------------------------------------
4. This source file is part of OGRE
5.     (Object-oriented Graphics Rendering Engine)
6. For the latest info, see http://www.ogre3d.org/
7. 
8. Copyright (c) 2000-2006 Torus Knot Software Ltd
9. Also see acknowledgements in Readme.html
10. 
11. This program is free software; you can redistribute it and/or modify it under
12. the terms of the GNU Lesser General Public License as published by the Free Software
13. Foundation; either version 2 of the License, or (at your option) Any later
14. version.
15. 
16. This program is distributed in the hope that it will be useful, but WITHOUT
17. Any WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18. FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
19. 
20. You should have received a copy of the GNU Lesser General Public License along with
21. this program; if not, write to the Free Software Foundation, Inc., 59 Temple
22. Place - Suite 330, Boston, MA 02111-1307, USA, or go to
23. http://www.gnu.org/copyleft/lesser.txt.
24. 
25. You may alternatively use this source under the terms of a specific version of
26. the OGRE Unrestricted License provided you have obtained such a license from
27. Torus Knot Software Ltd.
28. -----------------------------------------------------------------------------
*/
29. All publically visible classes should be declared in their own header file using the .h extension, placed in the 'include' folder of the sub-project in question, and named after the class but prefixed with 'Ogre' e.g. 'OgreMyClass.h'. Only very tightly related classes should be declared in the same header file.
30. Implementations should be placed in a source file called the same name as the class but with an extension of .cpp.
31. Everything must be declared inside the namespace 'Ogre'.
Portablity
1. All code must be cross platform, ANSI C++. No dependencies on platform-specific headers and / or types are allowed (the only exception is when dealing with platform-specific features like windowing, which must be implemented for each platform separately).
2. If you serialise / deserialise any data, subclass from Serializer and use its methods, it will insulate you from endianness issues. If you need to serialise any types it doesn't already handle, make sure you deal with endianness issues in the same way Serializer does (ie use native endianness by default but detect the inverse on reading and perform flipping if required).
C++ Standards compliance
1. Always prefer the STL over custom containers / algorithms.
2. Always prefer C++ techniques over C.
o Avoid C-strings (char* and functions like sprintf, strcpy, use Ogre::String)
o Avoid old I/O routines (fopen et al, use <iostream>)
o Use abstract classes or templates not void*
o Use overloaded methods not varargs.
3. Minimum C++ compiler level is MSVC 7.1 or gcc 3.1. Compilers which do not support things like partial template specialisation properly (such as older versions of MSVC) are not supported.
4. Use the PImpl idiom to reduce dependencies between classes.
5. Always use const-correctness. Methods taking non-primitive types as parameters should generally take them as const references, methods returning non-primitive types should generally return them as const references. Declare all methods that do not modify internal state 'const'. For lazy-update getter methods, declare the internal state which is lazy-updated 'mutable'.
6. Prefer 'protected' over 'private' to encourage specialisation where appropriate
7. Always declare destructors 'virtual' unless the class you are writing should not have any vtable (no other virtual methods).
8. Avoid non-const by-ref parameters unless you have no other option. We prefer not to have in/our parameters since they are less intuitive.
Naming conventions & Documentation
1. Classes, types and structures must be title case (MyNewClass).
2. Methods and local variables must be camel case (myNewMethod).
3. Member variables should be prefixed with 'm' (mInstanceVar), static member variables should be prefixed 'ms' (msStaticMemberVar). Do not use any other prefixing such as Hungarian notation.
4. Preprocessor macros must be all upper case and prefixed with OGRE_
5. Enums should be named in title case, enum values should be all upper case
6. All classes and methods must be fully documented in English using Doxygen-compatible comments. Use the @param and @returns directives to define inputs and outputs clearly, and @note to indicate points of interest.
7. Use verbose, descriptive names for classes, methods, variables - everything except trival counters. Code should be self-describing, don't be obtuse.
Style issues
1. Insert a newline before an open brace (contentious I know!)
2. Use typedefs to declare template-based types that you use to avoid ugliness e.g. typedef std::list<MyType*> MyTypeList;
3. Always insert spaces in between operators and operands (x + y, not x+y)
4. Use parenthesis to make the operator precedence unambiguous, even when it is not required ((x * y) + 1, not x * y + 1)
Error handling
1. Fatal errors should always be dealt with though exception handling. No return-value error reporting.
2. Whenever you make an assumption in your code, verify it with an assert().
Design issues
1. Use existing design patterns and identify them by their well known names. A good starting reference is the 'Gang of Four' book.
2. Use strong encapsulation. Top-level interfaces should hide implementations and not require the user of the library to understand internals. Avoid public attributes except in structs.
3. Don't use 'friend' if you can avoid it. Where classes need to collaborate on an internal implementation, prefix the methods they use to communicate with '_' (this is our demarcation for 'recommended for internal use only'). This can also be used to expose advanced functionality only intended for very skilled users.
Final words
If in doubt, do as the existing code does!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值