文档章节

#legoo内核# -- 准则二 :让每一个程序只做好一件事

边缘行者
 边缘行者
发布于 2014/01/04 10:40
字数 2077
阅读 92
收藏 2

        最近回去老家购置一套衣柜,不得不去家具市场逛了一圈,发现现在的木工真的是舒服很多,各种辅助的工具,高效精准的完成一堆木板的组装,一个完美的衣橱很快出炉,那些木工师傅的工具很多,但每个工具都有其固定的工作,例如 喷钉枪,代替手工锤子,它只能用来钉入钉子,但是效率极其高。社会的发展。导致分工精细,分工精细导致工具功能的单一而高效,这就是社会的一种进步轨迹,这种轨迹映射到软件设计方面也是一样的,这种一种方法论的东东,没有什么具体的模式可参考,作为一名合格优秀的软件架构师,所要做的就是把一个看似完成复杂的功能进行有效有度的分解,让分解后的每一段程序只做单一的功能或者任务,对Java开发而言,一个Java类只完成一个单一的功能。如果是这样子的设计的话,每一段程序被Load 到内存,让后快速执行,执行完毕后退出内存,VM执行垃圾回收,load 下一个程序进行执行,这个听起来很不错吧,但是坚持用这样的一种模式来设计架构却是很难,因为,每一段程序是相互独立的,他们之间不存在依赖关系,任何一个段程序都独立的功能,亦可以独立运行。这就是他的一个设计标准,这种设计标准带来的一个问题,一直困扰着我,那就是由于片段的独立性与功能唯一性,这样会造成大量的程序碎片,对于Java程序而言,会产生大量的精悍短小的Java 文件,而且这种模式,对于debug调试 也是一个困难,按照常规设计,一个业务功能往往被封装到一个方法中,或者在方法中嵌套其他class 的方法,如果可以的话,可以单独调试到程序执行完毕,但是 利弊都是同时出现的,至少我现在认为 这种设计模式下的带来的好处 远远 大于他的不足,至少尚在可承受的范围内。

      软件架构师经常会不由自主的成为 功能控 ,这也是我几年前设计软件的一贯做法,举一个比较通俗的场景吧:一开始,我也许只想编写一个简单的函数去完成某一个功能,可是随后我的创新以及复用的天性会让我变的违背初衷,促使我在原有的函数中增加一个新的功能分支(兼容原先功能),这样原先一个简单的功能开始变得不再单一,一次两次 慢慢的程序就变成了 山西特有的 大杂烩,一锅炖了。这样就会提出一个新的问题,大家如何避免类似的问题发生呢?我并不是反对这种做法,但是在变成大杂烩之前,可以通过如下几个维度来权衡:
     1、这个程序是出于什么层次,界面层、服务层还是别的什么,用户的操作是否可以直接影响到这些功能的入参?
     2、这个程序复用的频率是否很高,而加入新的功能却使用率很低,如果这样则不建议耦合代码。
     3、有没有其他程序可以执行你想要的类似功能,或者是通过几个功能的叠加可以完成你想要的功能,如果可以,则尽量不要利用代码的模式进行耦合。
    就我目前而言,我针对XML操作,写了很多独立的片段,这些单一的功能片段,如下,其中每一个都是独立的Java类,大概列举如下常见的一些:
  1、CovertStr2XmlFilter。java :把给定的一个字符串转换为一个XML Document对象,如果失败 则抛出异常
  2、
CovertXml2StrFilter。java:与第一个相反的功能,不过增加一个选项,是否对转换的字符进行格式化
  3、CoverMap2XmlFilter。java :把一个hashMap转换为Xml文档 ,前提是Map为单层
  4、
CoverXml2MapFilter。java:把一个单层的XMl转换为Map<String,String>
  5、
CoverLoopXml2ListFilter。java  :把一个有固定循环规律的XML转为话List<Map<String,String>> 需要配置指明Xml的循环标识字段
  .............
   注入这样的设计,也许很多人用一个类的N个方法就可以实现,之所以这样设计的原因就是,让这些类作为 程序流程的一个节点加以复用,让每个程序成为过滤器,如果作为方法,则会产生较大的耦合,慢慢的你想项目就会变成了 大杂烩中的大杂烩,增加了class 之间的依赖关系,同时也增加了代码调用的深度,JVm运行会增加很多额外的内存开销。

     这种设计理念,可以推而广之,通过对程序功能的切割与设计,更加容易交付于初级程序员开发,因为每个初级程序员开发的功能很单一,他甚至不需要知道整个业务流程的情况下完成开发,因为功能单一嘛,哈哈~~~~ 这是一种比较理想的境界,但是如果实在大规模的外包模式下,多人协作时,这种模式就会显的比较适用,因为业务的装配是基于某个既定的契约,而这种契约可以对开发人员透明,有点SOA的思想模式吧。
   
       这样做程序架构设计,可以让每个开发人员集中精力完成一个独立单一的任务,首先他不会产生额外的大杂烩思想。如果你的架构设计无法让程序员只做好一件事,那么你很有可能并不理解自己正在试图解决的问题或者架构,看看现实社会中的那些精良的工具吧,这样的设计是符合事物发展的普遍规律。
    
      特别是spring框架的出现,让这种模式显的更加的灵活,很多项目都在不断的上演代码走读,代码检查的这种模式,靠机器或者人为干预去降低代码风险,在我看来这些都是 治标不治本,这种问题的根源出现在整个架构上,架构从根源决定了你的代码的不稳定性与不确定性,所以 如果你的公司还在通过review代码的模式来降低软件代码风险,这时需要考虑是否要从软件机构层来屏蔽这种风险。
   
     让每一个java类只做一件事,这是作为java开发的转义,每个java类不存在依赖关系,他们是并行的,任何一个类脱离另外一个都可以独立运行,他们独立可以完成一个独立的功能。

     周六的早晨 , 一个人可以安静的去梳理我自己的一些技术沉淀。首先是为了自己的技术梳理。写作的同时 也可以让我进一步体会这种设计思想的利弊。

     11点了,出去买菜~~~~~ DIY午饭  山西蔬菜大乱炖~~~~~~ 
   // end

© 著作权归作者所有

共有 人打赏支持
边缘行者
粉丝 73
博文 64
码字总数 117839
作品 0
广州
技术主管
#legoo内核# (1)设计准则

编程N年,积累下来的一些方法论,映射到目前自己维护 Legoo内核,需要自己给自己一个归纳与抽象,在正式介绍设计架构之前,我先从更为抽象的角度来看待他,他的设计坚持了什么原则,这些原则...

边缘行者
2013/12/22
0
0
web前端进阶之js设计模式之设计原则篇

何为设计? 按照一种思路或者标准来实现功能 功能相同,可以有不同设计方案来实现 伴随着需求增加,设计的作用才能体现出来 设计准则(根据UNIX/LINUX设计哲学整理而得) 1、小即是美(一个功...

jia林
07/31
0
0
#legoo内核# -- 准则一 :小即是美

从目前社会的发展可知,随着社会的不断进度,分工也愈来愈精细,这种来自社会发展的规则也同样适用于软件架构设计。SOA其实就是在模拟社会的一种分工精细框架的投影,业务成熟度越高,SOA体现...

边缘行者
2014/01/02
0
0
一个 commit 的自我修养与提高

commit 里的代码只做一件事 每一个 commit 都应该原子化。只做了一点“微小”的工作。不应该出现一个 commit 里做了很多不相关的任务。一个 commit 里改动的文件都和一件事关联,这样未来无论...

没故事的卓同学
05/20
0
0
我闻到了linux新内核的坏味道

最近翻出了linux2.6.27的邮件列表,发现大牛们在讨论一个问题,就是说该如何扩展系统调用,是对每个需要扩展的系统调用都封装一个新的系统调用,还是添加仅仅一个系统调用来封装所有的需要扩...

晨曦之光
2012/04/10
78
0

没有更多内容

加载失败,请刷新页面

加载更多

6. Python3源码—List对象

6.1. List对象 List对象是“变长对象”。 6.1.1. Python中的创建 Python中List对象最重要的创建方法为PyList_New,如下Python语句最终会调用到PyList_New: test = [1, 2, 3, 4, 5] 6.1.2. ...

Mr_zebra
7分钟前
0
0
nginx屏蔽指定接口(URL)

Step1:需求 web平台上线后,需要屏蔽某个服务接口,但又不想重新上线,可以采用nginx屏蔽指定平台接口的办法 Step2:具体操作 location /dist/views/landing/UNIQUE_BEACON_URL { re...

Linux_Anna
14分钟前
0
0
tomcat高并发配置调优

作者:Joker-pan 原文:https://blog.csdn.net/u011622226/article/details/72510385?utm_source=copy --------------------- tomcat 解压就使用的,配置都没动过,肯定不能支持高并发了; ...

imbiao
33分钟前
0
0
mysql 联结,级联查询总结区分

其实我对 数据库的级联或者联结查询一直都是会用,项目能查询出来自己想要的结果即可。 毕竟SQL使用复杂的查询毕竟比较少,而且不难使用。 至于区分他们,我还真的有点模糊。 在看 《SQL必知...

之渊
49分钟前
1
0
区块链入门教程分享区块链POW证明代码实现demo

兄弟连区块链入门教程分享区块链POW证明代码实现demo 这里强调一下区块链的协议分层 应用层 合约层 激励机制 共识层 网络层 数据层 上 一篇主要实现了区块链的 数据层,数据层主...

兄弟连区块链入门教程
57分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部