其实我用过的,那一天晚上,看着摇摇欲坠的衣架,还有上次换床时留下的两根木头,突发奇想,用菜刀把木头给锯了,然后把衣架给修好了,用了两个小时。(我的菜刀上有一道锯齿状的东西)
其实很多时候我们都是在用不对的工具做对的事情,最后是搞到很辛苦,很不爽。试问,你有没有用剪刀拧过螺丝?用起子敲过钉子?是不是很辛苦。
小时侯觉得这种事情做起来很有成就感,因为确实,用了跟别人不同的方法去做成别人想去做的事情。但是现在你还在用这些方法吗?
作为一个程序员,我们用的最多的工具,应该是编程语言和方法论了(先不算IDE)。而说起方法论,我想说一下设计模式。院子里也有很多人在写设计模式的文章,也有很多人在用设计模式来完成工作,也包括我。但是一般情况下我不用设计模式,我宁愿让类看起来自然易懂一点。为什么了?因为,很多时候我们用设计模式的时候我们是分不清楚各种各样的设计模式所代表的工具类型的。比如,单例,他主要的作用是要来维持实例的状态的全局性;facase,主要是封装系统内部的实现,像windows的HAL层,让每一个做驱动开发的,直接使用函数就可以了;适配器,主要是为了让两孔的插头可以插进三孔的插孔。
其实这些设计模式他们本身被提取出来的时候所肩负的职责你懂吗?如果不懂,会发生什么事情了?曾经有人说过,单例可以节省内存,首先不说任何问题,如果你真的要节省内存,那么,我建议将所有的函数和属性静态化,我想这是最节省内存的方法了。
说起起子,其实我们可以看到各种各样的起子,但是如果就按适合的类型,来分类,那么大概可以分成,十字和一字,还有就是起子头的大小。于是就有一些很有设计模式头脑的人用了一个模板模式来把起子重构了一把,最后结果就是,一个起子柄可以安装多个标准的起子头,如图:
于是有人发挥想象的空间:为什么不把一个锤子附加在起子的柄上了,这样就可以两用了,一头是起子,一头是锤子(有点像单例既省内存又维护状态)。这个可以有吗?这个真的不可以有。为什么了,因为如果加了一个锤子,你会发现你用起子的时候,手柄不好用,用锤子的时候,你会发现柄太小,震的手疼。
这里就引申到了我个人觉得软件里面最重要的一个东西,职责,responsibility。为什么说这个东西重要,是因为,无论是生活中的工具还是软件开发中的设计模式与类,如果承担的职责过多且职责之间没有想象之处,那么这个东西是有问题的。就好象带锤子的起子,它是起子还是锤子了?一个类之所以不应该承担太多的职责,就是因为会变成带起子的锤子。而一个函数不应该有太多的职责,是因为你把起子铸在类锤子里面,仍希望既能当锤子用又能当起子用。类应该是一个多头的起子,他可以承担多个相同的职责,方法应该是起子中的一个头,命名空间应该是一个工具箱,既有锤子又有起子,可能还有能当菜刀用的锯子(这是扯淡的,当我没说)。
最后,如果你不知道下面的代码有什么问题,那么还是不要用设计模式了,这个时候是手柄是菜刀的起子了。
public class Test
{
private Test()
{
}
private static Test instanse;
private static List<int> status = new List<int>();
public Test Instance
{
get
{
status.Clear();
return instanse;
}
}
}