文档章节

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

边缘行者
 边缘行者
发布于 2014/01/04 10:40
字数 2077
阅读 88
收藏 2
点赞 0
评论 0

        最近回去老家购置一套衣柜,不得不去家具市场逛了一圈,发现现在的木工真的是舒服很多,各种辅助的工具,高效精准的完成一堆木板的组装,一个完美的衣橱很快出炉,那些木工师傅的工具很多,但每个工具都有其固定的工作,例如 喷钉枪,代替手工锤子,它只能用来钉入钉子,但是效率极其高。社会的发展。导致分工精细,分工精细导致工具功能的单一而高效,这就是社会的一种进步轨迹,这种轨迹映射到软件设计方面也是一样的,这种一种方法论的东东,没有什么具体的模式可参考,作为一名合格优秀的软件架构师,所要做的就是把一个看似完成复杂的功能进行有效有度的分解,让分解后的每一段程序只做单一的功能或者任务,对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

#legoo内核# -- 准则一 :小即是美

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

边缘行者 ⋅ 2014/01/02 ⋅ 0

一个 commit 的自我修养与提高

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

没故事的卓同学 ⋅ 05/20 ⋅ 0

我闻到了linux新内核的坏味道

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

晨曦之光 ⋅ 2012/04/10 ⋅ 0

【03】CC - 函数

1、函数的第一条规则是要短小,第二条规则是还要更短小 每个函数都一目了然,都只做一件事情,都依序把你带到下一个函数,这就是函数应该达到的短小的程度。 另外,函数的缩进层级不该多于一...

xixicat ⋅ 2014/07/16 ⋅ 0

exec的不同实现--鸠占鹊巢还是功成身退

exec函数可以执行一个进程,是Run-Time Library里面的特性,标准上并没有给出什么硬性规定,因此各个操作系统平台上就可以有五花八门的实现了,本文介绍linux上的实现鸠占鹊巢和windows下的实...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

写好函数的规范小结

《代码整洁之道》第三章的阅读小结。 写好函数:1,短小!20行左右就是上限。 2,只做一件事!这是最重要的一点。要判断函数是否只做了一件事的方法就是看能否再拆出来一个函数。 3,每个函数...

Freewheel ⋅ 2015/11/15 ⋅ 0

Clean Code第三章:函数 --阅读与讨论

图片来源:《Clean Code》 无论是在何种编程语言中,函数都是最常用的语法结构了。 根据需求写出函数不难,但写好一个函数却并不容易。 请看下面的一个函数,盯住它三分钟,看看能不能看懂这...

徐朝_尼克徐 ⋅ 2016/11/26 ⋅ 0

Linux入门之文件基本操作

linux 哲学思想 1、一切皆文件 2、由众多目的单一应用程序组成,一个程序只做一件事,且做好 3、组合目的单一的小程序完成复杂任务 4、尽量避免跟用户交互, 5、使用文本文件保存配置信息:文...

jerry_jing ⋅ 2014/05/04 ⋅ 0

命令行程序设计的准则

英文地址:《Designing command-line interfaces》 正文 虽然已存在大量关于图形用户界面(GUIs)设计的文章,可是介绍命令行界面(CLIs)设计的却很少。本文尝试介绍几个关于CLI设计最重要的...

redraiment ⋅ 2013/12/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

门面模式

1. 门面模式定义理解 是比较常用的封装模式,也称为外观模式; 标准定义:Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface t...

liuyan_lc ⋅ 23分钟前 ⋅ 0

SpringCloud 微服务 (九) Spring Cloud Bus

壹 本篇结合上篇学习使用SpringCloud Bus结合MQ来实现自动刷新 上篇有远端git码云,本地git,config统一配置中心服务,order服务,product服务 过程: 启动服务时,config服务将远端git的配置拉取到...

___大侠 ⋅ 24分钟前 ⋅ 0

别被别人抢走了你的时间!

前两天,有读者在评论区给我留言,问我类似于 618、双十一这样的电商狂欢,我会参与么? 我给他的回复很直接,我很少参与这类活动,尤其是一些整点抢券的行为,更加不会参与,因为我的时间很...

古乙丁三雨 ⋅ 29分钟前 ⋅ 0

nginx开启gzip压缩JS文件失败?

检查下GZIP设置的压缩的文件类型有没有application/x-javascript,在服务器在传送JavaScript文件时使用的MIME类型通常是这个.

hang1989 ⋅ 29分钟前 ⋅ 0

DockOne微信分享(一二九):聊聊Service Mesh:linkerd

【编者的话】随着企业逐渐将传统的单体应用向微服务或云原生应用的转变,虽然微服务或者云原生应用能给企业带来更多的好处,但也会带来一些具有挑战的问题,如怎么管理从单体应用转向微服务所...

xiaomin0322 ⋅ 34分钟前 ⋅ 0

linear regression

今天分享一个很经典的ML算法---LIner regression(线性回归) **线性回归(Linear regression)**是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归...

gfjjfuy112 ⋅ 36分钟前 ⋅ 0

百度地图使用经验-第1集:成功展现第1个地图

第1步:引入js(携带密钥) 第2步: 创建一个div 第3步: 写js 类: js自己的面向对象的特点; ES6 PHP,JAVA,C++ 插曲:事件 22小时前 事件和函数的区别: 函数是事先写好函数体,手工调用。...

宁哥实战课堂 ⋅ 38分钟前 ⋅ 0

sudo java : command not found

运行sudo java报错 $ sudo java$ sudo: java:找不到命令 解决方案: sudo命令后加-E,保留用户运行环境的环境变量。 sudo -E env PATH=$PATH java...

勇敢的飞石 ⋅ 41分钟前 ⋅ 0

ecs修改主机名称

https://help.aliyun.com/knowledge_detail/41305.html

张宏亮1982 ⋅ 42分钟前 ⋅ 0

扩展JS validate

if ($.validator) { //验证手机号码 $.validator.addMethod("phone", function (value, element, params) { return /^(1)[0-9]{10}$/.test(value); }, "请输入有效的......

熊猫你好 ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部