lua代码规范
– 常用命名类型
– PascalCase(帕斯卡)大驼峰写法:每个单词首字母大写,字母之间不能有空字符
– 例:DailyChallenge、GameModel
– camelCase 小驼峰写法:第一个单词首字母小写,之后的单词首字母大写,字母之间不能有空字符
– 例:dailyChallenge、gameModel
– Snake_case 蛇形写法:每个单词首字母不限大小写,但是单词之间用下划线隔开
– 例:daily_challenge、game_Model、Game_Model
– 匈牙利命名法:属性+类型+变量描述
– 例:g_pPlayer(g_表示是全局变量,p表示是指针,Player表示变量代表玩家) 详细信息链接:https://baike.baidu.com/item/匈牙利命名法/7632397
– 类名 使用大驼峰写法 Player
local Player = class(“Player”)
– 常量 单词使用全大写的蛇形写法 ADULT_MIN_AGE
Player.ADULT_MIN_AGE = 18
– enum,仿枚举类型 使用大驼峰写法
local MoveState = {
Standing = 1,
Walking = 2,
Running = 3,
}
Player.MoveState = MoveState
local Skin = {
id = 1,
attackAddition = 20,
}
Player.Skin = Skin
– 成员函数(ctor、 isAdult)、成员变量(name、scoreEnglish) 使用小驼峰写法
– 但是私有成员变量和方法以下划线开头(_instanceId),私有成员变量和方法不应在类外部被使用
function Player:ctor()
-- 私有变量
self._instanceId = 0
-- 所有非布尔值的变量名必须使用(简明、没有歧义、具有描述性的)名词
-- self.name、 self.age、self.score
-- 所有bool变量名使用大驼峰写法,但是要以小写b为前缀;不要使用询问动词(Is、Has)
-- bad
-- self.bIsAdult = false
-- self.bHasAdRemoved = false
-- good
self.bAdult = false
self.bAdRemoved = false
-- 不要使用bool变量表示复杂状态或相互依赖的状态,请使用enum枚举代替
-- bad
-- self.bRunning = false
-- self.bWalking = false
-- self.bStanding = false
-- good
self.moveState = MoveState.Running
-- 变量命名时要参考上下文去除冗余信息
-- bad
-- self.playerId = 123
-- self.playerScore = 90
-- good
self.id = 123
self.score = 90
-- 变量命名不要携带基础值类型信息[string(str)、number(int、double、float)]
-- bad
-- self.nameStr = "LiMing"
-- self.ageInt = 10
-- good
self.name = "LiMing"
self.age = 10
-- 变量命名中应该包含非基础值类型信息(Struct、Class、Interface)
-- 但是命名也要考虑上下文,如果类拥有该属性(皮肤是角色的组成部分),那么该属性命名时不需要额外的修饰,使用 skin 而不是 mySkin
-- 如果类不拥有该属性(目标敌人不属于炮塔的组成部分),那么该属性命名时需要额外限定描述,使用 targetPlayer 而不是 player
-- bad
-- self.mySkin = Skin.new()
-- self.player = Player.new()
-- good
self.skin = SKin.new()
self.targetPlayer = Player.new()
-- Array 数组 命名规则如上,但要采用复数形式
-- self.targetPlayers、self.skins (or / not)self.targetPlayerList、self.skinList
self.fishs = {}
self.fishList = {}
-- Map 字典 命名规则如上,但要加上后缀 Map
self.sceneMap = {}
end
– 私有函数
function Player:_swithSkin(skin)
end
– 函数 所有函数应该是动词,函数和事件都是要执行某种形式的动作,无论是获取信息、计算数据、或者引起其他反应
– 所以函数需要被命名为现在进行时动词,同时要结合上下文表达出要做的事情
– onResponse 事件响应函数是个例外,不需要以动词开头
– bad
– dead -是已经死了?还是将要死?
– rock
– processData - 没有描述清楚要处理什么数据,容易产生歧义
– playerState - 名词将会产生歧义
– good
– receiveMessage
– sortPlayerArray
– updateTransform
– getCoordinates
– isEnemy - "is"是动词
– 需要返回bool值的函数,应以询问句形式命名,以is、has、can等开头
– isDead
– isAlive
– isVisible
– hasWeapon
– canReloaded
function Player:isAdult()
return self.age >= ADULT_MIN_AGE
end
– 事件处理类型函数应该以on为开头,on后边接动词
– 和 on 组成常规搭配的词组(例:onDeath)不受on后边接动词限制
function Player:onClickBtnStart()
end
function Player:onDeath()
end
function Player:onPickUp()
end
– 分类 当一个类包含大量属性时,应该考虑将部分相关属性拆分到分类里
– bad
local Card = {
x = 0,
y = 0,
r = 0,
rank = 10,
suitColor = "Black",
suitKind = "Hearts",
bFeatherCovered = false,
featherCount = 2,
bIceCovered = false,
iceCount = 1,
}
– good
local Transform = {
x = 0,
y = 0,
r = 0,
}
local PokerFace = {
rank = 10,
suit = “Hearts”,
color = “Black”,
}
local EffectFeather = {
bCovered = false,
count = 2,
}
local EffectIce = {
bCoverd = false,
count = 1,
}
local Card = {
transform = Transform,
pokerFace = PokerFace,
effectFeater = EffectFeather,
effectIce = EffectIce,
}
return Player