我们是否可以像雷总一样
大家都说他的代码,像诗一样优雅
一个MVC 框架,加注入
(以下内容其实和雷总没什么关系,也和雷总当年代码毫无关系,不过先“阅读理解”一下)
雷总-写的代码像似一个优雅??!!^^
RI.asm 是一个当时放在5寸盘的文件名+后缀
估计内存太少,所以这个代码的功能:“一键清理内存”,和今天大家看不起的360差不多
(已经去到2.0版本了,这我多次提到:能到3.0版本的代码,如果不是垃圾代码,就是比较神的代码)
SPDOC | DOC,(dos)你懂的,但人家已经是v6.0 |
WPS | v3,!!!!!版本3,,,雷总和求伯君,牛逼 |
Game Busters Ⅲ,Ⅳ | v3,v4??? 一个2D像素格子游戏(1990当时的引擎) |
NETX | Novell公司 可以看下图,是对上的, 一个早期的【RPC】??早期和微软合作,微软做大了,后来2014年这公司就没了 |
PC-CACHE | How to Clear Your PC's Cache in Windows 10 |
Norton Chche | 后来很出名的Norton软件 |
Microsoft SmartDrv | 缓存换IO读取速度,可以说内存是少,但IO更弱,还是物理硬盘的时代,转速很慢 |
SideKick 1.56A | SideKick 和 Buster都是相当地道的,美国俚语,不知道当年的雷总理解是否OK?? |
MOUSE Driver | LOL等游戏将鼠标带到了一个不属于它的高度,当年的鼠标驱动也是可选的,随着AI和电车的发展,估计不久的之后也会变成可选 |
Crazy | cga?? mono ?? chrome ?? 这么神,这是1990?? |
RAMBIOS v2.0 | (日本人 at 1985, 40年前??!!^^)----------- 由 H Kihara 著作 · 1985 — [RAMBIOS--a new review index]. Tanpakushitsu Kakusan Koso. 1985 Dec;30(13):1421-3. [Article in Japanese]. Author. H Kihara. PMID: 4089205 |
?86MAX 6.01 | <没查到这个是什么么> |
可能关联也可能无关的参考图一个:
真正Unity的一个Mvc框架
基础的MVC层
public sealed class EnemyModule : Module<EnemyModuleView>{// private readonly List<EnemyController> _enemies;public EnemyModule(EnemyModuleView view) : base(view){// _enemies = new List<EnemyController>();//不算太严谨的MVC,但本身结构就必须往MVC靠,}//。。。。}//个人发现 abstract和interface 其实理论作用,大于实际作用,大部分用virtual解决即可;
//因为大部分程序,都是建基于一个虚拟机,而虚拟机或运行时--相当于一个大的abstract层了,
//所以粒度去到 virtual 即可
//这个代码非常严谨的“理论正确”,但又不是很往APP层MVC上面 严格去靠
//这代码其实有些“高不成,低不就”,,能用,但不实用的
namespace Game.Level
{public abstract class Module : IDisposable{public abstract void Initialize();public abstract void Dispose();}public abstract class Module<T> : Module{protected readonly T _view;protected Module(T view){_view = view;}}
}
用法也很简单
我比较佩服的是:它直接用 namespace Game.Level,直接用Game 和 Level 这么通用的关键字做命名空间
还有高手,我是真想看看啊谁用 Hello World!!做类名的
用法也很简单,利用了Unity的一些结构,和API
public virtual void InitLevelModules(){//AddModule<CashModule, CashModuleView>(_levelView);//_levelView 会清掉AddModule<CashModule, CashModuleView>(_gameView);//在gameView,必须设置成gameViewAddModule<EnemyModule, EnemyModuleView>(_levelView);AddModule<BulletModule, BulletModuleView>(_gameView);AddModule<MarkerModule, MarkerModuleView>(_gameView);//_gameView 在 gamePlay.scene,应该会保留}/// <summary>/// 做了几件事情:/// 创建view,挂在场景(*可不同scene)中的; 创建Module;Inject注入;调用初始化Init();/// </summary>/// <typeparam name="T"></typeparam>/// <typeparam name="T1"></typeparam>/// <param name="component"></param>protected void AddModule<T, T1>(Component component) where T : Module{var view = component.GetComponent<T1>();#if UNITY_EDITORif (view == null){Debug.LogError(typeof(T1) + "(ModuleView)不存在,可能设错位置了,");}#endifvar result = (T)Activator.CreateInstance(typeof(T), new object[] { view });_levelModules.Add(result);_injector.Inject(result);result.Initialize();}
AddModule调用,做了两个事情
- BulletModule 通过 Activator,进入到内存,并不会在Unity Inspector显式显示
- BulletModuleView 并不会创建一个Component 在一个GameObject 节点,而是这个GameObject传进来时,是要先自带xxxxView的节点(Unity的引擎世界里,其实没那么严谨)
不得不说
Unity拖动到Inspector可以自动识别GameObject,Transform,还是XXXModuleView(Component),3种状态都能自动识别,都能互相引用;新人可能会觉得很鸡肋,很困惑; 但这种多态的实现功能,实在是很超前很超前,很牛逼
这才是,像诗歌一样的艺术品
完全是为了用户实用方便,又结合技术力的Editor; 这才是真正漂诗歌;
诗歌 如果是不实用的,就是那些不实用的MVC框架,或者很多坚持JAVASCRIPT代码团体,
你的代码是按照那些本身不写代码,或者做的游戏自己不玩,或者写的APP只是卖广告,的人提出需求完成,有可能写得像诗歌么;
《写了两天,写不完,之后再补充》Inject注入部分,和State声明手机
参考
C# 使用模式匹配的好处,因为好用所以推荐~ - 万雅虎 - 博客园
SHADER的动态组合_动态shader-CSDN博客