精华内容
下载资源
问答
  • 新手求解释代码,新手求解释代码,新手求解释代码,新手求解释代码,![图片说明](https://img-ask.csdn.net/upload/201603/17/1458214292_699545.png)
  • 简单代码解释

    2012-03-17 15:49:18
    简单代码解释
  • Java源代码解释

    热门讨论 2011-01-21 14:52:58
    一个java的辅助工具,旨在编写java时,能适时的解释代码段作用.
  • 代码整洁 vs 代码肮脏

    万次阅读 多人点赞 2019-09-16 12:05:12
    写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、什么是整洁代码;然后通过大量的刻意练习,才能真正写出整洁的代码。 WTF/min是衡量代码质量的唯一标准,...

    写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、什么是整洁代码;然后通过大量的刻意练习,才能真正写出整洁的代码。

    WTF/min是衡量代码质量的唯一标准,Uncle Bob在书中称糟糕的代码为沼泽(wading),这只突出了我们是糟糕代码的受害者。国内有一个更适合的词汇:屎山,虽然不是很文雅但是更加客观,程序员既是受害者也是加害者。

    对于什么是整洁的代码,书中给出了大师们的总结:

    • Bjarne Stroustrup:优雅且高效;直截了当;减少依赖;只做好一件事
    • Grady booch:简单直接
    • Dave thomas:可读,可维护,单元测试
    • Ron Jeffries:不要重复、单一职责,表达力(Expressiveness)

    其中,我最喜欢的是表达力(Expressiveness)这个描述,这个词似乎道出了好代码的真谛:用简单直接的方式描绘出代码的功能,不多也不少。

    本文记录阅读《clean code》之后个人“深有同感”或者“醍醐灌顶”的一些观点。

    一、命名的艺术

    坦白的说,命名是一件困难的事情,要想出一个恰到好处的命名需要一番功夫,尤其我们的母语还不是编程语言所通用的英语。不过这一切都是值得了,好的命名让你的代码更直观,更有表达力。

    好的命名应该有下面的特征:

    1.1 名副其实

    好的变量名告诉你:是什么东西,为什么存在,该怎么使用

    如果需要通过注释来解释变量,那么就先得不那么名副其实了。

    下面是书中的一个示例代码,展示了命名对代码质量的提升

    # bad code
    def getItem(theList):
       ret = []
       for x in theList:
          if x[0] == 4:
             ret.append(x)
       return ret
    
    # good code
    def getFlaggedCell(gameBoard):
       '''扫雷游戏,flagged: 翻转'''
       flaggedCells = []
       for cell in gameBoard:
          if cell.IsFlagged():
             flaggedCells.append(cell)
       return flaggedCells
    

    1.2 避免误导

    • 不要挂羊头卖狗肉
    • 不要覆盖惯用缩略语

    这里不得不吐槽前两天才看到的一份代码,居然使用了 l 作为变量名;而且,user居然是一个list(单复数都没学好!!)

    1.3 有意义的区分

    代码是写给机器执行,也是给人阅读的,所以概念一定要有区分度。

    # bad
    def copy(a_list, b_list):
        pass
    
    # good
    def copy(source, destination):
        pass
    

    1.4 使用读的出来的单词

    如果名称读不出来,那么讨论的时候就会像个傻鸟

    1.5 使用方便搜索的命名

    名字长短应与其作用域大小相对应

    1.6 避免思维映射

    比如在代码中写一个temp,那么读者就得每次看到这个单词的时候翻译成其真正的意义

    二、注释

    有表达力的代码是无需注释的:The proper use of comments is to compensate for our failure to express ourself in code.

    注释的适当作用在于弥补我们用代码表达意图时遇到的失败,这听起来让人沮丧,但事实确实如此。The truth is in the code, 注释只是二手信息,二者的不同步或者不等价是注释的最大问题。

    书中给出了一个非常形象的例子来展示:用代码来阐述,而非注释

    bad
    // check to see if the employee is eligible for full benefit
    if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
    
    good
    if (employee.isEligibleForFullBenefits())
    

    因此,当想要添加注释的时候,可以想想是否可以通过修改命名,或者修改函数(代码)的抽象层级来展示代码的意图。

    当然,也不能因噎废食,书中指出了以下一些情况属于好的注释

    • 法务信息
    • 对意图的注释,为什么要这么做
    • 警示
    • TODO注释
    • 放大看似不合理之物的重要性

    其中个人最赞同的是第2点和第5点,做什么很容易通过命名表达,但为什么要这么做则并不直观,特别涉及到专业知识、算法的时候。另外,有些第一感觉“不那么优雅”的代码,也许有其特殊愿意,那么这样的代码就应该加上注释,说明为什么要这样,比如为了提升关键路径的性能,可能会牺牲部分代码的可读性。

    最坏的注释就是过时或者错误的注释,这对于代码的维护者(也许就是几个月后的自己)是巨大的伤害,可惜除了code review,并没有简单易行的方法来保证代码与注释的同步。

    三、函数

    3.1 函数的单一职责

    一个函数应该只做一件事,这件事应该能通过函数名就能清晰的展示。判断方法很简单:看看函数是否还能再拆出一个函数。

    函数要么做什么do_sth, 要么查询什么query_sth。最恶心的就是函数名表示只会query_sth, 但事实上却会do_sth, 这使得函数产生了副作用。比如书中的例子

    public class UserValidator {
        private Cryptographer cryptographer;
        public boolean checkPassword(String userName, String password) {
            User user = UserGateway.findByName(userName);
            if (user != User.NULL) {
                String codedPhrase = user.getPhraseEncodedByPassword();
                String phrase = cryptographer.decrypt(codedPhrase, password);
                if ("Valid Password".equals(phrase)) {
                    Session.initialize();
                    return true;
                }
            }
            return false;
        }
    }
    

    3.2 函数的抽象层级

    每个函数一个抽象层次,函数中的语句都要在同一个抽象层级,不同的抽象层级不能放在一起。比如我们想把大象放进冰箱,应该是这个样子的:

    def pushElephantIntoRefrige():
        openRefrige()
        pushElephant()
        closeRefrige()
    

    函数里面的三句代码在同一个层级(高度)描述了要完成把大象放进冰箱这件事顺序相关的三个步骤。显然,pushElephant这个步骤又可能包含很多子步骤,但是在pushElephantIntoRefrige这个层级,是无需知道太多细节的。

    当我们想通过阅读代码的方式来了解一个新的项目时,一般都是采取广度优先的策略,自上而下的阅读代码,先了解整体结构,然后再深入感兴趣的细节。如果没有对实现细节进行良好的抽象(并凝练出一个名副其实的函数),那么阅读者就容易迷失在细节的汪洋里。

    某种程度看来,这个跟金字塔原理也很像
    file

    每一个层级都是为了论证其上一层级的观点,同时也需要下一层级的支持;同一层级之间的多个论点又需要以某种逻辑关系排序。pushElephantIntoRefrige就是中心论点,需要多个子步骤的支持,同时这些子步骤之间也有逻辑先后顺序。

    3.3 函数参数

    函数的参数越多,组合出的输入情况就愈多,需要的测试用例也就越多,也就越容易出问题。

    输出参数相比返回值难以理解,这点深有同感,输出参数实在是很不直观。从函数调用者的角度,一眼就能看出返回值,而很难识别输出参数。输出参数通常逼迫调用者去检查函数签名,这个实在不友好。

    向函数传入Boolean(书中称之为 Flag Argument)通常不是好主意。尤其是传入True or False后的行为并不是一件事情的两面,而是两件不同的事情时。这很明显违背了函数的单一职责约束,解决办法很简单,那就是用两个函数。

    3.4 Dont repear yourself

    在函数这个层级,是最容易、最直观实现复用的,很多IDE也难帮助我们讲一段代码重构出一个函数。

    不过在实践中,也会出现这样一种情况:一段代码在多个方法中都有使用,但是又不完全一样,如果抽象成一个通用函数,那么就需要加参数、加if else区别。这样就有点尴尬,貌似可以重构,但又不是很完美。

    造成上述问题的某种情况是因为,这段代码也违背了单一职责原则,做了不只一件事情,这才导致不好复用,解决办法是进行方法的细分,才能更好复用。也可以考虑template method来处理差异的部分。

    四、测试

    非常惭愧的是,在我经历的项目中,测试(尤其是单元测试)一直都没有得到足够的重视,也没有试行过TDD。正因为缺失,才更感良好测试的珍贵。

    我们常说,好的代码需要有可读性、可维护性、可扩展性,好的代码、架构需要不停的重构、迭代,但自动化测试是保证这一切的基础,没有高覆盖率的、自动化的单元测试、回归测试,谁都不敢去修改代码,只能任其腐烂。

    即使针对核心模块写了单元测试,一般也很随意,认为这只是测试代码,配不上生产代码的地位,以为只要能跑通就行了。这就导致测试代码的可读性、可维护性非常差,然后导致测试代码很难跟随生产代码一起更新、演化,最后导致测试代码失效。所以说,脏测试 - 等同于 - 没测试。

    因此,测试代码的三要素:可读性,可读性,可读性。

    对于测试的原则、准则如下:

    • You are not allowed to write any production code unless it is to make a failing unit test pass. 没有测试之前不要写任何功能代码
    • You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures. 只编写恰好能够体现一个失败情况的测试代码
    • You are not allowed to write any more production code than is sufficient to pass the one failing unit test. 只编写恰好能通过测试的功能代码

    测试的FIRST准则:

    • 快速(Fast)测试应该够快,尽量自动化。
    • 独立(Independent) 测试应该应该独立。不要相互依赖
    • 可重复(Repeatable) 测试应该在任何环境上都能重复通过。
    • 自我验证(Self-Validating) 测试应该有bool输出。不要通过查看日志这种低效率方式来判断测试是否通过
    • 及时(Timely) 测试应该及时编写,在其对应的生产代码之前编写

    该文章通过 https://openwrite.cn/ 工具创造并群发。

    展开全文
  • G代码经典解释程序

    2011-12-31 21:39:36
    G代码经典解释程序,Linux下G代码解释器的设计与实现,C语言。
  • G代码解释程序

    热门讨论 2008-06-24 15:13:54
    c++ builder 写的G代码解释程序
  • 数控G代码解释

    热门讨论 2012-08-17 10:03:33
    数控G代码解释器,很全面,很形象,不错的选择
  • C#代码解释

    千次阅读 2013-04-24 15:44:22
    1、C#代码解释器简介 能够动态执行 C#代码是一件很酷的功能,比如,我们可以在控制台中输入一行 C#代码,然后程序自动编译并执行这一行代码,将结果显示给我们。这差不多就是一个最简单的 C#代码解释器了。 ...

    1、C#代码解释器简介

    能够动态执行 C#代码是一件很酷的功能,比如,我们可以在控制台中输入一行 C#代码,然后程序自动编译并执行这一行代码,将结果显示给我们。这差不多就是一个最简单的 C#代码解释器了。

    动态执行 C#代码又是一件很有用的功能,比如,我们可以将某些代码写在某个文件之中,由程序集在执行时进行加载,改变这些代码不用中止程序,当程序再次加载这些代码时,就自动执行的是新代码了。

    2、简单的 C#代码解释器

    ASDF

    usingSystem;  
    usingSystem.Collections.Generic;  
    usingSystem.Reflection;  
    usingSystem.Globalization;  
    usingMicrosoft.CSharp;  
    usingSystem.CodeDom;  
    usingSystem.CodeDom.Compiler;  
    usingSystem.Text;  
    usingSystem.IO;  
    usingSystem.Xml;  
     
    namespaceTest  
    {  
    classProgram  
    {  
    staticvoidMain(string[]args)  
    {  
    Console.Write(">>");  
    Stringcmd;  
    Contextcxt=newContext();  
    while((cmd=Console.ReadLine().Trim())!="exit")  
    {  
    if(!String.IsNullOrEmpty(cmd))  
    {  
    Console.WriteLine();  
    cxt.Invoke(cmd);  
    }  
    Console.Write("\n>>");  
    }  
    }  
    }  
     
    publicclassContext  
    {  
    publicCSharpCodeProviderCodeProvider{get;set;}  
    publicIDictionary<String,Assembly>Assemblys{get;set;}  
     
    publicContext()  
    {  
    CodeProvider=newCSharpCodeProvider(newDictionary<string,string>()
    {{"CompilerVersion","v3.5"}});  
    Assemblys=newDictionary<String,Assembly>();  
    Assembly[]al=AppDomain.CurrentDomain.GetAssemblies();  
    foreach(Assemblyainal)  
    {  
    AddAssembly(a);  
    }  
    AppDomain.CurrentDomain.AssemblyLoad+=newAssemblyLoadEventHandler
    (CurrentDomain_AssemblyLoad);  
    }  
     
    privatevoidAddAssembly(Assemblya)  
    {  
    if(a!=null)  
    {  
    Assemblys.Add(a.FullName,a);  
    }  
    }  
     
    voidCurrentDomain_AssemblyLoad(objectsender,AssemblyLoadEventArgsargs)  
    {  
    Assemblya=args.LoadedAssembly;  
    if(!Assemblys.ContainsKey(a.FullName))  
    {  
    AddAssembly(a);  
    }  
    }  
     
    publicCompilerParametersCreateCompilerParameters()  
    {  
    CompilerParameterscp=newCompilerParameters();  
    cp.GenerateExecutable=false;  
    cp.GenerateInMemory=true;  
    if(Assemblys!=null)  
    {  
    foreach(AssemblyainAssemblys.Values)  
    {  
    cp.ReferencedAssemblies.Add(a.Location);  
    }  
    }  
    returncp;  
    }  
     
    publicvoidInvoke(Stringcmd)  
    {  
    StringinputCmdString=cmd.Trim();  
    if(String.IsNullOrEmpty(inputCmdString))return;  
     
    StringfullCmd=BuildFullCmd(inputCmdString);  
     
    CompilerResultscr=CodeProvider.CompileAssemblyFromSource
    (CreateCompilerParameters(),fullCmd);  
     
    if(cr.Errors.HasErrors)  
    {  
    BooleanrecompileSwitch=true;  
     
    foreach(CompilerErrorerrincr.Errors)  
    {  
    //CS0201:Onlyassignment,call,increment,decrement,andnewobjectexpressionscanbe  
    //usedasastatement  
    if(!err.ErrorNumber.Equals("CS0201"))  
    {  
    recompileSwitch=false;  
    break;  
    }  
    }  
     
    //重新编译  
    if(recompileSwitch)  
    {  
    StringdynaName="TempArg_Dynamic_"+DateTime.Now.Ticks.ToString();  
    inputCmdString=String.Format("var{0}=",dynaName)+inputCmdString;  
    inputCmdString+=";\nSystem.Console.WriteLine("+dynaName+");";  
     
    fullCmd=BuildFullCmd(inputCmdString);  
    cr=CodeProvider.CompileAssemblyFromSource(CreateCompilerParameters(),fullCmd);  
    }  
     
    if(cr.Errors.HasErrors)  
    {  
    Console.WriteLine("编译错误:");  
    foreach(CompilerErrorerrincr.Errors)  
    {  
    Console.WriteLine(err.ErrorNumber);  
    Console.WriteLine(err.ErrorText);  
    }  
     
    return;  
    }  
    }  
     
    Assemblyassem=cr.CompiledAssembly;  
    ObjectdynamicObject=assem.CreateInstance("Test.DynamicClass");  
    Typet=assem.GetType("Test.DynamicClass");  
    MethodInfominfo=t.GetMethod("MethodInstance");  
    minfo.Invoke(dynamicObject,null);  
    }  
     
    privateStringBuildFullCmd(StringinputCmdString)  
    {  
    StringStringfullCmd=String.Empty;  
     
    fullCmd+=@"  
    namespaceTest  
    {  
    publicclassDynamicClass  
    {  
    publicvoidMethodInstance()  
    {  
    "+inputCmdString+@";  
    }  
    }  
    }";  
    returnfullCmd;  
    }  
    }  
    } 


    展开全文
  • 魔王语言解释的c代码,用栈,队列写,不要用c++,表示刚学数据结构,很菜。
  • PHP代码没有解释运行,而是直接将代码输出到浏览的问题可能跟个人代码风格有关;以下就是个人在工作中遇到的问题及解决方案: 图1:这是我自己写代码的风格或者习惯吧! 图2:是同事的写代码风格

    注:以下是本人工作中遇到的问题及解决方法,如有错误,请包容及希望在评论中加以纠正;祝:工作顺利!


    在工作中,维护现有项目,功能是多人协同开发,每个人的代码风格都不一样;PHP代码没有解释运行,而是直接将代码输出到浏览的问题可能跟个人代码风格有关;以下就是个人在工作中遇到的问题及解决方案:


    图1:这是我自己写代码的风格或者习惯吧!



    图2:是同事的写代码风格,使用的是php短标签



    使用了PHP短标签为什么代码没有解释运行呢?在php.ini文件中默认是没有开启短标签支持的,所以代码没有解释运行。解决办法当然是在php.ini中开启短标签支持,操作如下图所示:



    展开全文
  • 2.2 SOMTA代码生成器名词解释

    千次阅读 2018-10-23 10:55:10
    1、项目 ...解释:对象是项目下的最小单元,通过对象来生成我们所需要的代码,对象支持多种导入方式: 1)界面新增导入对象 2)SQL语句直接导入 3)数据库批量导入 3、码豆 码豆是SOMTA代码生成...

    1、项目

    解释:该代码生成器以互联网开发项目的理念为基础,所以是以一个项目基础,项目中包含针对项目的一些基础信息,包括:项目名、端口、包名、SpringBoot的版本、数据库、数据库用户名、数据库密码等

    2、对象

    解释:对象是项目下的最小单元,通过对象来生成我们所需要的代码,对象支持多种导入方式:
    1)界面新增导入对象
    2)SQL语句直接导入
    3)数据库批量导入

    3、码豆

    码豆是SOMTA代码生成平台的虚拟货币,可以通过多种方式免费获得
    1)新注册用户,系统会默认赠送100码豆
    2)注册用户复制邀请链接,每成功邀请一位好友赠送20码豆
    3)关注微信公众号“明天的地平线”,点击“代码生成” → “签到领码豆” → “输入平台注册账号” → “点击签到”,即可签到成功,每次签到系统自动赠送5码豆



    SOMTA代码生成器交流群:815605560

    原文地址:https://somta.com.cn/blog/view/aaa5bf5c976c4c54b297e2fc01ba5408

    本文由明天的地平线创作,如想了解更多更详细的内容,请关注一下公众号,公众号内将进行最新最实时的更新!
    在这里插入图片描述

    展开全文
  • 关于Python代码是编译执行还是解释执行 本文转载自关于python代码是编译执行还是解释执行 Python 是编译型语言还是解释性语言?回答这个问题前,应该先弄清楚什么是编译型语言,什么是解释性语言。 所谓编译执行...
  • 中国河流名称代码解释

    千次阅读 2017-08-10 10:42:29
    中国河流名称代码解释 1 说明 1.0.1  为适应国家水利建设与管理现代化、防汛抗旱信息 化建设需要,编制本标准。  1.0.2  本标准规定了全国流域面积大于1000Km2 的河流,以及大型和重要中型水库、...
  • Android人脸识别源码——详细代码解释
  • arduino GCode_Interpreterdc G代码解释器 也可以当做c语言g代码解释器参考 不坑爹
  • 有人在讨论 Python 代码是编译执行还是解释执行?这个问题还可以换一种说法: Python 是编译型语言还是解释型语言?回答这个问题前,我们先弄清楚什么是编译型语言,什么是解释型语言。 所谓编译执行就是源代码...
  • 常见蓝屏代码解释及解决方法

    万次阅读 2020-07-22 20:12:59
    蓝屏代码解释及解决方法     小云因为常遇到电脑蓝屏情况,今天就来整理一下部分常见的蓝屏代码分析及解决方法。 1、蓝屏代码 文字说明:IRQL-NOT-LESS-OR-EQVAL 通常的原因:驱动程序使用了...
  • 网上售票系统C++源代码及其解释

    热门讨论 2009-06-02 12:23:38
    网上售票系统C++源代码及其解释网上售票系统C++源代码及其解释网上售票系统C++源代码及其解释网上售票系统C++源代码及其解释网上售票系统C++源代码及其解释网上售票系统C++源代码及其解释网上售票系统C++源代码及其...
  • 本人博客内编译原理文章的配套资源jar包,包括词法分析,语法分析,中间代码生成,静态语义检查,代码解释执行以及抽象语法树的手动生成:https://download.csdn.net/download/as1072966956/10448935转载请注明出处...
  • 代码到可执行文件的过程: 编译器驱动程序读取源文件(hello.c和main.c),经过预处理、编译、汇编、链接(分别使用预处理器、编译器、汇编器、链接器,这四个程序构成了编译系统)四个步骤,将其翻译成可执行目标...
  • Python源代码——解释器—— python.exe Python解释器是用C语言写的 所以Python解释器是C代码 就需要C编译器 C编译器是用 汇编语言写的 Python源码就是Python解释器源码, Python就是Python解释器 当今几乎所有的...
  • java实现天气预报(解释+源代码

    热门讨论 2012-03-17 10:53:43
    使用java实现的天气预报,有源代码解释,源代码可以直接复制,运行之后是一个小程序
  • 列举web报表工具中数据集报错错误代码解释
  • 关于G代码解释

    千次阅读 2014-04-05 21:52:23
    arduino当Gcode解释程序(CNC) - Powered by Discuz! http://www.geek-workshop.com/thread-4722-1-1.html   ANDCIV GCODE详解-13.A28_百度文库 ...
  • 视频播放器源代码解释

    千次阅读 2009-02-24 00:48:00
    视频播放器源代码解释param name标签属性详解param name标签是在这个播放插件中嵌入的一些功能和播放参数,比如(你可以抄下来): …………………… 等等等 embed元素和对象含义为允许嵌入任何文档。它的注释是:必须...
  • java中,负责对字节代码解释执行

    千次阅读 2019-09-11 22:00:06
    java中负责对字节代码解释执行的是虚拟机,虚拟机将得到的字节代码进行编码运行。 java程序,是先把java源程序通过javac命令编译成字节码文件,然后再用java命令解释执行。把字节码文件复制到其它计算机上,只要有...
  • 谁可以给我解释这段代码 ![图片说明](https://img-ask.csdn.net/upload/201601/03/1451831327_380230.png)
  • 近200个常用功能的VBA代码,对每一行代码进行了详细的解释,并对涉及的函数进行全面的阐述,是工作时的有力助手也是学习VBA的最佳利器。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,812,916
精华内容 725,166
关键字:

怎么解释代码