当前位置: 首页 > news >正文

蓝天使网站建设推广章贡区建设局网站

蓝天使网站建设推广,章贡区建设局网站,国外优秀网站,成都网站改版公司设计模式专栏#xff1a;http://t.csdnimg.cn/3a25S 目录 1.引言 2.代码并非行数越少越简单 3.代码复杂不一定违反 KISS 原则 4.如何写出满足 KISS 原则的代码 5.YAGNI原则和 KISS 原则的区别 1.引言 KISS原则的英文描述有3种版本:Keep It Simple and Supid、 keep It Sh… 设计模式专栏http://t.csdnimg.cn/3a25S 目录 1.引言 2.代码并非行数越少越简单 3.代码复杂不一定违反 KISS 原则 4.如何写出满足 KISS 原则的代码 5.YAGNI原则和 KISS 原则的区别 1.引言 KISS原则的英文描述有3种版本:Keep It Simple and Supid、 keep It Short and Simple、Keep It Simple and Straightforward。其实它们要表达的意思差不多即“尽量保持简单”。 KISS原则是一个“万金油”一样的设计原则可以应用在诸多场合。它不仅经常用来指导软件开发还经常用来指导系统设计、产品设计等如冰箱、建筑和手机的设计等本书讲解的是代码设计因此接下来我们重点讲解如何在程序开发中应用KISS 原则。 我们知道代码的可读性和可维护性是衡量代码质量的两个重要标准。而KISS原则就是保持代码可读和可维护的重要手段。代码足够简单也就意味着容易读懂bug比较难影藏即便出现 bug修复也比较简单。 不过KISS原则只是告诉我们要保持代码“简单”但并没有讲什么样的代码才算得上“简单”更没有给出明确的方法来指导如何开发“简单”的代码。因此KISS 原则虽然简单但不太容易落地。 2.代码并非行数越少越简单 在下面的示例代码中我们使用3种方式实现同一功能:检查输入的字符串ipAddress是否是合法的P地址。一个合法的P地址由4个数字组成并且通过“.”进行分隔。每个数字的取值范围是 0~255(第一个数字比较特殊不允许为0)。对比下面3段代码读者认为哪一段代码符合KISS 原则呢? //第一种实现方式:使用正则表达式 public boolean isValidIpAddressVl(String ipAddress) {if(StringUtils.isBlank(ipAddress)){return false;}String regex ^(1\\d{2)|2[0-4]\\d125[0-5]|[1-9]\\dl[1-9])\\.(1\\d(2}12[0-4]\\d|25[0-5]|[1-9]\\dl\\d)\\.(1\\d{2)12[0-4]\\d125[0-5]1[1-9]\\dl\\d)\\.(1\\d{2)12[0-4]\\d125[0-5]1[1-9]\\dl\\d)$;return ipAddress.matches(regex); }//第二种实现方式:使用现成的工具类 Public boolean isValidIpAddressV2(String ipAddress) { if (Stringutils.isBlank(ipAddress))return false;String[] ipUtits StringUtils.split(ipAddress,.);if(ipUnits.length!4){return false;}for(int i0;i4;i){int ipUnitIntValue;try{ ipUnitIntValue Integer.parseInt(ipUnits[i]);catch(NumberFormatException e){return false;}it (ipUnitIntValue 0 || ipUnitIntValue 255){return false;}if(i 0 ipUnitIntValue 0){return false;}}return false; }//第三种实现方式:不使用任何工具类 public boolean isValidIpAddressV3(String ipAddress) {char[] ipChars ipAddress.toCharArray();int length ipChars.length;int ipUnitIntValue -l;boolean isFirstUnit true;int unitsCount0;for(int i0;ilength;i){char c ipChars[i];if(c){if(ipUnitIntValue 0 || ipUnitIntValue 255) return false; if(isFirstUnit ipUnitIntValue 0)return false;if(isFirstUnit )isFirstUnit false;ipUnitIntValue-l;unitsCount;continue;}if (c 0 || c 9){return false;if(ipUnitIntValue-1)ipUnitIntValue 0;ipUnitIntValueipUnitIntValue*10(c-0);}if (ipUnitIntValue0 ipUnitIntValue 255)return false;if(unitsCount !3)return false;return true; }第一种实现方式利用正则表达式3行代码就解决了问题。第一种实现方式的代码行数最少那么是否符合KISS原则呢?答案是否定的。虽然第一种实现方式的代码行数最少看似简单但使用了比较复杂的正则表达式而想要写出完全没有bug的正则表达式是很有挑战性的。对于不熟悉正则表达式的人看懂并维护含有正则表达式的代码是比较困难的。基于正则表达式的实现方式导致代码的可读性和可维护性变差因此从KISS原则的设计初衷(提代码的可读性和可维护性)来看这种实现方式并不符合 KISS原则。 第二种实现方式使用StringUtils类和 Integer 类提供的一些现成的工具函数来处理IP地址字符串。第三种实现方式不使用任何工具函数而是通过逐一处理IP地址中的字符来判断是否合法。从代码行数上来说第二种实现方式和第三种实现方式的代码行数差不多。但第三种实现方式比第二种实现方式更有难度更容易产生bug。从可读性来说第二种实现式的代码逻辑更清晰、更好理解。相比来说第二种实现方式更“简单”符合KISS 原则。 虽然第三种实现方式稍微复杂但其性能要比第二种实现方式高一些。从性能的角度说,选择第三种实现方式是不是更好呢?在回答这个问题之前我们先解释一下为什么第三种实现方式的性能更高一些。一般来说工具类的功能是通用和全面的因此在代码实现面、需要兼容和处理更多的情况、执行效率就会受到影响。而第三种实现方式完全是自己操作底层字符只针对IP地址这一种输入格式没有其他不必要的处理逻辑因此在执行率方面这种类似定制化的处理代码肯定比通用的工具类高。 尽管第三种实现方式的性能更高但我们还是倾向于选择第二种实现方式因为第三种实现方式上实际是过度优化。除非isValidIpAddress函数是影响系统性能的瓶颈代码否则这样优化的投入产出比并不高反而增加了代码实现的难度、牺牲了代码的可读性而性能上的提升并不明显。 3.代码复杂不一定违反 KISS 原则 上文我们提到代码并非行数越少越简单因为还要考虑逻辑复杂度、实现难度和代码的可读性等。如果一段代码的逻辑复杂、实现难度大、可读性也不太好是不是一定违反KISS原则呢?在回答这个问题之前我们先来看下面这段代码(来自《数据结5之美》中 KMP 算法的代码实现)。 //P算法:a、b分别是主串和模式串,n、m分别是主串和模式串的长度 public static int kmp(char[]a, int n, char[]b, int m){int[] next getNexts(bm);int j 0;for(int i0;in; i){while(j0 a[i] ! b[j]){jnext[j-1] 1;}if(a[i] b[j]){j;}if(jm){return i-m l;}}return -l; } private static int[] getNexts(char[]b, int m){int[] next new int[m];next[0]-1;int k-1;for(int i1;im; i){while(k!-1 b[k 1]!b[i]){k next[k];}if (b[k 1] b[i]){k;}next[i] k;}return next; } 上面这段代码逻辑复杂、实现难度大和可读性差但它并不违反KIS原则KMP算法以高效著称当需要处理长文本字符串匹配问题(如几百MB大小的文本内容的匹配)或者字符串匹配是某个产品的核心功能(如Vim、Word等文本编辑中的文本查找)抑或字符串匹配算法是系统性能瓶颈时我们就应该选择KMP算法。而KMP算法本身具有逻辑复杂、实现难度大和可读性差特点因此使用复杂的算法解决复杂的问题并不违反KISS原则。 不过平时的项目开发涉及的字符串匹配问题大多针对较小的文本在这种情况下直接调用编程语言提高的现成的字符串匹配函数即可。如果是KMP算法实现较小文本的字符串匹配就违反KISS原则了。也就是说对于同一段代码在某个应用场景下满足KISS原则换一个应用场景后可能就不满足 KISS 原则了。 4.如何写出满足 KISS 原则的代码 关于如何写出满足 KISS 原则的代码前面已经讲了一些方法这里总结一下。 1)慎重使用过于复杂的技术来实现代码如复杂的正则表达式、编程语言中过于高级的语法等。 2)不要“重复造轮子”首先考虑使用已有类库。根据作者的经验如果自己实现类库那么产生 bug 的概率更高维护成本也更高。 3)不要过度优化。尽量避免使用一些“奇技淫巧”(如使用位运算代替算术运算、使用复杂的条件语句代替 if-else 等)来优化代码。 5.YAGNI原则和 KISS 原则的区别 当YAGNI(You Ain’t Gonna Need It)原则用在软件开发时其含义是: 不要去设计当前用不到的功能;不要去编写当前用不到的代码。实际上这条原则的核心思想是:不要过度设计。和 KISS 原则一样YAGNI原则也称得上“万金油”一样的设计原则。 例如某系统暂时只使用 Redis来存储配置信息以后可能会用到ZooKeeper。根据 YAGNI原则在未用到ZooKeeper之前我们没必要提前编写这部分代码。当然这并不是说就不需要考虑代码的扩展性了。我们还是有必要预留扩展点在需要引入ZooKeeper时能够在不改太多代码的情况下完成扩展。 又如不要在项目中提前引入不需要依赖的开发包。Java程序员经常使用Maven或Grade 管理项目依赖的类库我们发现有些程序员为了避免开发中类库的缺失而频繁地修改Maven或 Gradle 配置文件提前向项目里引入大量常用的类库。实际上这种做法违反YAGNI原则。 从刚才的分析可以看出YAGNI原则与KISS原则并非一回事。KISS原则讲的是“如何做(尽量保持简单)而 YAGNI原则讲的是“要不要做”(当前不需要的就不要做)。
http://www.zqtcl.cn/news/864232/

相关文章:

  • 网站界面技术方案wordpress开启子目录多站点模式
  • 汕头网站建设推广价格筑龙网官网首页
  • 河北省建设执业资格注册中心网站东莞微网站建设多少钱
  • 企业网站建设功能模块discover wordpress
  • 网站建设结课做诱导网站
  • 网站开发与设计难嘛青州网站建设推广
  • 网站开发程序员工资谷歌推广网站建设
  • 江门网页建站模板金富通青岛建设工程有限公司网站
  • 网站后台账户如何做会计分录做传奇开服一条龙网站哪个好
  • 天门市网站建设seo平台建设网站公司
  • php网站怎么做302织梦网站有会员系统怎么做
  • 清远建设局网站安阳吧百度贴吧
  • 做什么软件做网站效率最好网站公司建设都招聘那些职位
  • 缙云建设局网站深圳营销型网站设计
  • 企业网站制作价格成都高端网站建设公司哪家好
  • wordpress+做仿站网站建设费用属于业务宣传费吗
  • 昆明企业网站制作wordpress移动端插件menu
  • 长沙网站设计培训学校南宁建设网站哪里好
  • 提高基层治理效能全国seo搜索排名优化公司
  • 如何建设网站简介WordPress集成tipask
  • 青海网站开发公司建筑公司的愿景怎么写
  • 建设银行集团网站首页优化科技
  • dede 汽车网站网站上的彩票走势图是怎么做的
  • 网站内容营销呼市推广网站
  • 南宁网站建设价格医院有关页面设计模板
  • 城乡住房和城乡建设厅网站湖州公司网站建设
  • h5响应式的网站建站空间哪个好
  • 徐州网站建设与推广公众号开发技术风险
  • 男女做差差事的视频网站自己做一个小程序要多少钱
  • 临沂网站建设哪家好重庆建设招标造价信息网站