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

物极必反,滥用闭包的结果就是回归结构化编程

烦透了闭包。目前在修改一个项目,该项目的原始代码中使用了大量的闭包。一个套一个,甚至套了三四层,那函数啊,那局部变量啊,叫一个多啊,那执行流程啊,叫一个乱啊。

下面是个draw函数,730行,把它的结构提取出来,有下面的树:

draw             15变量 
  function0    1变量 
  function1    13变量 
    function11 
    function12 
    function13 
    function14 
      function141 
      function142 
    function15 
      function151 
        function1511 
    function16 
      function161 
    function17 
    function18 
    function19 
    function1A 
  function2 
  function3    8变量 
    function31 
    function32 
  function4    26变量 
    function41 
    function42 
    function43 
    function44 
    function45 
    function46 
    function47 
    function48

如果只看draw作用域,那么draw下的15个变量对于从函数function0-function48来说就是外部变量。而对于function41-function48来说,外部变量就有26+15=31个。

这不就是最古老最邪恶的结构化编程的变种吗!

对这个函数来说,大量使用闭包,存在三个问题:

·阅读难——执行流程上串下跳的;

·调试难——调用栈结构层次就像天书一样;

·重构难——外部变量太多。

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2010/06/04/1751704.html如需转载请自行联系原作者


xiaotie 集异璧实验室(GEBLAB)

相关文章:

  • 2017 年终总结 —— 在路上
  • 加密算法(对称加密)AES、DES (非对称加密)RSA、DSA
  • Hadoop集群(第10期)_MySQL关系数据库
  • python学习笔记(四)字符串及字符串操作
  • 【Dalston】【第六章】API服务网关(Zuul) 下
  • 解决 Nginx + PHP-FPM (Permission denied)报错的办法
  • sqlvarchar后自动填充空格解决办法(SET ANSI_PADDING)
  • 当文本输入框和是否勾选在同一列表时,你懵圈了吗
  • 01月03日三周二次【Python基础进阶】
  • linux下SVN忽略文件/文件夹的方法
  • Docker Registry Server 搭建,配置免费HTTPS证书,及拥有权限认证、TLS 的私有仓库
  • 5 秒创建 k8s 集群 - 每天5分钟玩转 Docker 容器技术(115)
  • 9.2. Buffering and Caching
  • golang 新人入门配置学习
  • 63. 搜索旋转排序数组 II
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Otto开发初探——微服务依赖管理新利器
  • React-生命周期杂记
  • Spring Cloud Feign的两种使用姿势
  • Terraform入门 - 1. 安装Terraform
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 第2章 网络文档
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 记录:CentOS7.2配置LNMP环境记录
  • 目录与文件属性:编写ls
  • 设计模式(12)迭代器模式(讲解+应用)
  • 为什么要用IPython/Jupyter?
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • ​第20课 在Android Native开发中加入新的C++类
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Linux(帮助手册)
  • (1)STL算法之遍历容器
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (剑指Offer)面试题34:丑数
  • (三)mysql_MYSQL(三)
  • (四)Android布局类型(线性布局LinearLayout)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • .Net 高效开发之不可错过的实用工具
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net访问oracle数据库性能问题
  • .net开发引用程序集提示没有强名称的解决办法
  • /*在DataTable中更新、删除数据*/
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [APIO2012] 派遣 dispatching
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [c]扫雷
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [IE9] IE9 RC版下载链接
  • [Linux]文件基础-如何管理文件