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

浮现式设计

设计模式不是一开始就有的,好的软件也不是一开始就设计成现在这样的,好的设计亦是如此。

导致我们重构现有系统的原因有很多,但是多数是因为原来的代码变得越来越不可读,并且重构的风险太大了。在实现业务逻辑的时候,我们快速地用代码实现,没有测试,没有好的设计。

而下图算是最近两年来想要的一个答案:

浮现式设计

浮现式设计是一种敏捷技术,强调在开发过程中不断演进。软件本身就不应该是一开始就设计好的,他需要经历一个演化的过程。

意图导向

就和Growth一样在最开始的时候,我不知道我想要的是怎样的——我只有一个想法以及一些相对应的实践。接着我便动手开始做了,这是我的风格。不得不说这是结果导向编程,也是大部分软件开发采用的方法。

所以在一开始的时候,我们就有了下面的代码:

if (rating) {
  $scope.showSkillMap = true;
  skillFlareChild[skill.text] = [rating];

  $scope.ratings = $scope.ratings + rating;
  if (rating >= 0) {
    $scope.learnedSkills.push({
      skill: skill.text,
      rating: rating
    });
  }
  
  if ($scope.ratings > 250) {
    $scope.isInfinite = true;
  }
}

代码在不经意间充斥着各种Code Smell,如:

  1. Magic Number

  2. 超长的类

  3. 等等

重构

还好我们在一开始的时候写了一些测试,这让我们可以有足够的可能性来重构代码,而使得其不至于变成遗留代码。而这也是我们推崇的一些基本实践:

红 -> 绿 -> 重构

测试是系统不至于腐烂的一个后勤保障,除此我们还需要保持对于Code Smell的嗅觉。如上代码:

  if ($scope.ratings > 250) {
    $scope.isInfinite = true;
  }

上面代码中的“250”指的到底是?这样的数字怎么能保证别人一看代码就知道250到底是什么?

如下的代码就好一些:

  var MAX_SKILL_POINTS = 250;
  if ($scope.ratings > MAX_SKILL_POINTS) {
    $scope.isInfinite = true;
  }

而在最开始的时候我们想不到这样的结果。最初我们的第一直觉都是一样的,然而只要我们保持着对Code Smell的警惕,情况就会发生更多的变化。

重构是区分普通程序员和专业程序员的一个门槛,而这也是练习得来的一个结果。

模式与演进

如果你还懂得一些设计模式,那么想来,软件开发这件事就变得非常简单——我们只需要理解好需求即可。

从一开始就使用模式,要么你是专家,要么你是在自寻苦恼。模式更多的是一些实现的总结,对于多数的实现来说,他们有着诸多的相似之处,他们可以使用相同的模式。

而在需求变化的过程中,一个设计的模式本身也是在不断的改变。如果我们还固执于原有的模式,那么我们就会犯下一个又一个的错误。

在适当的时候改变原有的模式,进行一些演进变显得更有意义一些。如果我们不能在适当的时候引进一些新的技术来,那么旧有的技术就会不断累积。这些技术债就会不断往下叠加,那么这个系统将会接近于崩塌。而我们在一开始所设定的一些业务逻辑,也会随着系统而逝去,这个公司似乎也要到尽头了。

而如果我们可以不断地演进系统——抽象服务、拆分模块等等。业务在技术不断演进地过程中,得以保留下来。

相关文章:

  • Office365管理员操作手册-1
  • 【设计模式】抽象工厂模式
  • oracle——06表查询中需要注意的一些问题
  • 佛山Uber优步司机奖励政策(1月25日~1月31日)
  • 携程一万亿交易额的市场逻辑
  • java27:集合框架
  • 使用 JavaScript 将网站后台的数据变化实时更新到前端-【知乎总结】
  • 随机IP代理
  • html 中几次方,平方米,立方米.
  • OCaml已经做好iOS开发准备
  • spring MVC自定义视图实现jsonp
  • 怎么提高ArcGIS for Desktop10.x的性能
  • python文件相关操作
  • socket.io+angular.js+express.js做个聊天应用(四)
  • BUG系列
  • Angular Elements 及其运作原理
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Java 内存分配及垃圾回收机制初探
  • Linux快速复制或删除大量小文件
  • PAT A1017 优先队列
  • PAT A1050
  • Redis学习笔记 - pipline(流水线、管道)
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SpringCloud集成分布式事务LCN (一)
  • STAR法则
  • Sublime text 3 3103 注册码
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vuex 笔记整理
  • webgl (原生)基础入门指南【一】
  • 反思总结然后整装待发
  • 免费小说阅读小程序
  • 批量截取pdf文件
  • 线性表及其算法(java实现)
  • 学习Vue.js的五个小例子
  • 异常机制详解
  • 怎样选择前端框架
  • kubernetes资源对象--ingress
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C语言)球球大作战
  • (done) 两个矩阵 “相似” 是什么意思?
  • (solr系列:一)使用tomcat部署solr服务
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (学习日记)2024.02.29:UCOSIII第二节
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)Linux下编译安装log4cxx
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • ./和../以及/和~之间的区别
  • .NET 8.0 中有哪些新的变化?
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET框架类在ASP.NET中的使用(2) ——QA