如何提高代码可读性?(心塞)
项目中用lua搭建了一个mvc的简单架构。其中再使用model层的时候,起始的用法是这样的:
local ItemBase = class("ItemBase")
function ItemBase:ctor( data )
self.id_ = 1
self.name_ = "Jone"
self:onCreate(data)
end
function ItemBase:getId()
return self.id_
end
function ItemBase:getName()
return self.name_
end
function ItemBase:onCreate(data)
self.id_ = data.id
self.name_ = data.name
end
return ItemBase
当属性有十多个的时候,是不是觉得很累,重复代码,纯粹的劳动力,所以我们决定写一个基础类,避免重复写get set 的方法, 不用自己一个个去赋值。下面是本人再和同事一起讨论后,现实的代码:
DATATYPE = {
int = 0,
string = "Empty",
bool = false,
table = {},
}
ErrorKey = "ErrorKey"
ErrorValue = "ErrorValue"
local ModelBase = class("ModelBase")
-- 数据表
ModelBase.PARAMS = { "int_id", "string_name", "bool_isOwn", "table_skills"}
function ModelBase:ctor( data )
if not self.PARAMS or type(self.PARAMS) ~= "table" then
assert(self.PARAMS, "ModelBase:initModelParams_() - not get params table")
return nil
end
-- 初始属性值
self:initModelParams_()
-- 赋值
self:setValueFromData_(data)
end
-- 初始属性值
function ModelBase:initModelParams_()
local param , defaultValue, key
for i = 1, #self.PARAMS do
param = string.split(self.PARAMS[i], "_")
defaultValue = self:getDefaultValueByType_(param[1])
key = self:getSelfParamFormat_(param[2])
if ErrorValue == defaultValue or ErrorKey == key then
printError(string.format("param name is [%s], data type is [%s], failed to init defaultValue", param[2], param[1]))
else
self[key] = defaultValue
end
end
end
-- 获取私有变量的格式
function ModelBase:getSelfParamFormat_( key )
key = key or ErrorKey
return string.format("%s_", key)
end
-- 获取默认值
function ModelBase:getDefaultValueByType_( dataType )
local defaultValue
if isset(DATATYPE, dataType) then
defaultValue = DATATYPE[dataType]
else
printLog("ModelBase", string.format("The date type of [%s] get value by child implement", dataType))
defaultValue = self:getDefaultValueByCustomerType_(dataType)
if not defaultValue then
defaultValue = ErrorValue
end
end
return defaultValue
end
-- 用户自定义数据类型
function ModelBase:getDefaultValueByCustomerType_( dataType )
-- child implement
end
function ModelBase:setValueFromData_(data)
if not data or type(data) ~= "table" then
assert(self.PARAMS, "ModelBase:setValueFromData_() - not get data table")
return
end
for key, value in pairs(data) do
self:setValueByKey(key, value)
end
end
-- 获得值
function ModelBase:setValueByKey( key, value )
local selfParam = self:getSelfParamFormat_(key)
if isset(self, selfParam) then
if type(value) == "table" or type(t) == "userdata" then
self[selfParam] = clone(value)
else
self[selfParam] = value
end
else
printError(string.format("[ModelBase]:The key of [%s] is not set.", key))
end
end
-- 获得值
function ModelBase:getValueByKey( key )
return self[self:getSelfParamFormat_(key)]
end
return ModelBase
基本思路是用一张表来控制所有的属性和对应的数据类型,只要遍历一遍表,就可以生成所有属性并且设置默认值。刚刚写完,自我感觉还不错,对于各种异常情况也都考虑到了。提交,完美。
但是请同事review了之后,反馈给我的是可读性不是很高,看着有点晕。这样的反馈着实吓到我了,我觉得很清晰啊。下一秒,我就考虑是不是我是在用自己习惯的代码思路在实现功能,请其他程序员来看,觉得比较跳,说明自己写的东西可读性不够高。
我们在沟通后,同事也没能说服我怎么提高代码的可读性。所以想把代码贴出来,请大家帮忙一起看看,多谢各位的指导啦。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
典型的过度封装,估计你是撸java撸多了,只是属性的get set本来就不该用方法包一层,这些get set又没有额外的处理逻辑,你自己都说不出为什么要这样做。而为了这种不知所谓的封装再封装多一层简直就是作死,你考虑过别人追踪你的代码吗?当别人只想尽快搞清楚你这些代码干什么用的,结果你告诉别人你只是把等号改成方法名然后还为这种修改封了一个基础类?别人分分钟想打死你啊。
xxx.name跟xxx.getName()真的有区别吗
不懂LUA,说几点个人看法.
1.我看你的库表信息都放到MVC层了,建议封装到持久化层.
2.没看懂你的MVC结构, 貌似看到的是都是Model模块.
在Model模块,你对数据的初始化和默认值做了很多逻辑处理, 这就是对Model的污染,破坏了MVC结构.
使代码清晰的几点
1.命名规范.
2.统一格式. 破坏格式的代码单独写在一处
3.分层.
4.原子化.一块代码只完成一件事
5.适当的注释.要简单明确