热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多点使用短函数

还记得刚学编程那时关于“为什么要用函数”的问题吗?那就是把重复的代码归纳到一个函数中多次利用。这点毋庸置疑,大家也用的很熟了,但是除了这个还有什么改进空间吗?答案肯定是有的。大家都知道当一个函数很长的时候,就会造成阅读困难,那以前我们都是怎么解决的呢?

还记得刚学编程那时关于“为什么要用函数”的问题吗?那就是把重复的代码归纳到一个函数中多次利用。这点毋庸置疑,大家也用的很熟了,但是除了这个还有什么改进空间吗?答案肯定是有的。

长函数有什么问题

大家都知道当一个函数很长的时候,就会造成阅读困难,那以前我们都是怎么解决的呢?

  1. 写注释:这个大家都知道怎么用,也是一种有效的方法。
  2. 用 #region 代码块:这个也是一个行之有效的方法。

还有什么别的方法吗?其实还有一个方法就是:使用短函数。在讨论短函数有点之前,我想先用一点篇幅来讲述一下什么时候改写注释。

什么时候该写注释

函数主要就有两个用途:

  1. 在 Class 和 别的函数、字段、属性前打三个 / ,就会自动生成供 VS 使用的智能提示内容。
  2. 解释代码意图。

第一点大家都会用,而且就这么用,没有什么替代的办法。但是关于第二点,注释未必是最好的解决办法。

因为如果一段代码让人看不懂,要么就是“英文看不懂”,要么就是“逻辑复杂”。注释是为了弥补它们带来的缺点,但是为什么不从根本解决呢?

“英文看不懂”:每个程序员都应该有一定的英文基础吧?另外注意命名规范,就可以解决了。

“逻辑复杂”:如果一段程序逻辑复杂,让人看不懂,你觉得你应该费力地去给别人解释呢?还是自己好好整理整理,把代码梳理一下呢?

那怎么梳理你的代码呢?短函数?

短函数的优点——有助于梳理代码

我想废话不多说了,都是程序员,大家一看代码就明白了。代码才是最好的注释,其实写的就是短函数的优点。

顺便提一下 region ,其实 region 在 VS 下的收缩功能可以达到差不多的效果,你可以选用这个,但是不是很推荐。下面,我还要和大家探讨一下另一个优点。

短函数的优点——可优化性能

关于这点,我是在《More Effective C#》中看到的,觉得非常好,所以推荐给大家。

把一个大函数拆分成很多小函数可以优化性能?这点看上去很可笑。是的,其实这点性能的提升微不足道,但是如果可以,为什么不做呢?更何况这样做还有上面说的另一个优点。

为什么长函数分割成短函数的时候可以优化 .Net 下的性能呢?

你首先要明白:.Net 下的语言编译的时候只是编译成了中间语言。运行的时候,它会再一次编译成机器码。这个中间语言编译成机器码是以一个函数为基本代为的。也就是说,每次调用函数的时候,这个函数才会被编译。

那长函数分割成了短函数有优势吗?代码量不还是一样的?纯粹的分割反而会产生更多的代码呢!

的确如此,所以说,这里还有另一个条件:当这个长函数中有很多分支的时候。

public void Func1()
{
    if(xxxx)
    {
        //代码段1,几百行
    }
    else
    {
        //代码段2,几百行
    }
}

上面这段代码,有两大段代码,每次调用这个函数其实只会执行一部分。所以,如果把这两块代码段提取出来,编译的过程中就会少编译一半的代码。

现在明白在什么时候把长函数分割成短函数能优化性能了吧。

虽然这点性能提升并不明显,但是,如果你一个函数中,有一个很大的分支。你在看代码的过程中,一定会看花眼,滚屏的过程中,都不知道自己现在身处在哪个部分。随意就算不考虑性能,也推荐把这样的代码分割成短函数。

本文地址:http://www.nowamagic.net/librarys/veda/detail/1762,欢迎访问原出处。


推荐阅读
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
  • 本文介绍了如何通过扩展 UnityGUI 创建自定义和复合控件,以满足特定的用户界面需求。内容涵盖简单和静态复合控件的实现,并展示了如何创建复杂的 RGB 滑块。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 本文探讨如何在 C# 中将 If 语句中检索到的结果保存到一个变量中,以提高代码的可读性和可维护性。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 本文探讨了在使用Azure Active Directory进行用户身份验证时,结合AddAuthentication和RequireAuthenticatedUser的必要性及其潜在冗余问题。 ... [详细]
  • 本文深入探讨了Python中的高阶函数和Lambda表达式的使用方法,结合实际案例解析其应用场景,帮助开发者更好地理解和运用这些强大的工具。 ... [详细]
author-avatar
mobiledu2502858723
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有