Seija
首页
Travellings
登录
注册
首页
文章
非主流引擎开发不出来 (1) : 轻骨架
#### 概述 第一步先来点简单的, 写一个超轻量的骨架. `引擎是模块的集合` 这种设计思想几乎已经被大部分人所承认了, 但是究竟怎样才能做到模块化低耦合,这并不是一件特别容易的事情. 我们不妨这里先把模块化设为我们的一个设计原则,当我们偏离了原则的时候我们在折返回来. #### 常见的模块设计方式 ``` class BaseModule { bool Boot(); bool GetInfo(); bool Quit(); } class AModule :BaseModule {} class BModule :BaseModule { } class SomeManager { List
modules; } ``` 我想大部分人都会很直觉的做出类似上面这样的设计,但是仔细思考之后感觉上面的设计并不是特别合理, 因为每个模块可能并不一定要是一个实例化的对象,他可能只是一组函数,而且像Boot,Quit这种也不是什么通用操作, 仔细思考的话模块和模块之间并有没什么绝对一样的逻辑, 而且`List
`这种对象太动态了不太符合函数式的习惯, 所以这里就不对模块和模块之间设一个统一的抽象,直接利用语言的包管理机制. #### 自下而上 我们学习函数式的时候,最常听到的就是自下而上设计,他区别于面向对象里面人们的习惯自上而下开始, 这里不多做比较,自下而上更看重组合性,我们先以自下而上的方式开始吧. 总之我们这里先给出个App再讨论 ``` Haskell class ModuleBundle a where init::a -> World -> IO Bool start::a -> World -> IO Bool update::a -> World -> IO Bool quit::a -> World -> IO Bool class Game a where ....--类似于ModuleBundle data App g m e = App { moduleBundle:: m, game:: g, evHandler:: EventHandler e, updateLimiter::UpdateLimiter, time:Time, isRun:Bool, world:World } runApp app = do for app.isRun { app.world.process(); app.moduleBundle.update(app.world); app.game.update(app.world); app.updateLimiter.wait(); app.time.process(); } ``` 如上所示几乎全部都是类型参数,不属于app的功能全部推给对应的类型去做. 1. `m`是ModuleBundle, 就是模块组装之后的集合等同于`List
`,但是他不是动态的而是一个具体的类型,每种组装好的模块组合都会特定化为具体的类型. 2. `g`实现的是Game没有什么好说的,就是具体游戏的主类型. 3. `e`是当前App支持的事件类型. 4. `UpdateLimiter` > 所有的示例代码都是伪代码,只是为了表明意思,不需要深究语法 未完,等下次梳理的时候接着写,会有些修改......
登录
登录
注册
最热文章
引擎中Template DSL的设计思考总结
10-19
ReaderT 设计模式
04-23
非主流引擎开发不出来 (n+1) : purescript侧结构设计
04-04
FRP系统的设计
03-17
非主流引擎开发不出来 (1) : 轻骨架
02-11
非主流引擎开发不出来 (0) : 引擎定位
12-09
Rust的ECS库specs
11-20
Haskell类型类高级扩展详细说明
05-31
CMake 速览
05-29
尼采导读:超人与永恒轮回
02-24
为什么elm的结构并不是最合理的?
02-20
React速览
02-20
尼采命运之爱
02-18
AspNetCore 速览
02-17
由Haskell和面向对象引出的关于抽象的思考
12-26
二进制文件压缩工具upx
12-24
Reflex介绍
12-17
Web的前端渲染和WebApi
12-16
前端FRP框架深度踩坑
12-16
Yesod - RESTful (11)
12-16
链接
github
gitee