这应该是几年程序员可以写出的代码?

2018-01-29 09:14:12 +08:00
 huanyingch01

如下代码是是在某个类中的某个 api,项目中各处充斥着大量这种函数

function ChangeUserPropertiesResult:execute()
    local processQueue = {}

    local resultData = self.mData.resultData
    local allAnimationData = {}

    --dump(resultData, "resultData resultData", 10, 2)
    if resultData.uaitems and next(resultData.uaitems)  then
        for _,item in pairs(resultData.uaitems) do
            local aniResult = {}
            local userid = item.userId or item.userid

            if item.name == Player.DIRECTION then 
                SingletonShareData:getPlayerWithId(userid):updateDataBonusWithName(Player.DIRECTION,{count = item.count})
                --
                local bd = MapDataManager:getUserPosition(userid).branchDirection or -1
                MapDataManager:saveUserPosition(bd,userid,"branchDirection")

                local posData = MapDataManager:getUserPosition(userid)
                -- local nextPaths = PathFinder:findPathFromToEnd(posData.nowPos, item.count, 1)
                -- local nextPath = nextPaths[1]
                local tilePath = posData.nowPos
                -- AvatarWalker:setStandAction(userid, tilePath, nextPath)
                AvatarWalker:setAvatarPosition(userid,tilePath)

            elseif string.find(item.name,"c_") ~= nil then
                local cardid = string.sub(item.name, 3, -1)
                local action = ""
                if item.count > 0 then
                    action = "add"
                elseif item.count == 0 then
                    action = "clear"
                else
                    action = "remove"
                end

            
                local itemType,itemName = unpack(string.split(item.name,"_"))
                local cradsData = cc.exports.SingletonShareData:getPlayerWithId(userid):getDataBonusWithName(Player.CARDS)
                local isHasBaoXianKa = false
                if cradsData then 
                   for k,v in pairs(cradsData) do
                        if tonumber(v) == 29 then
                            isHasBaoXianKa = true
                            break
                        end
                    end
                end
            
                local isEnterHospital = cc.exports.SingletonShareData:getPlayerWithId(userid):hasStatusWithName("hospital")
            
                if (isEnterHospital == true and isHasBaoXianKa == true) and tonumber(itemName) == 29 and item.count < 0 then
                    local data = {}
                    data.cardId = tonumber(itemName)
                    data.playerId = userid
                    local dialog = require("app.process.CardUseController").new() --// 建议位置
                    dialog:setInputData(data)
                    if data.cardId then
                       table.insert(processQueue, dialog)
                    end
                    --行为记录
                    PlayerActionRecordHelper:pushRecordData({tips_name="tips_card_other",function_name="getCardContent",data={userId=userid,resultData={cardid=data.cardId}}})

                    EmotionResult:getInstance():pushEmotionData({userId = userid,action = EA_USE_CARD,cardId = E_CARD_INSURANCE})
                    EmotionResult:getInstance():execute()                    
                end

                aniResult = {userId = userid,action=action,itemName = cardid,itemType = "card"}
                if item.count > 0 then
                   for k = 1,item.count do
                       cc.exports.SingletonShareData:getPlayerWithId(userid):updateDataBonusWithName(Player.CARDS,{itemName = cardid, action = action})
                    end
                else
                    cc.exports.SingletonShareData:getPlayerWithId(userid):updateDataBonusWithName(Player.CARDS,{itemName = cardid, action = action})
                end
            else
                cc.exports.SingletonShareData:getPlayerWithId(userid):updateDataBonusWithName(
                                                item.name,{itemCount = item.count})
                if item.count > 0 then
                    aniResult = {userId = userid,action="add",itemName = item.name,itemType = "points"}
                end
            end

            allAnimationData[#allAnimationData + 1] = aniResult
        end
    end


    local diplayCtrlName = self.mExtraData and self.mExtraData.displayCtrlClass --or "UserPropertiesDisplayResult"
    if diplayCtrlName then
        local ctrl = require("app.processResult.displayResult."..diplayCtrlName).new()
        ctrl:setInputData(allAnimationData)
        ctrl:setCallBack(handler(self,self.executeProcessComplete))

        table.insert(processQueue, ctrl)
    end

    if next(processQueue) then
        local processCtrl = require("app.process.ProcessQueue").new(processQueue,function()
            self:executeProcessComplete()
        end)
        processCtrl:handlerQueue()
    else
        self:executeProcessComplete()
    end
end
9617 次点击
所在节点    程序员
87 条回复
rrfeng
2018-01-29 10:59:29 +08:00
lua

挺整齐...
mrgeneral
2018-01-29 11:00:48 +08:00
刚开始还以为是 python 仔细一看代码是 lua

也不是 nginx,都没有 http 相关的函数

游戏吧,看到一个 Animation 哈哈
xd314697475
2018-01-29 11:02:41 +08:00
别猜了,这是 lua
先做个小科普

# 1. lua 语法特征:
if ... end
for .... end

# 2. php 语法特征:
php 的特征符号是$(面向$编程)
变量前面带有$, eg. $a; $b;
注意结尾的;
语法整体上有 C 语言的感觉

# 3. java 语法特征:
类似 C 语言
作为面向对象语言的代表,就是对象多,注意结尾有;
new 关键字,public class,
eg. ObjectReference = new Constructor();

# 4. swift 语法特征:
;分号不是必要的
变量 var,常量用 let
条件语句 if 后面一般省略()


因为对 lua 编程不是很熟悉,而且程序员几年不是一段代码能表现出来的
最好放个项目出来,这样大家更容易了解
Mutoo
2018-01-29 11:08:01 +08:00
这是 Lua 语法,看到 cc.* namespace 应该是 cocos2d-lua 没跑。
acros
2018-01-29 11:10:07 +08:00
没啥问题啊。
是某个 RPG 游戏的 lua 脚本,初看就是退出人物装备(属性)界面,调用这个脚本处理结果的,除了中间 MagicNumber ( BaoXianKa···猜测为和策划运营统一,用的拼音)。
vincentjie
2018-01-29 11:12:42 +08:00
1. 这是 Lua
2. 这是基于 Cocos2dx-Lua 开发的手机游戏
3. 代码确实写得不够好的地方,但是以现在国内的手游开发现状的话,我也能理解为什么有时会写出这种代码
3.1 槽点。其实主要是影响可读性的或者影响维护效率的问题
3.1.1 在代码中直接使用常量
3.1.2 函数过长
3.1.3 嵌套过深
3.1.4 在逻辑主干上处理特殊情况下的逻辑
3.1.5 某些成员变量具有多重职责
3.2 可能造成这种状况的原因
3.1 开发人员素质参差不齐
3.2 项目开发进度紧张
3.3 策划人员素质参差不齐
3.4 项目开发进度压力较大时,缺乏重构的动力及条件

我以前刚接手一个老项目的时候,也产生过楼主这样的想法,我那个项目比这个还要复杂很多。动辄一两万行的 C++类,动辄几百行上千行的函数,结构混乱,层次不分。但随着项目一点点推进,参与项目的人越来越多,打包、测试越来越频繁,我逐渐理解为什么之前的代码里面充斥着那么多的垃圾。甚至有的时候,我自己都会写一些自己之前所不屑的垃圾。
vincenttone
2018-01-29 11:13:46 +08:00
半年到一年半
acros
2018-01-29 11:16:02 +08:00
@vincentjie
3.1.4 在逻辑主干上处理特殊情况下的逻辑
这条你可以删了。
Lua 就是为了处理游戏中各种业务逻辑特例才引入的。游戏开发不可能为了几个特例又拉开什么架构设计。
要不然全部 C++解决了。
newtype0092
2018-01-29 11:20:49 +08:00
@xd314697475 其实 lua 还有两个最大的特点是 local 关键字和内置 lib table

@mrgeneral 这个是用 Cocos2d-x 写的游戏,cc 是 libcocos2dx 的前缀。
vincentjie
2018-01-29 11:44:57 +08:00
@acros
现在的 Lua 早已经不局限于处理业务逻辑特例了,为了在 iOS 平台上能进行热更新,更多的是,绝大多数性能不敏感的逻辑都已经全部放在 Lua 下处理了。不局限于 Cocos2dx,也包括基于 Unity 开发的游戏。
slicent8
2018-01-29 11:47:41 +08:00
@MyDaLin 看你的网页样式 应该是 10 年以上了
huanyingch01
2018-01-29 11:55:07 +08:00
@vincentjie 同学说的基本都是对的。本意只是吐槽一下 函数过长,没有拆分,内容过多。还有这是具有 10 年开发经验的程序员写的。
imdoge
2018-01-29 12:04:51 +08:00
@MyDaLin 居然月访问上 1000k 了还在上涨中……怎么不挂点广告
fxxkgw
2018-01-29 12:27:28 +08:00
大惊小怪,我会跟你说华为很多交换机驱动代码一个函数上万行么。。。茫茫多的 if else define 这种代码根本无法重构,但不得不说还是很稳定的。。
xlrtx
2018-01-29 13:25:43 +08:00
lua 的数据结构只有 table, 可以做列表, 也可以做字典, 对象.
ayyll
2018-01-29 13:43:43 +08:00
@MeteorCat 排除法,首先,这不是 C
discrete
2018-01-29 13:43:56 +08:00
``isHasBaoXianKa`` 23333
seancheung
2018-01-29 13:50:25 +08:00
这是 lua 啊,还是 cocos2d
seancheung
2018-01-29 13:50:51 +08:00
还没说完。。就是嵌套太多,局部变量太多
chocotan
2018-01-29 13:59:29 +08:00
代码写的优雅与否基本不在面试的考查范围内吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/426672

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX