自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(330)
  • 资源 (4)
  • 收藏
  • 关注

原创 搬砖方法论:控制反转

我需要一个汉堡当我们去快餐店向服务员说明一个需要一个汉堡时,服务员会向我们提供一个已经加工完成的汉堡。可能每次提供的汉堡都有稍许不同,例如肉质、温度、面包的厚度、有无圆葱等等,但是他都符合汉堡的基本定义:在最少2片面包中添加肉类的食物。控制什么?就像前面提到汉堡的例子一样,如果我们是一个控制狂,需要对汉堡食材的每一步都进行控制(定制),控制食材得来源、获取途径、加工步骤、回收的地点乃至时机,...

2021-08-10 21:19:18 240

原创 搬砖方法论:通用语言和领域模型

你在说什么?创世记第11章1-9句记录了“巴别城”的故事。当时地上的人们都说同一种语言,当人们离开东方之后,他们来到了示拿之地。在那里,人们想方设法烧砖好让他们能够造出一座城和一座高耸入云的塔来传播自己的名声,以免他们分散到世界各地。上帝来到人间后看到了这座城和这座塔,说一群只说一种语言的人以后便没有他们做不成的事了;于是上帝将他们的语言打乱,这样他们就不能听懂对方说什么了,还把他们分散到了世...

2021-07-18 00:46:40 247 1

原创 搬砖方法论:保持约束的单例

单例作为一种可供全局使用的唯一对象,而被普遍使用。但是能够这么做不代表就应该这么用。单例在带来便利的同时也应该受到约束,如果一个单例遍布每个模块各处,这本身就是错误的使用方式,其缺点如下:如果需要修改API,则涉及范围过大各功能模块会直接将依赖关系与其绑定在使用时可能会调用不正确的API、错误的调用顺序又或者更改其内部状态所以在使用单例时,从API设计上来讲,允许同一API可以反复被...

2021-05-11 23:31:59 204

原创 搬砖方法论:服务定位模式(Service locator pattern)

定义服务定位模式(Service Locator Pattern)指的是在组合根以外的地方,以不确定的一群不稳定依赖对象,作为依赖需求组件提供给应用程序使用。更多解释详见服务定位模式-维基百科filepublic class MainCityController{ public MainCityController() { } public ...

2021-05-11 01:57:15 361

原创 搬砖方法论:New操作的危害

在编码时,只要在需要时进行New操作,不仅可以节省编码的时间,还可以直接获取当前需要的具体依赖项,但是事物总有两面性,在带来便利的同时,频繁的New操作也给维护带来不小的危害。最主要的危害就是对依赖项的强制绑定,让其后期的维护过于困难,具体如下所示类的替换需要逐一排查,大大增加了错、漏替换的几率new造成的依赖强制绑定,可能会造成因一个类需要替换,而必须替换其他类的这种连锁效应如果后期维...

2021-05-10 20:41:07 183

原创 搬砖方法论:在构造函数中集中初始化的意义

在构造函数中的初始化,一般都是此类或结构必须涉及的依赖关系及数据。从依赖关系的角度看,在构造中集中处理有如下好处可以清楚的知道此类或结构中所需的依赖关系一次性进行判空处理,避免后续使用的多次判空操作随着需求后续的变更,更直观的知道此类或结构的依赖关系、担任职责是否过多,如发现违背单一原则及早进行处理从数据的角度看,在构造中集中处理有如下好处全面了解此类需要的数据便于数据更改,减...

2021-05-09 21:24:02 96

原创 搬砖方法论:接口还是抽象

概念上的区别抽象是含有,接口是能够。抽象更多描述的是一个交集、根基的概念,而接口更多表达的是一种功能,一种可随时增删的能力。接口是首选语法上接口可以多重继承使用接口更利于编写 组合优于继承(Composition Over Inheritance) 这种方式的代码接口更简洁,目的更明确利于后期功能的增减更多文章详见主页:www.aihailan.com...

2021-05-06 22:50:14 67

原创 搬砖方法论:上帝对象(God Object)

定义在面向对象编程领域,上帝对象(God object)是一个了解过多或者负责过多的对象。 上帝对象是 反模式(anti-pattern) 和 代码异味(code smell)的例子。全能的上帝笔者曾在某个项目遇到了这种"上帝"工具类Helper和Tools,里面涵盖的功能真是五花八门,UI快捷设置、时间戳的各种扩展、数据的验证、对应的业务逻辑等等。犹如工具类的跳蚤市场,新旧API集聚于此...

2021-05-06 22:27:51 387

原创 搬砖方法论:接口的归属

interface,也就是常说的接口,使用它的地方有两处接口的调用方(各种Manager)接口的实现方(实例)接口的归属应该是属于前者,也就是接口的调用方。file归其原因,要从使用接口的原因说起,使用接口主要是隔离与不稳定依赖的连接,定义使用对象的特点。对于对象特点的确定(interface中的属性或者签名),主动权是在调用方手中,并且主要以调用方自身利益作为出发点进行...

2021-05-06 02:01:45 98

原创 搬砖方法论:稳定依赖性(Stable Dependencies)与不稳定依赖性(VoLatile Dependencies)

在一个模块或者类运行时,总会涉及某些依赖项,从变动的角度看,分为两种:稳定依赖性和不稳定依赖性。稳定依赖性开发已经完成运行环境确定或者对运行环境的变动不敏感,例如:只在某些机器某些版本的系统上运行。有着可预期的行为模式,例如:此模块只做xxx功能。持续性长,后期几乎无改动其对外无依赖或者依赖项也属于稳定性依赖且数量少最显著的稳定性依赖性特点就是常说的硬编码,直接写在代码库里面...

2021-05-06 02:01:03 238

原创 搬砖方法论:命令查询分离原则(Command-Query Separation,CQS原则)

其原则主张方法应给分为两类:查询:方法返回结果,但不改变任何系统状态(无副作用)。命令:方法没有结果,但会改变系统状态。此原则带来的优点如下查询类型的方法,对于调用者来讲不用在顾虑各个查询方法的调用顺序和次数(忽略性能的因素)。命名类型的方法,从语义上来讲更准确。所以在设计时,应将两种状态分开,避免在同一方法中既有查询又有命令。遵循此原则,系统在阅读和维护上会有很大的帮助,...

2021-04-15 23:08:18 694

原创 搬砖方法论:组合根(Composition Root)

什么是组合根定义:指的是在应用程序中的单一逻辑区块位置,在这会将各个模块组合起来。组合根指的不是一个方法、也不是一种类别,而是一种概念。为什么要有组合根在没有组合根时,我们对于依赖的“New”操作常常都会放在构造函数中,这会产生三个问题对应类可能过于关注了具体的依赖细节不利于更改其系统的依赖关系不能见其全貌,分散在各个类的构造函数中。这时我们常会通过依赖注入的三种形式将对应的依赖...

2021-04-05 23:38:02 249

原创 搬砖方法论:时序耦合(Temporal Coupling)

什么是时序耦合在两个或更多的类型、成员之间,必须先调用一个才能调用另一个。这种必须按照特定顺序调用的耦合关系叫做时序耦合。哪些情况会遇到时序耦合读取json、excel等数据时,必须先调用Initialize这类的函数。Lua文件中的全局Helper类,在业务逻辑中使用需要显示的调用Require后才能使用。使用各种Manager时,需要手动再次确认是否进行了初始化。以上的示例,都...

2021-04-05 22:00:18 1223

原创 搬砖方法论:Dependency Inversion Principle(依赖反转原则、DIP原则)

定义DIP原则定义中核心的两句描述为如下两条:高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口(抽象)。抽象接口(抽象)不应该依赖于具体实现。而具体实现则应该依赖于抽象接口(抽象)。三条原则其他原则或者设计模式的解耦手段有很多,DIP的解耦手段就是确定不变,以不变应对需求的多变性,只有不变才是稳定的。什么是不变?不变就是抽象。代码中多用抽象接口,尽最大可能避免使用...

2021-03-29 22:54:05 140

原创 搬砖方法论:Liskov Substitution Principle(里氏替换原则、LSP原则)

初识其定义为:派生类(子类)对象可以在程序中代替其基类(超类)对象。最初接触里氏替换时,我们往往以继承的方式来达到复用的目的,但是其能带来复用的特点仅仅是表现,而非本质。或者说这是利用里氏替换的特点所能做的其中一项。它的核心是什么里氏替换中的替换到底是在替换什么?替换的是一种共识、一种基础、一种至少能做的事。其核心思想:关注的是行为,非具体实现。基于它我们都能干什么利用里氏替换,我们...

2021-03-23 12:37:02 131

原创 搬砖方法论:Open Closed Principle(开闭原则又叫OCP原则)

开放和关闭到底是什么我们可以看一下对于开闭原则的定义:软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。或者更简洁:对扩展开放,对修改关闭。其实我们可以把扩展和修改进行细分。扩展:增加原来没有的功能。修改:对已经含有的功能做规则上的更改。这里面的开闭是以功能为单位,比较成功的应用就是插件,插件的增加和删除,并不会干扰系统中的其他插件,插件间也相互独立。如何...

2021-03-15 16:28:12 123

原创 搬砖方法论:Single Responsibility Principle(单一职责原则又叫SRP原则)

差异的源头前言:语言本身是一件非常不稳定的表达工具,这也是为什么我们在沟通中需要观察对方的表情、肢体动作、给予的隐喻、提供的图像来进一步确定对方想表达的意思,加之语言的使用者和接收者因文化、职业、经历等不确定因素的影响,又会造成相同的语句表达出不同含义,这让语言的精确性再次下降。只有这些?当我们用搜索引擎搜索 SRP原则或单一职责原则关键字,定义中使用频率最多的一句话就是:一个类应该只有一个...

2021-03-13 17:06:33 181

原创 搬砖方法论:搬砖的6个阶段

快、稳、轻、简、美、优 总共这个6个阶段快为了实现而实现,速度第一位,能运行即可稳保证少出BUG,不出BUG轻拆分、精简代码,体量减少简简单易懂美快、稳、轻、简 浑然一体优如果每个程序都让你感到深合己意,那就是整洁代码。如果代码让编程语言看起来像是专为解决那个问题而存在,那就可以称之为漂亮的代码而优雅的代码,任何的添加都是画蛇添足,任何的减少都是一种缺憾更多文章详见主...

2021-03-11 23:23:33 235

原创 搬砖方法论:依赖注入的三种形式

构造注入(Constructor Injection)方法注入(Method Injection)属性注入(Property Injection)又称为:Setter Injection定义Constructor Injection:指的是在类型的构造函数中,以传参的形式,将该类型的依赖关系需求,以静态的形式定义出来。示例代码using System;using UnityEng...

2021-03-10 15:21:55 125

原创 程序开发中能够提高效率小的技巧

以下为笔者整理的一些在开发中提高工作效率的小技巧,希望能够给予你一些帮助和启示。下班前的一小时不要向程序库提交代码。因为很有可能因为文件漏提交,逻辑错误等BUG造成程序库编译失败,阻碍其他同事开发进度。和策划进行需求分析的时候,需要逐条列出所有需求点。这样在开发的过程中不会有遗漏点,二是在自测的测试点会更清晰。功能描述要清晰精确。避免例如:这个地方动一下、升级的时候数值变更一下等不明确的描...

2021-01-19 13:42:46 174 1

原创 广度优先搜索算法(Breadth-First Search , BFS)---解决最短路径问题算法

前言:广度优先搜索可回答两类问题,从节点A触发,有前往节点B的路径吗?从节点A触发,前往节点B的哪条路径最短?image如上图所示,我们需要从You的关系网找到海澜,我们先从一级关系网中搜索,如果一级没有再向外扩展一圈到二级,依次类推,直到搜索所有人或者搜到目标为止。示例代码using System;using System.Collections.Generic;u...

2021-01-18 11:20:47 570

原创 后缀表达式

平常我们所用的标准四则运算表达式,如:29+3-2(10-3)/5,叫做中缀表达式,今天介绍一种不需要括号的后缀表达法,我们也把它称为逆波兰(Reverse Polish Notation ,RPN)表示。后缀表示式为栈数据结构的一种应用。中缀表达式: 2 * 9 + 3 - 2 * (10-3) / 14后缀表达式: 2 9 * 3 + 2 10 3 - * 14 / -其中上面的...

2021-01-11 01:12:52 967

原创 狄克斯特拉算法(Dijkstra算法)---单源最短路径问题

前言:此算法是解决从原点出发到其他节点的最短路径。但是也有此算法的限制条件和前提路径是有方向且无环的路径的消耗不为负数(权重不为负数)题目:如下图所示,从起点为A,终点为F,路径每一条边上的数字为消耗的时间权重,求A点到F点最少需要多少时间?题目:如下图所示,从起点为A,终点为F,经过路径上的每一条边上的数字为消耗的时间权重,求A点到F点最少需要多少时间?file狄克斯特...

2021-01-03 20:54:22 420

原创 Odin Inspector 系列教程 --- SearchableAttribute

通过添加SearchableAttribute特性为其添加一个搜索框,可用于搜索对应的类或其子类的成员,但目前不可用于字典类型。imageusing Sirenix.OdinInspector;using System;using System.Collections.Generic;using UnityEngine;public class SearchableExam...

2020-12-22 12:51:18 958

原创 Odin Inspector 系列教程 --- On Collection Changed Attribute

OnCollectionChanged可以放在集合上,通过inspector更改集合提供事件回调。此外,它提供了CollectionChangeInfo结构,其中包含有关对集合所做的详细更改的信息。但更改其对应Value的内部值是不会进行对应回调的。imageusing Sirenix.OdinInspector;using Sirenix.OdinInspector.Editor...

2020-12-21 08:58:08 772

原创 Odin Inspector 系列教程 --- On State Update Attribute

StateUpdate可以使用在属性字段上,,属性的状态更新时,OnStateUpdate提供事件回调。回调频率每帧至少发生一次,即使属性不可见,也会调用回调。它相当于自定义一个更新回调函数,并且可以通过@+表达式的形式进行回调。imageusing Sirenix.OdinInspector;using System.Collections.Generic;using Unit...

2020-12-21 08:57:56 711

原创 Odin Inspector 系列教程 --- On Inspector Init Attribute

在编译后的第一次绘制进行初始化设置。imageusing Sirenix.OdinInspector;using Sirenix.Utilities.Editor;using System;using UnityEngine;public class OnInspectorInitAttributeExample : MonoBehaviour{ // Start...

2020-12-20 21:26:47 487

原创 Odin Inspector 系列教程 --- On Inspector Dispose Attribute

当重新创建、销毁、置空时,都会执行对应的Dispose操作imageusing Sirenix.OdinInspector;using UnityEngine;public class OnInspectorDisposeAttributeExample : MonoBehaviour{ // Start is called before the first fram...

2020-12-20 21:25:48 161

原创 关于候选人的一些疑问,负责招聘HR给出的解答

一次偶然的机会和公司负责招聘的HR闲聊,有幸了解一些关于招聘选人方向的信息,当然作为交换我也说了一些作为应聘者的真实想法,以下是笔者整理的一些问题和对应的解答,希望能帮助作为读者的你。1. 选简历的关注点都有那些?这个问题主要分为4类人第一类:应届、初、中级的。面对这类人群的关注点是:学历、作品、和实习经验、是否有一些对应的技术博客。第二类:是解决特定问题的人。比如项目遇到一些技术上的瓶...

2020-12-13 16:36:53 697

原创 做决策前有效评估风险的方法 WCCA与WADM

做决策前人们往往摇摆不定或意气用事,不会根据当时的环境进行冷静分析作出判断,正因如此,其结果常常事与愿违,造成或多或少的损失乃至改变自己人生的轨迹。以为笔者列出两条对决策非常有效的方法。其简单性和适用于都不错。WCCA(Worst Case Circuit Analysis 最坏情况分析)其中心思想是在做决策前迅速对一下三种状况进行分析这个选择最坏的后果是什么?这种后果的概率是多...

2020-11-29 07:39:32 1240

原创 关于游戏公司跳槽的心得

前言:关于跳槽的问题大家都不会避免,而且这种问问往往都很隐晦,大家都不喜欢放在桌面上谈起,今天笔者说一说基于以下几点,我所知道的跳槽的历程。0.为什么跳槽一般会有以下几种情况钱给少了,薪水与同等能力下的周围朋友相比差距明显,多少算明显?个人感觉大于等于3K就很明显了。干的不爽技术氛围不好目标不明确,看不到希望leader是个事妈,自己不懂还总认为自己是专业的,刚愎自用那种时...

2020-11-27 18:01:40 613

原创 博客搬迁

基于简书的创作环境过于恶劣,博客正式搬迁到:https://www.aihailan.com/博客/

2020-11-21 01:17:07 66

原创 MVC、MVP、MVVM 解析【理论篇】

前言,在游戏开发中,经常会听到MVC、MVP、MVVM 这类名词,对他们的第一印象多是为了解耦、提高扩展性而选择的软件架构模式,但分别深究它们的区别或优缺点,又往往不得要领,今天笔者就基于Unity游戏开发分别对这三种软件架构模式进行讲解。一、MVC1.1 历史背景MVC模式最早由Trygve Reenskaug在1978年提出[1],是施乐帕罗奥多研究中心(Xerox PARC)在2...

2020-10-07 18:31:06 650 1

原创 上海12家游戏公司面试横向评测

从上家公司技术宅离职,出去玩了一段时间然后开始找工作,有幸接到以下公司的面试邀请,所以借此机会做了一下各公司的面试横评。以下为笔者主观意见横评,仅供娱乐,如有雷同,纯属巧合。第一版,后续还要更改下,有其他疑问可留言,笔者后续进行补充公司 20Max项目 20Max团队 20Max薪资 30MaxHR 10Max总分大G 10101020555...

2020-07-25 11:40:31 394 1

原创 Odin Inspector 系列教程 ---【小工具】UGUI节点收集器(UINodeCollection)

本工具是基于Odin制作,方便查找对应面板的UGUI组件,并提供对应脚本创建、组件赋值、常规冲突检测等机制。方便快捷易上手,笔者已经做好注释,易于魔改。(例如生成Lua文件等)。选择要添加的类型添加对应类型的节点,不符合类型会报错选择UI分部类对应的脚本文件点击【导出对应分部类】按钮,节点出现重名会有提示点击【为...

2020-05-20 18:17:55 660

原创 编写高质量C#代码必备技巧(下)

以下为《编写高质量代码:改善C#程序的157个建议》作者【陆陆敏技】的读书总结,添加了笔者自己的理解或示例。90:不要为抽象类提供公开的构造方法。abstract class MyAbstractClass{ protected MyAbstractClass(){}}91:可见字段应该重构为属性。public string Name { get; set; }。不过笔者认...

2020-04-20 17:08:53 215

原创 Task中的异常处理

建议85:Task中的异常处理在任何时候,异常处理都是非常重要的一个环节。多线程与并行编程中尤其是这样。如果不处理这些后台任务中的异常,应用程序将会莫名其妙的退出。处理那些不是主线程(如果是窗体程序,那就是UI主线程)产生的异常,最终的办法都是将其包装到主线程上。在任务并行库中,如果对任务运行Wait、WaitAny、WaitAll等方法,或者求Result属性,都能捕获到Ag...

2020-04-19 20:55:18 1235

原创 Unity 之如何写出强壮的代码

【反射】Unity C#基础之 反射反射,程序员的快乐Unity C#基础之 特性,一个灵活的小工具【多线程】Unity C#基础之 多线程的前世今生(上) 科普篇Unity C#基础之 多线程的前世今生(中) 进阶篇Unity C#基础之 多线程的前世今生(下) 扩展篇【命名规范】变身整洁代码的66条常用规则Unity 之命名规范(一)Unity之命名规范(二...

2020-03-08 01:54:48 248

原创 编写高质量C#代码必备技巧(上)

首先简述几个概念:FCL:(Framework Class Library)即Framework类库。基元类型:.NET 中,编译器直接支持的数据类型称为基元类型(primitive type).基元类型和.NET框架类型(FCL)中的类型有直接的映射关系,例如:在C#中,int直接映射为System.Int32类型。[编译器]直接支持的类型。sbyte / byte / ...

2020-02-29 01:32:00 317

原创 Odin Inspector 系列教程 --- Odin Static Inspector 使用

Odin Static Inspector,一个快速搜索并允许调用相应的静态成员的便捷工具,提高测试效率。使用起来非常方便,只需要打开Tools/Odin Inspector/Static Inspector即可打开对应的操作面板快速搜索需要调试的静态类可以搜索及过滤对应的成员可以配合Odin特性进行相关函数等功能...

2020-02-22 23:58:59 2140 2

DoTween+Pro+0.9.550

最新版DotweenPro版插件

2017-07-07

mecanimEvent

unity 动画事件编辑器

2017-07-06

dotween0.92pro.unitypackage

dotween0.92PRo.unitypackage最新版

2017-07-06

Easy Touch 5 Touchscreen Virtual Controls 5.0.12

Easy Touch 5 Touchscreen Virtual Controls 5.0.12 最新版本

2017-07-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除