可能大多数人学习编程都是从C语言开始的。然后在学C++的时候听过这样一句话:C语言是面向过程的、C++是面向对象的。
这让很多人潜意识里觉得, “面向对象 比 面向过程 更高级”!
其实并不是这样,它俩的地位应该是平等的、缺一不可的。
---------------------------------------NRatel割---------------------------------------
“过程”在程序中无处不在。不管你写的是同步逻辑还是异步逻辑,都是一个个“过程”。
而 “面向过程” 就是以“过程”为中心的编程思想。
如果将面向过程当作核心思想,
那么:面向过程就是在告诉你怎么做这件事,而面向对象则将做事过程中涉及到到的数据和行为进行了合并整理,形成了一个个对象。
-------------------------------------------------------------
面向过程的精髓在于 自顶向下地分解问题!!!。
有两个痛点,
1、面对一个复杂问题要如何分析?
2、异步逻辑,回调飞来飞去,绕得人头大,要怎么理顺?
先整体,再向下细分,可以得到完整答案(就像一个分层状态机)。
需要注意的是:你应该知道当前处于什么状态,应该怎样回到主流程上去。
-----------------------------------------------------------------
在游戏开发中,最典型的就是 游戏启动流程。
游戏在启动时,有一大堆事情要做。这里给出一个过程分析。
原图在我的 processon上 :游戏启动流程 | ProcessOn免费在线作图,在线流程图,在线思维导图 |
不同的项目可能需要调整顺序 或 干掉其中某些部分。
如:单机游戏可以不更新;通服游戏可以略过服务器选择的过程;单一角色的游戏可以略过角色选择的过程。
---------------------------------------NRatel割---------------------------------------
另外,游戏开发中,还有回合式战斗、游戏结算 等等很多情形都有一大堆异步过程在里面。
用好过程分析,然后将各个子模块也要尽量设计得 “高内聚” 一些(不该本模块负责的事情不管)。
一切将变得井井有条。
简例说明(lua):很明显,func1容易飞来飞去找不见(尤其是各过程方法分散在不同文件中时),func2的方式则简明清晰。
local x = {};
----------------互相耦合的方式----------------
function x:aaa(onFinish)
self:bbb(onFinish)
end
function x:bbb(onFinish)
self:ccc(onFinish)
end
function x:ccc(onFinish)
onFinish();
end
function x:func1(onFinish)
self:aaa(onFinish)
end
----------------自顶向下的方式----------------
function x:aaa(onFinish)
onFinish()
end
function x:bbb(onFinish)
onFinish()
end
function x:ccc(onFinish)
onFinish()
end
function x:func2(onFinish)
self:aaa(function()
self:bbb(function()
self:ccc(function()
onFinish();
end)
end)
end)
end
--------------------------------
function x:main()
self:func1(function() print("结束") end)
self:func2(function() print("结束") end)
end