美文网首页
如何组织优雅的代码结构:流程、步骤与函数封装

如何组织优雅的代码结构:流程、步骤与函数封装

作者: 凌霄光 | 来源:发表于2018-12-12 14:15 被阅读94次

经常能看到一个方法需要滚动多屏,从开始一直写到结束完全没有封装的代码。不只新手会这样写,一些工作多年的人写业务代码也是这样。他们只在乎能否实现功能,完全不去考虑代码的结构是否优雅,是否容易维护和扩展。

流程、步骤与代码结构

业务代码主要是要梳理清楚流程、清楚每一步都做什么,然后把这些步骤串起来就是完整的代码,之后的扩展也是在这个流程的某一步上扩展。

但很多代码并不能清晰的表达出有哪些主要步骤,或者仅仅靠注释来标明。导致要维护之前的代码需要花很长时间通读之前全部代码才能知道如何扩展。这样的代码结构是不优雅的。理想中的代码结构是应该能清晰反映业务流程的。

代码如何拆分和封装

一个项目应该合理的划分目录,每个目录下合理的划分文件,每个文件有若干类和函数,每个类合理的划分方法,每个方法合理的划分步骤,把一些步骤封装成单独的方法。

每个步骤的方法可能是同步的也可能是异步的,如果是同步的,只需要顺序调用和返回就可以了,如果是异步的,需要使用回调函数、promise等方式,当然也可以借助async和await实现类似同步代码的写法。

每一个功能的实现都需要组合多个步骤的方法,然后每一个大的步骤的实现又可以拆分成一些小的步骤,他们的关系如下图所示,通过合理的拆分和封装,再复杂的逻辑也不会特别混乱。

当然,页面拆分成多个组件、功能拆分成多个项目、项目拆分多个目录都是这样的,通过封装,实现代码的层次化,使得代码的组织结构能清晰的反映逻辑结构。

一个具体的栗子

举个栗子:

需要在点击Tab的时候去执行动画,动画的执行需要先获取tab的left和width,然后生成动画数据和setData,于是我进行了这样的拆分。

handleTabItemTap是处理tab点击的handler,tab切换需要执行一个动画,于是封装了executeAnimation这个方法,然后动画执行又分为获取尺寸、生成动画数据、setData这几步,于是我相应的封装了getLeftAndWidth、generateAnimationData这两个具体步骤的方法。然后在executeAnimation组合实现具体步骤的方法,实现整个功能。逻辑流程从executeAnimation里能很清晰的看出来。

代码如下:

  handleTabItemTap(event) {//处理Tab的tap事件
      const activeIndex = event.target.dataset.index
      const id = event.target.dataset.id

      if(activeIndex === this.data.activeIndex) return

      this.setData({
        activeIndex
      })

      this.triggerEvent('activeIndexChange', id)

      this.executeAnimcation(activeIndex)
    },
    executeAnimcation(activeIndex) {//执行动画
      this.getLeftAndWidth(activeIndex).then(dimension => {
        const indicatorAnamationData = this.generateAnimationData(dimension.left, dimension.width, dimension.firstTabLeft)
        this.setData({
          indicatorAnamationData
        })
      })
    },
    getLeftAndWidth(activeIndex) {//获取Tab的left和width
      return new Promise(resolve => {
        if(this.tabsWidth.length) {
          const currentTabWidth = this.tabsWidth[activeIndex]
          const currentTabLeft = this.tabsLeft[activeIndex]
          resolve({
            width: currentTabWidth,
            left: currentTabLeft,
            firstTabLeft: this.tabsLeft[0]
          })
        }else{
          getRect(this, '.tabs__nav', true).then(res => {
            this.tabsWidth = res.map(item => item.width)
            this.tabsLeft = res.map(item => item.left)
            resolve({
              width: this.tabsWidth[activeIndex],
              left: this.tabsLeft[activeIndex],
              firstTabLeft: this.tabsLeft[0]
            })
          })
        }
      })
    },
    generateAnimationData(left, width, preLeft = 0) {//生成动画相关的数据
      const animation = wx.createAnimation({
        duration: 200,
        timingFunction: 'ease',
      })
      const animationDatas = [
        {
          width: width,
          left: left - preLeft
        }
      ]
      animationDatas.forEach(item => {
        const width = item.width
        const left = item.left
        animation.translateX(left).width(width).step()
      })
      return animation.export()
    }
  }

在需要扩展的时候,只需要找到某一个步骤的某个方法,进行修改就可以了,并不需要读完全部的代码。

其实这就和我之前写的如何写出自我解释性很强的代码一样,通过合理的划分层次和封装、通过合理的命名。使得代码结构就能清晰反映逻辑结构,并不需要靠注释。

总结

理想情况下,代码的组织结构是能清晰反映逻辑结构的,通过合理的拆分和封装、通过合理的命名,使得代码层次特别清晰,扩展的时候不需要读完全部的代码,只需要找到对应的步骤进行修改就可以了。

每一个步骤可能是同步的也可能是异步的,对于异步的代码,可以使用promise进行封装,甚至可以结合async和await来实现同步的写法来书写异步代码。但不管同步还是异步,步骤之间的关系,整个流程的结构都应该通过拆分和封装来使之清晰明了。

相关文章

  • 如何组织优雅的代码结构:流程、步骤与函数封装

    经常能看到一个方法需要滚动多屏,从开始一直写到结束完全没有封装的代码。不只新手会这样写,一些工作多年的人写业务代码...

  • 2018-08-22 Package, module, f

    好的代码:高性能、封装性(可复用)、抽象、直白、美 python项目的组织结构: 包 —— 模块 —— 类(函数、...

  • Python函数定义

    函数,就是把 具有独立功能的代码块组织为一个小模块,在需要的时候调用 函数使用包括两个步骤:定义函数:封装独立功能...

  • 代码组织:函数(def)

    代码组织:函数(def) 封装一个功能 封装 容器是对数据的封装函数是对语句的封装类是对方法和属性的封装 函数(f...

  • 测试开发笔记一(测试流程与理论)

    01 | 软件开发流程与项目管理 软件开发步骤 需求分析 概要设计:描述系统的处理流程、组织结构、模块划分、功能分...

  • Spring源码阅读

    1.spring 核心代码 1.1 核心流程初始化过程 非常清晰的模板方法,每一个步骤封装成一个具体的函数进行代理...

  • Function

    5.16 初识Function 函数 封装一项任务的步骤清单的代码段,再起一个任务名函数是一个引用类型的对象如何声...

  • 数据结构-持续更新

    数据结构与算法 1.Stack 封装的代码: 2.Queue 封装的代码: 3.LinkedList 封装的代码:...

  • Python全栈之路系列之函数

    函数 函数是Python为了代码最大程度的重用和最小化代码冗余而提供的最基本的程序结构。 函数式:将某功能代码封装...

  • 实现一个 jQuery 的 API

    按照课程内容,补全下面的代码 实现步骤 封装一个函数 再封装一个函数 实现这两个函数 第一个函数addClass(...

网友评论

      本文标题:如何组织优雅的代码结构:流程、步骤与函数封装

      本文链接:https://www.haomeiwen.com/subject/hcluhqtx.html