专门用来总结一些经验和想法,不一定正确

利用反射和泛型快速创造一个对象

这里可以看到一个Single类的写法

那么当我们需要让另外一个类成为单例时候就可以很简单的继承它即可

    public class Director : Single<Director>

这个写法只是适合部分场景,对于对于常用的Helper类,其实直接用static类就可以了。

通过多重继承来继承多个类

一般来说单个类都是无法一次性继承多个类的,但是我们可以让这类之间行成父子关系。这样最终的儿子类是可以拥有所有先辈的公共成员的。

我们创建了一个抽象类继承了Single,则它拥有了单例的特性

    public abstract class SheetObj<T, V> : Single<T> 
        where T: class where V : ExtendObj

然后又创建了三个子类继承了SheetObj

    public class EnumBook : SheetObj<EnumBook, Enum>
    public class RangeBook : SheetObj<RangeBook, Range>
    public class EnumBook : SheetObj<EnumBook, Enum>

那么我们在使用这些子类时候就可以这么用:

// Single类的初始化方法
    RangeBook.Initialize();
    EnumBook.Initialize();
    TreeBook.Initialize();
// SheetObj的加载数据方法
    RangeBook.Instance.Load(MasterDataFilePath);
    EnumBook.Instance.Load(MasterDataFilePath);
    TreeBook.Instance.Load(MasterDataFilePath);

实际上使用时候还可以考虑抽象函数,虚函数或者协议接口之类来满足自己的需求。

抽取共同的成员到基类

比如类A,B,C都有一个成员变量为ID,那么就可以先做一个基类,其余的类可以通过继承方式获取到这个成员变量。当然,这个思路可以扩展开来,会让类的结构有些复杂。但是能节省很多重复劳动工作。
不过有些项目不在乎这些重复,希望简单直白的类来节约debug时间。所以真正如何使用还是需要权衡。

不过现在很多代码插件都有一键生成各种set, get方法。甚至还有比较邪门的lombook这类东西。底层似乎是用了动态类的机制。在这里就不展开了。

覆盖object的ToString()方法

在基类中重写ToString()方法,这样可以在Debug问题时候十分方便的查看对象的具体数据。

善用Builder模式

经常写代码时候会碰到要创建一个对象块,由于成员变量过多,会导致代码块十分臃肿。这个时候可以用Builder模式来改造类。

上图这个列子中p1和p2就是很好解释了前面的观点。
p2是一种普通的生成类的方式,十分简单直白,但不好的是业务逻辑和生命混杂在一起十分乱。p1比较起来就会显得简单很多。

通常的思路是创建一个Builder类专门负责生成目标对象。这么做的好处主要是如下考虑
1. 在生成对象的地方代码会十分简洁,配合链式声明,整个代码的可读性也会很好。
2. 解耦了对象生成和具体的业务逻辑,对调用者保持透明性。

不过正如第二点说明那样,业务逻辑被挪到了Builder里面去做了,这并不会少写不少代码。不过就我个人来说,目前还是比较值的。

Builder继续优化

通过观察发现这些设置成员变量的方法似乎都是差不多模式:通过一个key算出一个值,然后赋予成员便令,最后返回Builder本身。这样我们可以使用delegate模式,把这个部分的逻辑通过方法参数传入进来。

这样我们的Builder就会变得十分轻量了,前面所有的赋值操作以及返回都变作了一个delegate函数:

这样我们使用Builder生成对象也有相应变化:

如上图所示,我们发现p3和p1比较起来似乎更加复杂了,也不如p2直观。 其实这一来一去,我们从p2模式到p1主要是为了解决代码块比较笨重的问题,扩展性也差。但是新的问题是业务逻辑被隐藏到了Builder里面。其实仔细想想,对于Builder来说它并不需要关心你业务逻辑是怎样的,它唯一要做的就是把某个业务逻辑(规则)产生的结果赋予给相应的值就好了。基于这个考虑,我们也要把业务逻辑解耦开来。所以通过delegate这种方式,很好地做到了这点。整个builder赋值时候做地也是最存粹地操作而已!

p3的做法把这也业务规则包装成方法后,可以写一个专门地处理业务逻辑类,它负责封装各种业务算法然后输出而已。同样也保持了简单高效的模式。