如何提高代码可读性?(心塞)

发布于 2022-09-01 22:36:47 字数 3561 浏览 33 评论 0

项目中用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

青春有你 2022-09-08 22:36:47

典型的过度封装,估计你是撸java撸多了,只是属性的get set本来就不该用方法包一层,这些get set又没有额外的处理逻辑,你自己都说不出为什么要这样做。而为了这种不知所谓的封装再封装多一层简直就是作死,你考虑过别人追踪你的代码吗?当别人只想尽快搞清楚你这些代码干什么用的,结果你告诉别人你只是把等号改成方法名然后还为这种修改封了一个基础类?别人分分钟想打死你啊。

许仙没带伞 2022-09-08 22:36:47

xxx.name跟xxx.getName()真的有区别吗

西瑶 2022-09-08 22:36:47

不懂LUA,说几点个人看法.
1.我看你的库表信息都放到MVC层了,建议封装到持久化层.
2.没看懂你的MVC结构, 貌似看到的是都是Model模块.
在Model模块,你对数据的初始化和默认值做了很多逻辑处理, 这就是对Model的污染,破坏了MVC结构.

使代码清晰的几点
1.命名规范.
2.统一格式. 破坏格式的代码单独写在一处
3.分层.
4.原子化.一块代码只完成一件事
5.适当的注释.要简单明确

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文