一、类名命名规范及使用约定类名命名规范根据各种类的类型和用途,采用不同前缀+名词的命名方式。
名词采用波浪法,必须使用可以明确表达变量意义的英文名词。
前缀UE封装类•模板类以T 为前缀。
•继承UObject 的类以U 为前缀。
•继承AAtor 的类以A 为前缀。
•继承SWidget 的类以S 为前缀。
•抽象接口类以I 为前缀。
•枚举类由E 为前缀•布尔变量必须以b 为前缀(比如“bPendingDestruction”,或“bHasFadedIn”)•大部分其他类都以F 为前缀, 但某些子系统使用其他字母。
•Typedef 应该由相应的类型来前缀:F 则说明是struct 的typedef,U 则是UObject 的typedef,以此类推o对于一个模板的特定化实例来做的typedef 则不再是模板,应该用相应的前缀来定义。
比如:typedef TArray<FMyType> FArrayOfMyTypes;普通类(C++)一般类,采用C+名词的方式命名例如:Class CPerson{Protected :String m_strName;String m_strNickName;};接口类(I)对于无任何实现的纯虚类,称为接口类,这些类的特点都是无任何成员变量,存在需要其他实现类实现的纯虚函数。
接口类必须采用I+名词的方式命名。
例如:class IDataInput{Public :virtual ~IDataInput() {};virtual void read() = 0;}结构体(T)Struct,结构体,必须以T+名词的方式命名。
例如:typedef struct _t_mystruct{Unsigned int number;Unsigned int value;Char name[255];}TMyStruct,* TMyStructPtr;模板类模板类,必须以全小写命名。
例如:template<class T,allocator A>class screen : public map<T,A>{}类成员的初始化(Member initialization lists)成员的初始化必须在构造函数名的下一行开始正确写法:gribble::gribble():m_private_data(0), m_more_stuff(0), m_helper(0){}错误写法:gribble::gribble():m_private_data(0),m_more_stuff(0), m_helper(0){}二、数据变量命名规范常量的命名规范:常量名由全大写字母组成,单词间通过下划线来界定。
如:const Int32 MAX_AMMO = 100; 成员变量的命名规范:m+_+[变量类型]+变量名m后带上明确表达变量意义的英文名词而不要用难以表达意义的缩写。
且m后的变量名首字母必须大写。
如:class CMyGame{private :CPoint m_Point;<―――普通类型CGame* m_pGame;<―――指针类型Int32 m_nGameID;<―――整数类型}函数参数的命名规范:采用波浪法来定义函数参数变量。
同样的,也必须使用可以明确表达变量意义的英文名词,而不仅仅是缩写。
[变量类型]+变量名如定义一个读取文件的函数,并且用参数传入一个文件名public boolean readFile(String str FileName){…m_sFileName = str FileName;}局部变量的命名规范:采用全部小写的方式定义局部变量名。
而且尽量用有意义的名词作为变量名。
局部变量不需要在前面增加变量类型标识。
public boolean readFile(){String filename = “e.ext”;}局部循环变量的命名规范:用小写的i、j、k依次作为循环变量如:for (int i = 0 ; i < 10 ; i ++ ){for (int j = 0 ; j <10 ; j ++ ){}}使用Auto如:TMap<FString, int32> m_mapTest;for (auto& Kvp : m_mapTest){UE_LOG(LogCategory, Log, TEXT("Key: %s, Value: %d"), Kvp.Key, *Kvp.Value);}临时变量的命名规范:一般情况下尽量使用有意义的变量名,如果是某变量的临时变量,可采用前面增加tmp 前缀的方式。
如果实在没办法,可采用tmp、temp等作为临时变量名,但不可以过多定义诸如tmp1、tmp2等变量,如果出现此情况,则必定可以采用有意义的名词代替。
int tmpserialno = m_nSerialNo++;tmpserialno %= 10;m_nSerialNo = tmpserialno;枚举常量采用波浪法加E前缀来定义枚举常量。
同样的,也必须使用可以明确表达变量意义的英文名词,而不仅仅是缩写。
且E后首字母必须大写例如:UENUM()enum class EThing : uint8{Thing1,Thing2};基本C++数据类型的可移植别名•bool 代表布尔值(永远不要假设布尔值的大小) 。
BOOL 将不会进行编译。
•TCHAR 代表字符型(永远不要假设TCHAR的大小)。
•uint8 代表无符号字节(占1个字节)。
•int8 代表有符号的字节(占1个字节)。
•uint16 代表无符号"短整型" (占2 个字节)。
•int16 代表有符号"短整型" (占2 个字节)。
•uint32 代表无符号整型(占4字节)。
•int32 代表带符号整型(占4字节)。
•uint64 代表无符号"四字" (8个字节)。
•int64 代表有符号"四字"(8个字节)。
•float 代表单精度浮点型(占4 个字节)。
•double 代表双精度浮点型(占8 个字节)。
•PTRINT 代表可以存放一个指针的整型(永远不要假设PTRINT的大小)。
请不要在可移植代码中使用C++ 整型,因为需要根据编译器决定这种数据类型的大小。
变量类型:基本类型(保留类型)指针类型:在变量类前增加p标识,作为标识此变量为指针类型,如:int *pKey = NULL;CDateTime* pDateTime = new CDateTime(0);数组变量命名规范:对于数组类型的变量,需要采用复数s以标识此为数组变量。
如:int m_nKey s[100];double dValues[200];CMyClass Strings[200];对于数组指针变量,同样在类型前增加p标识。
在删除的时候,必须用delete[]的方式删除动态数组,以保证数组内的实例被调用析构函数。
CDateTime* pBirthdays = new CDateTime[20];....delete[] pBirthdays;int* m_pnKeys = new int[20];三、函数命名规范函数名称原则上采用动词名词的组合形式,函数名称采用波浪法,私有函数(private)第一个单词首字母采用小写,后面的单词的首字母采用大写,受保护函数和公开函数(protected和public)第一个单词首字母采用大写如:private:int getTopicID();protected:void OnClick();public:ACharacter* GetPlayer();成员变量必须采用private的定义,不允许使用public定义,并置于类定义的最后,另外用getter和setter的函数访问和修改之(在需要考虑程序大小或者需要将成员变量暴露给蓝图的时候可以忽略此规则)class CTest{public :int getTopicID(){return m_nTopicID;}void getTopicID(int nTopicID){m_nTopicID = nTopicID;}UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "玩家属性")FName m_naPlayerName;private:TInt m_nTopicID;}一个函数只完成一个任务,不要把多个任务放在一个函数中,即使那些任务非常小服务端消息或客户端消息都应该以handle开头handleLoginhandleLogouthandleMainViewClosehandleGoldChange事件的响应函数和派发函数都应该以On开头OnDeathOnPickupOnReceiveMessageOnMessageRecievedOnTargetChangedOnClickOnLeave每个函数的大小不要超过100行四、Const 正确性const 既是对编译器工作的引导,也是说明文档,因此应该尽可能的遵守正确使用const 的形式。
这里包括当函数不修改传入参数时,应在参数中使用const 指针或引用,如果一个函数不修改对象则将它标记为const,以及在对于不修改外部容器的循环使用const 修饰。
void SomeMutatingOperation(FThing& OutResult, const TArray<int32>& InArray); // InArray不可以被函数内部修改, 但OutResult的属性可以被修改void FThing::SomeNonMutatingOperation() const{//此代码不会修改它所在的类(this)的成员变量}TArray<FString> StringArray;for (const FString& : StringArray){// 该循环不可以修改StringArray的内容}Const 也应该对于使用值的方法下被使用。
这里就告诉代码的读者该变量并不会在函数体内修改,会帮助理解代码。
这么做的事情也请保证函数申明和定义一致,因为这也会影响JavaDoc 的过程:void AddSomeThings(const int32 Count);void AddSomeThings(const int32 Count){const int32 CountPlusOne = Count + 1;// 函数内部不可以对Count或者CountPlusOne进行修改}这里有个值传递参数的例外(查看"Move semantics"),但这种情况很少见。