第一期 编程我建议你定好概念

为什么要注意概念

编程本身是一个思维活动过程,思维的清晰程度体现在每个编程中创建或主观确定的概念上,思路清晰要求我们确立的概念是清楚明了的。每一个概念都是必须清楚而明确的,如果没有明确的概念,就无法让代码产生真正的力量。知识的作用在于其清楚明白,而不在于其“熵增”。在不断的概念定义后,软件便慢慢的集中了庞大的知识体系,这个知识体系慢慢地成为领域语言。这个领域语言的完善程度越高,意味着软件实现越稳定。邻域语言的合理程度越高,意味着软件实现越正确。 这些概念的作用体现在哪里呢?首先,顶层概念决定了编码的方式。例如,在使用 MVC 模式时,编码的方式就变成了先写一下 V,再写一下 C,最后再写一下M。实际上MVC实质上与分层区别不了多少,分层会引入相应的层次概念。例如,View 层的概念:视图,负责页面展示与数据输入。Controller 层:控制器层,负责数据处理与数据流转。Model:模型层,保存数据,提供数据。其次,中层概念决定了业务编码。例如,对于消息业务,我们大可能使用发布订阅模式,这样我们会引入主题,订阅者,消息这三个概念。再次,底层概念决定了数据流转。例如,如果你有使用消息队列,你可能会把消息队列作为一个桥梁,用以与其它应用程序进行通信、协作,这样相比与其它进程通信如管道,共享内存而言更加灵活。在软件世界,概念无处不在。

如何确立一个概念

通常我们会在编程中直接引入概念,例如:我们定义这个类完成文件操作。那么,什么是“文件操作”?可能的一种情况是我们在进行 Java IO 流的操作,从而定义了文件操作是指Java 中 IO流的操作。由此我们得到一个定义概念的一种形式:<什么概念>是指<什么地方>的<什么处理>。这个形式界定了概念的名称,概念有效的范围,概念的作用,这样可以让这个概念明确起来。那这时概念确立了吗?是的,这样一个简单的概念就确立起来了。另外一个可能的情况就是文件系统的操作,文件系统操作更多地是新建文件,编辑文件,删除文件,移动文件,复制文件等一系列操作。在这样看来,我们所定义的是一个二义性概念,二义性概念以及泛义性概念都是具有一个以上的定义,如果没有找好定义就会产生不一样的理解,让人对代码晦涩难懂。那我们如何确立一个概念呢?单义概念?还是多义概念?答案是:视情况而定。对于需要高稳定性的应用,它需要概念都清楚明确,没有二义性。这样该软件缺陷数量便会相应地少,每个处理都有着自身实际定义。对于高扩展的应用,它需要包容度高的概念作为基本概念作为入口。例如,在 Tomcat 的架构中,Tomcat 由Server到Acceptor层层递进的定义使得 Tomcat具有稳定的结构和易于配置。在Jetty 的架构中Handler 的核心概念让 Jetty 便于扩展形成链式扩展。

应用与遵循概念

       应用概念通常在确立时并已经正式要用上了。在编程中,概念的应用通常是一个类的定义或者方法的定义。例如对于一个文件IO操作的定义中,我们可能定义一个 FileIOOperation 类,这个类中我们定义一个 byte[] readFileTypeBytes() 方法用于读取文件前三、四个字节(通常文件会使用头四个字节作为文件类型的标识位)。接着可能是 String readContent() 方法,用于读取文件内容。这样我们就得到了一个自然而然的概念及相应类实现。遵循概念要求你时刻保证概念定义一致,如果我们在上述的文件IO操作类 FileIOOperation中定义一个 boolean move(File dir) 方法时,我们对文件IO操作的定义变得宽泛。那如果我们确实要对概念继续宽泛处理呢?通常是把概念变得更加包容。在上述的文件IO操作概念中,如果把IO去掉那么就成为文件操作这样一个包容性较好的概念,这样就能够和原有的概念相容,但这样会引入二义性概念,也不利于符合编程中“高内聚,低耦合”。现在,我想你已经知道泛化是什么意思了,泛化其实是概念逐渐变得多义的过程。

客观概念与主观概念

       在编写程序时,我们可以有自己的对程序的定义。这些定义在某种程度上说可以分为两种,一种是客观概念,另一种是主观概念。对于主观概念,我们可以进一步分为主体主观,和客体主观。主观概念在程序中会导致程序表现的语义并不能贴切现实的业务。通常在沟通时能够体会到这一点,往往就是你说A,用户却会说成B。那这时候我们会说,不如我们使用客体主观概念,这时对于用户来说是贴切的,却导致程序缺乏一定的抽象定义。这对程序编写会出现冗余的情况。例如,没有必要的数据保存,一些需求方会要求你对每一个过程的数据进行独立分开进行运算。对于客观概念,只要符合业务环境,往往能够开箱即用,例如在前面介绍到的MVC 模式作为一种一种客观概念,已经普遍地使用。客观概念往往简单,并且能够相容比较多的概念,这也突出了客观概念在编程中的重要作用。

实际示例

       在我一次外包中,急于需求方的修改意见,我原先考虑增加一个概念,在那时,我加入周期组概念来把几个不同周期的工作合在一起以方便汇总。在编码中,我逐渐把周期组的概念抽象成了工作会话概念,用于记录他们的业务处理过程。做了一天半发现我可以直接引入一个更加简单的统计范围,这样我只需要做简单的界面更新和后端接口更改便可完成需求方功能。结果,只花了一个晚上便完成了原定的功能。可见概念在泛化时带来的概念包容的力量是多么强大。

总结

       总地来说,本篇文章强调了以下几点:
  1. 概念在编程中大致分为顶层概念、中层概念和底层概念,可以说软件设计,概念无处不在。设计概念对于程序设计及其重要,没有概念将没有正确的程序。
  2. 如果确立单义性概念,那么这个概念将会稳定,在编码中也将始终不变。如果确立泛义性概念,那个这个概念将会变得灵活,但也会给编码带来风险。
  3. 视情况决定需要确立单义性的概念还是泛义性概念,这样会给程序带来合理的扩展,也带来了一定不稳定,平衡这两者的之间的矛盾,以指导自己进行开发。
  4. 概念从客观上分为主观概念,客观概念。客观概念构成应用程序是我们追求的目标。
概念是我们用以编写程序中必不可少的自然语言词汇。这些词汇表达了我们对实际业务的理解。一个良好的概念会给程序带来确定性和准确性。