精华内容
下载资源
问答
  • 可读性

    2019-08-29 11:48:21
    如何提高代码的可读性是一个永恒的话题。 通常认为程序员需要具备较高的“数学”功底。毕竟要掌握各类模式和算法都依赖很强的逻辑思维能力。然而在经历了一段职业生涯后,我发现程序员的“语文”能力也同样重要。...

    如何提高代码的可读性是一个永恒的话题。

    通常认为程序员需要具备较高的“数学”功底。毕竟要掌握各类模式和算法都依赖很强的逻辑思维能力。然而在经历了一段职业生涯后,我发现程序员的“语文”能力也同样重要。《重构》一书中就提出:唯有优秀的程序员能够写出人类能理解的代码。软件的规模越来越大,一个系统通常需要几代程序员来开发维护。然而这些程序员们往往都素未谋面,只能“神交”于代码的字里行间。

    提到可读性,往往涉及两个方面,一是读者的理解能力,二是作者的表达能力。比如我个人总认为自己在阅读文字时存在阅读障碍,然而读代码还较有心得。因为我很乐于去揣摩代码作者的意图,特别是在遇到一些很晦涩的代码时。

    在实际工作中也经常听到一些程序员抱怨:这样的代码简直无法维护,还不如推倒重写。如果你也碰到这种情况,我想请你先思考一下,是自己的理解能力问题,还是原作者的表达能力问题,然后再决定下一步动作。同时我也总结了一条心得和大家分享:真正的高手不但要能写得出好代码,还要能驾驭得了烂代码。

    我曾自我剖析造成阅读障碍的原因,主要是阅读量不够。我的确不爱读书!但我确读(调试)过很多开源软件代码。我曾接触的第一个开源软件叫sox,它是一款Linux下的音频处理软件,支持多种音频格式。我花了很长时间去调试,并搞懂了它的框架和算法,并把其中一部分代码用到了我自己开发的软件里。在我后来读了《设计模式》以后才意识到,sox实际上是用C语言实现了一个策略(strategy)模式来支持各种音频格式。

    从“语文”的角度看,代码的文体应该属于“说明文”或“记叙文”,要着眼于把事情说清楚。而并非“诗歌”、“散文”或“小说”,存在着很多“暗喻”和“伏笔”,需要读者揣摩。本节我们主要讨论一下表达能力方面的问题,即:代码如何能清晰的表达作者的意图,让人类易于理解。

    展开全文
  • 代码可读性

    2019-08-15 10:46:02
    代码可读性可读性的重要性用名字表示代码含义名字不能带来歧义良好的代码风格为何需要注释如何编写注释提高控制流的可读性拆分长表达式变量与可读性抽取函数一次只做一件事用自然语言表述代码减少代码量 可读性的...

    可读性的重要性

      编程有很大一部分时间是在阅读代码,不仅要阅读自己的代码,而且要阅读别人的代码。因此,可读性良好的代码能够大大提高编程效率。
      可读性良好的代码往往会让代码架构更好,因为程序员更愿意去修改这部分代码,而且也更容易修改。
      只有在核心领域为了效率才可以放弃可读性,否则可读性是第一位的。

    用名字表示代码含义

    一些比较有表达力的单词:

    单词 可替代单词
    send deliver、dispatch、announce、distribute、route
    find search、extract、locate、recover
    start launch、create、begin、open
    make create、set up、build、generate、compose、add、new

      使用 i、j、k 作为循环迭代器的名字过于简单,user_i、member_i 这种名字会更有表达力。因为循环层次越多,代码越难理解,有表达力的迭代器名字可读性会更高。
      为名字添加形容词等信息能让名字更具有表达力,但是名字也会变长。名字长短的准则是:作用域越大,名字越长。因此只有在短作用域才能使用一些简单名字。

    名字不能带来歧义

      起完名字要思考一下别人会对这个名字有何解读,会不会误解了原本想表达的含义。
    布尔相关的命名加上 is、can、should、has等前缀。
    用 min、max 表示数量范围;
    用 first、last 表示访问空间的包含范围;
    在这里插入图片描述
    begin、end 表示访问空间的排除范围,即 end 不包含尾部。
    在这里插入图片描述

    良好的代码风格

    适当的空行和缩进。
    排列整齐的注释:

    int a = 1;   // 注释
    int b = 11;  // 注释
    int c = 111; // 注释
    

    语句顺序不能随意,比如与 html 表单相关联的变量的赋值应该和表单在 html 中的顺序一致。

    为何需要注释

      阅读代码首先会注意到注释,如果注释没太大作用,那么就会浪费代码阅读的时间。那些能直接看出含义的代码不需要写注释,特别是不需要为每个方法都加上注释,比如那些简单的 getter 和 setter 方法,为这些方法写注释反而让代码可读性更差。
      不能因为有注释就随便起个名字,而是争取起个好名字而不写注释。
      可以用注释来记录采用当前解决办法的思考过程,从而让读者更容易理解代码。
      注释用来提醒一些特殊情况。
    用 TODO 等做标记:

    标记 用法
    TODO 待做
    FIXME 待修复
    HACK 粗糙的解决方案
    XXX 危险!这里有重要的问题

    如何编写注释

    尽量简洁明了

    // The first String is student's name
    // The Second Integer is student's score
    Map<String, Integer> scoreMap = new HashMap<>();
    
    // Student's name -> Student's score
    Map<String, Integer> scoreMap = new HashMap<>();
    

    添加测试用例来说明:

    // ...
    // Example: add(1, 2), return 3
    int add(int x, int y) {
        return x + y;
    }
    

    使用专业名词来缩短概念上的解释,比如用设计模式名来说明代码。

    提高控制流的可读性

    条件表达式中,左侧是变量,右侧是常数。比如下面第一个语句正确:

    if (len < 10)
    if (10 > len)
    

    只有在逻辑简单的情况下使用 ? : 三目运算符来使代码更紧凑,否则应该拆分成 if / else;
    do / while 的条件放在后面,不够简单明了,并且会有一些迷惑的地方,最好使用 while 来代替。
    如果只有一个 goto 目标,那么 goto 尚且还能接受,但是过于复杂的 goto 会让代码可读性特别差,应该避免使用 goto。
    在嵌套的循环中,用一些 return 语句往往能减少嵌套的层数。

    拆分长表达式

    长表达式的可读性很差,可以引入一些解释变量从而拆分表达式:

    if line.split(':')[0].strip() == "root":
        ...
    username = line.split(':')[0].strip()
    if username == "root":
        ...
    

    使用摩根定理简化一些逻辑表达式:

    if (!a && !b) {
        ...
    }
    if (!(a || b)) {
        ...
    }
    

    变量与可读性

    去除控制流变量 。在循环中通过使用 break 或者 return 可以减少控制流变量的使用。

    boolean done = false;
    while (/* condition */ && !done) {
        ...
        if ( ... ) {
            done = true;
            continue;
        }
    }
    while(/* condition */) {
        ...
        if ( ... ) {
            break;
        }
    }
    

    减小变量作用域 。作用域越小,越容易定位到变量所有使用的地方。

    JavaScript 可以用闭包减小作用域。以下代码中 submit_form 是函数变量,submitted 变量控制函数不会被提交两次。第一个实现中 submitted 是全局变量,第二个实现把 submitted 放到匿名函数中,从而限制了起作用域范围。

    submitted = false;
    var submit_form = function(form_name) {
        if (submitted) {
            return;
        }
        submitted = true;
    };
    var submit_form = (function() {
        var submitted = false;
        return function(form_name) {
            if(submitted) {
                return;
            }
            submitted = true;
        }
    }());  // () 使得外层匿名函数立即执行
    

    JavaScript 中没有用 var 声明的变量都是全局变量,而全局变量很容易造成迷惑,因此应当总是用 var 来声明变量。
    变量定义的位置应当离它使用的位置最近。
    实例解析
    在一个网页中有以下文本输入字段:

    <input type = "text" id = "input1" value = "a">
    <input type = "text" id = "input2" value = "b">
    <input type = "text" id = "input3" value = "">
    <input type = "text" id = "input4" value = "d">
    

    现在要接受一个字符串并把它放到第一个空的 input 字段中,初始实现如下:

    var setFirstEmptyInput = function(new_alue) {
        var found = false;
        var i = 1;
        var elem = document.getElementById('input' + i);
        while (elem != null) {
            if (elem.value === '') {
                found = true;
                break;
            }
            i++;
            elem = document.getElementById('input' + i);
        }
        if (found) elem.value = new_value;
        return elem;
    }
    

    以上实现有以下问题:

    found 可以去除;
    elem 作用域过大;
    可以用 for 循环代替 while 循环;

    var setFirstEmptyInput = function(new_value) {
        for (var i = 1; true; i++) {
            var elem = document.getElementById('input' + i);
            if (elem === null) {
                return null;
            }
            if (elem.value === '') {
                elem.value = new_value;
                return elem;
            }
        }
    };
    

    抽取函数

      工程学就是把大问题拆分成小问题再把这些问题的解决方案放回一起。
      首先应该明确一个函数的高层次目标,然后对于不是直接为了这个目标工作的代码,抽取出来放到独立的函数中。
    介绍性的代码:

    int findClostElement(int[] arr) {
        int clostIdx;
        int clostDist = Interger.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            int x = ...;
            int y = ...;
            int z = ...;
            int value = x * y * z;
            int dist = Math.sqrt(Math.pow(value, 2), Math.pow(arr[i], 2));
            if (dist < clostDist) {
                clostIdx = i;
                clostDist = value;
            }
        }
        return clostIdx;
    }
    

    以上代码中循环部分主要计算距离,这部分不属于代码高层次目标,高层次目标是寻找最小距离的值,因此可以把这部分代替提取到独立的函数中。这样做也带来一个额外的好处有:可以单独进行测试、可以快速找到程序错误并修改。

    public int findClostElement(int[] arr) {
        int clostIdx;
        int clostDist = Interger.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            int dist = computDist(arr, i);
            if (dist < clostDist) {
                clostIdx = i;
                clostDist = value;
            }
        }
        return clostIdx;
    }
    

    并不是函数抽取的越多越好,如果抽取过多,在阅读代码的时候可能需要不断跳来跳去。只有在当前函数不需要去了解某一块代码细节而能够表达其内容时,把这块代码抽取成子函数才是好的。
    函数抽取也利于减小代码的冗余。

    一次只做一件事

    只做一件事的代码很容易让人知道其要做的事;
    基本流程:
    列出代码所做的所有任务;
    把每个任务拆分到不同的函数,或者不同的段落。

    用自然语言表述代码

    先用自然语言书写代码逻辑,也就是伪代码,然后再写代码,这样代码逻辑会更清晰。

    减少代码量

    不要过度设计,编码过程会有很多变化,过度设计的内容到最后往往是无用的。
    多用标准库实现。

    展开全文
  • 可读性 用于计算视频和文档的可读性得分
  • 可读性可读性是用于提取和整理文章的Elixir库
  • Ruby的可读性 Ruby Readability是用于提取网页主要可读内容的工具。 它是arc90可读性项目的Ruby端口。 建立状态 安装 命令行: (sudo) gem install ruby-readability 捆绑器: gem "ruby-readability", :require =...
  • readindx 计算可读性
  • 可读性 可读性是一种Web应用程序,用于测量给定文本的可读性。 我从获得了构建此应用程序的灵感。 该应用程序使用Coleman-Liau索引来输出理解该文本所需的年级。 你可以观看。
  • 代码审查:为可读性努力的巨大能量.代码可读性这个话题一直以来都是备受关注,但是可读性高与不高却没有统一的标准。毕竟各个公司,甚至于各个项目的规范都是不一样的。我们不能说一个抽象性极好,灵活度极高却让人十...
  • 作为一项新兴的信息检索评价指标,可读性在文档相关性"实用性以及质量评估中占据重要地位#其中,如.何为用户提供相关可读的文档已成为垂直搜索领域一个亟待解决的问题#为了有效解决这个问题,提出了一种.基于本体...
  • 主要介绍了Python 如何提高元组的可读性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • python文本可读性

    2020-08-02 16:05:14
    可读性计算方法参考: https://python.ctolib.com/cdimascio-py-readability-metrics.html 可读性计算方法有 The Flesch Reading Ease formula Flesch-Kincaid Grade Level The Fog Scale (Gunning FOG Formula) The...

    可读性计算方法参考:
    https://python.ctolib.com/cdimascio-py-readability-metrics.html

    可读性计算方法有

    The Flesch Reading Ease formula
    Flesch-Kincaid Grade Level
    The Fog Scale (Gunning FOG Formula)
    The SMOG Index
    Automated Readability Index
    The Coleman-Liau Index
    Linsear Write Formula
    Dale-Chall Readability Score
    本文选取FOG、ARI、CLI

    准备

    安装包 textstat
    pip install textstat

    导入包

    import pandas as pd
    import textstat	
    

    读入数据

    Idea=pd.read_csv(r"E:\IdeasTest.csv" )
    i=len(Idea)
    print(i)
    

    计算文档可读性并写入csv

    content=[]
    for x in range(0,i):
        j=Idea['Ideas'][x]
        #print(j)
        ID=Idea['userid'][x]
        FOG=textstat.gunning_fog(j)
        ARI=textstat.automated_readability_index(j)
        CLI=textstat.coleman_liau_index(j)
        mean=(FOG+ARI+CLI)/3
        content.append([ID,FOG,ARI,CLI,mean])
        dd=pd.DataFrame(content,columns=['ID','FOG','ARI','CLI','mean'])
        dd.to_csv(r"E:\readability.csv")
    
    展开全文
  • 提高程序可读性

    2021-01-29 13:19:27
    提高程序可读性 点开这篇文章,意味着你有想成为更好的程序员的决心,那么请认真阅读以下内容: 在编程过程中注意提高程序的可读性是良好的编程习惯,这使程序更易于理解,也更容易在以后进行修改和更正。同时也有助...

    提高程序可读性

    点开这篇文章,意味着你有想成为更好的程序员的决心,那么请认真阅读以下内容

    在编程过程中注意提高程序的可读性是良好的编程习惯,这使程序更易于理解,也更容易在以后进行修改和更正。同时也有助于我们理清自己的编程思路。

    为了避免步入代码的wading,可读性是必要的。代码不仅追求效率,也追求优雅,也即“干净利落的抽象”——crisp abstraction(出自Grady ,《面向对象分析与设计》作者)

    否则可能应了那个程序员界的冷笑话:

    你刚写完这个程序的时候,只有你和上帝知道是什么意思;一年以后,只有上帝知道了。# =.=)

    以下是一些能够在编程中有效提高可读性的手段:

    技巧1:关于命名

    1)有意义的命名

    进行名副其实的命名,而不是使用无意义的随意的名字,这种规则包括但不限于变量名、函数名、类名、文件名…否则毫无章法的名字会是读到代码的人产生疑惑,甚至你自己以后重新检查代码时也会陷入迷茫。

    其难处在于需要良好的描述技巧,精准的用词(尤其是我们对英语的掌握可能不那么精通的时候)

    最基本的是:不要简单的使用a,b,c,d去命名变量!

    2)避免误导

    不要给变量等起一个可能被人误导的名字。

    譬如不要用 accountList 来表示一个账号,除非它真的是一个 List,若所用容器不是list,可能会引起一些错误的判断。

    还有不要用小写l, 大写O直接作名字,因为它们和数字0 1很像==

    3)经典命名法

    关于经典命名法可以参考如下文章,其中详细列举了匈牙利、驼峰、帕斯卡命名法

    经典命名法介绍

    技巧2:适当注释

    恰到好处的注释可以省下许多力气,你懂的

    p.s.该技巧与 技巧1 在实际编写代码时应该综合应用,相得益彰,避免重复啰嗦,要减少不必要的注释。

    技巧3:函数的使用

    1)减少嵌套

    多层嵌套会大幅度降低程序的可读性,我们可以借用函数来减少嵌套

    2)避免重复

    重复的代码块可能意味着某种想法未在程序中清晰的表达出来,这也削弱了代码的可读性。

    利用函数包装重复代码块,可以使程序更整洁

    3)代码模块化

    当代码量比较大时,对代码进行模块化,根据各个部分的不同功能进行打包区分,包进函数里,可以使程序看起来整齐有序,提高可读性。

    技巧4:给代码分块

    利用空行分隔多个部分,使程序的步骤序列一目了然,显得结构清晰,也便于作者的整理思考

    技巧5:格式

    注意良好的缩进格式等;遵守主流代码风格,不要另辟蹊径,

    譬如:不要把你的代码的几句放在一行里或者把一句拆成一行以上!!

    int 
    num = 3
    ;//case 1
    
    int num = 9; printf("%d", num); return 0;//case 2
    

    最后

    正如《代码整洁之道》一书中的“花时间保持代码整洁不但有关效率,还有关生存”,毕竟混乱会导致团队生产力下降,又制造更多混乱,最终效率趋向于零…

    因此,在编码过程中注意提高程序可读性就显得至关重要。not necessary elegant, but always clean and tidy

    展开全文
  • Yield可以让你的代码更加高效并拥有更高的可读性,我想已经没有什么借口可以阻止我们学习和使用yield
  • ⏰️使CRON表达式具有人类可读性
  • 主要介绍了提高代码可读性的十大注释技巧,详细分析了编程开发中常用的代码注释方法,需要的朋友可以参考下
  • 这个案例解决了给AutoLayout增加可读性减少代码量,源码Lyt,Lyt是一些UIView、NSView和NSArray的集合,旨在给AutoLayout增加可读性并减少代码量,支持iOS和OS X平台。 特性: 更加语义化与更少的代码
  • java代码可读性规范,养成良好的代码规范。如何命名,注释,抽取公共方法,怎么使用合适的变量,如果优化金字塔式的循环判断
  • 编写可读性代码的艺术,指导我们如何编写可读性很强的代码,养成良好的编程习惯
  • 鉴于文本正文基于flesch-kincaid可读性索引获得文本可读性的评分。 可读性评分是一种工具,旨在让您了解理解文本所需的阅读水平类型。 分数是根据flesch-kincaid指数计算得出的,并提供了等级级别以及运行该文本的...
  • 提升代码的可读性

    2019-08-31 11:17:37
    一、可读性的重要性 编程有很大一部分时间是在阅读代码,不仅要阅读自己的代码,而且要阅读别人的代码。因此,可读性良好的代码能够大大提高编程效率。 可读性良好的代码往往会让代码架构更好,因为程序员更愿意去...
  • 文本可读性AnalYzer工具 这个工具提供了一个快速和简单的方法来测试整个页面的可读性,旨在表明有多难阅读英文或理解。 它为最常用的可读性指标提供评分。 - Flesch Kincaid阅读缓解 - Flesch Kincaid年级 - 狡猾...
  • C++以中文指令书写代码,可大幅提高程序可读性 中文编程方式,代码一目了然
  • 在选定的域上总是使用可读性。 此扩展程序仅添加了上下文菜单以永久启用/禁用当前域的可读性(https://www.readability.com)。 它旨在与可读性Redux扩展(http://preview.tinyurl.com/yl4oky3)一起使用,但也可以...
  • iOS 可读性 readonly

    2016-06-10 11:54:47
    可读性: readonly、readwrite @property(readwrite,....) valueType value; 这个属性是变量的默认属性,就是如果你 (readwrite and readonly 都没有使用,那么你的变量就是 readwrite属性 ) ,通过加入...
  • 通过集成眼睛移动功能来推断文档的可读性
  • 代码可读性杂谈

    2016-12-15 19:30:35
    为什么要强调代码的可读性呢?我简单解释一下.  1.代码的可用性,可用性体现在开发人员把需求开发完成,正常完成产品需求,代码放到服务器上可以正常运行,测试通过,正常上线,皆大欢喜,但这仅仅开发者要做的第一步而已;...
  • 自动化测试设计原则可读性 这是关于测试属性的第二篇文章,在现在著名的“ 如何测试您的测试 ”文章中进行了介绍。 我们通常会忘记从测试中获得的大部分价值是在编写它们之后获得的。 当然,TDD可以帮助设计代码...
  • 选取年报可读性进行研究,按照每股收益排名各选取100家上市公司,提出可读性数值的计算模型,通过Eviews统计软件,对我国上市公司中的非财务信息可读性进行了实证研究,并对研究结果进行分析讨论,揭示出金融危机下...
  • magrittr:使用管道提高R代码的可读性

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 358,925
精华内容 143,570
关键字:

可读性