精华内容
下载资源
问答
  • 主要介绍了Python英文字符大小转换代码示例,本文例子相对简单,本文直接给出代码实例,需要的朋友可以参考下
  • 没用过这些 IDEA 插件?怪不得写代码头疼

    万次阅读 多人点赞 2020-01-14 18:42:30
    可以通过该插件,无需再那么多冗余的get/set代码。 注意:需要在pom引入依赖 <!--lombok用来简化实体类:需要安装lombok插件--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok...

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。

    这博客是对自己学习的一点点总结及记录,如果您对 Java算法 感兴趣,可以关注我的动态,我们一起学习。

    用知识改变命运,让我们的家人过上更好的生活

    相关文章

    史上最全的IDEA快捷键总结,提高开发效率

    Eclipse 最牛逼的 10 组快捷键,提高开发效率

    史上最牛逼的 VSCode 插件,提高开发效率!

    史上最全的 VsCode 快捷键,提高开发效率


    学习使用一些插件,可以提高平常工作中的开发效率。对于我们开发人员很有帮助!


    插件安装

    IDEA里面,依次选择打开 FileSettingsPlugins,在Plugins里面可以搜索需要的插件,然后安装(安装完插件,一定要重启Idea,不然插件不生效
    在这里插入图片描述

    1. Alibaba Java Coding Guidelines

    阿里巴巴代码规范检查插件

    ① 功能:

    代码规范检查

    ② 使用方法:

    在你需要检查的代上面,点击右键,选择编码规约扫描

    在这里插入图片描述
    将会出现如下所示的检查结果,并会给出编码规范和提示:
    在这里插入图片描述

    2. FindBugs-IDEA

    Bug检查插件

    ① 功能:

    这个插件可以帮助我们查找隐藏的bug,比较重要的功能就是查找潜在的null指针。

    可以分析当前文件,包下面的所有文件,整个module下的文件,整个project下的文件。可以帮助我们检查隐藏的Bug。

    ② 使用方法:

    在文件上或文件里面点击鼠标右键,选择FingBugs

    在这里插入图片描述

    3. Key promoter

    快捷键提示插件

    ① 功能:

    当您在IDE内的按钮上使用鼠标时,键启动器X会显示您本该使用的键盘快捷键。

    ② 使用方法:

    当你点击鼠标一个功能的时候,可以提示你这个功能快捷键是什么。

    比如我点击过debug,当我下次再次点击的时候,它会提示 debug的快捷键是 Ctrl + Shift + F10

    在这里插入图片描述

    4. Translation

    翻译的插件

    ① 功能:

    在平时的开发中,有时候对于变量的命名是否很头疼,这款插件可以帮你忙。

    ② 使用方法:

    选中你要翻译的汉语或英文,点击鼠标右键,选择Translate, (快捷键是Ctrl + Shift +Y)就会实现翻译,不用再去切换屏幕使用翻译软件翻译了。

    在这里插入图片描述

    注:还有一款翻译插件是 EcTranslation

    5. Maven Helper

    分析依赖冲突的插件

    ① 功能:

    此插件可用来方便显示maven的依赖树,和显示冲突,在我们梳理依赖时帮助很大。

    ② 使用方法:

    安装好后在pom文件的左下角有两个tab,打开Dependency Analyzer:

    在这里插入图片描述
    可以查看依赖冲突
    在这里插入图片描述

    可以清晰的查看maven依赖树

    在这里插入图片描述

    6. Free Mybatis plugin

    增强idea对mybatis支持的插件

    ① 功能:

    • 生成mapper xml文件
    • 快速从代码跳转到mapper及从mapper返回代码
    • mybatis自动补全及语法错误提示
    • 集成mybatis generator gui界面

    这个插件超级实用,可以从mapper接口跳转到mybatis的xml文件中,还能找到对应的方

    ② 使用方法:

    点击箭头可以实现跳转

    在这里插入图片描述

    7. Grep Console

    日志高亮显示插件

    ① 功能:

    当你密密麻麻一大片的日志,去查看起来,很容易看花眼;使用该插件实现高亮显示

    在这里插入图片描述

    8. Rainbow Brackets

    功能:

    可以实现配对括号相同颜色,并且实现选中区域代码高亮的功能。

    在这里插入图片描述

    9. Lombok

    功能:

    当我们创建一个实体时,通常对每个字段去生成GET/SET方法,但是万一后面需要增加或者减少字段时,又要重新的去生成GET/SET方法,非常麻烦。可以通过该插件,无需再写那么多冗余的get/set代码。

    注意:需要在pom引入依赖

    <!--lombok用来简化实体类:需要安装lombok插件-->
    <dependency>
    	<groupId>org.projectlombok</groupId>
    	<artifactId>lombok</artifactId>
    </dependency>
    

    10. CodeGlance

    代码编辑区缩略图插件

    功能

    可以快速定位代码,使用起来比拖动滚动条方便多了

    在这里插入图片描述

    最后介绍一个没有用的插件,哈哈

    Nyan progress bar

    基于Idea使用的漂亮进度条。把你的加载进度条全都变成彩虹和猫咪
    在这里插入图片描述


    由于水平有限,本博客难免有不足,恳请各位大佬不吝赐教!

    展开全文
  • 写代码 注释用英语还是中文 如果您像我一样,则可能有经历过几个月前编写的代码的经验,并且不了解任何一行。 我知道这件事发生在我很多次。 与此相反,如果我从现在起十年后读这篇文章,我仍然会理解它的含义(尽管...

    写代码 注释用英语还是中文

    如果您像我一样,则可能有经历过几个月前编写的代码的经验,并且不了解任何一行。 我知道这件事发生在我很多次。 与此相反,如果我从现在起十年后读这篇文章,我仍然会理解它的含义(尽管我可能认为我天真无知地写了它)。 原因很明显,这段文字是用纯英语写的,而不是像Javascript或(或称)C ++这样的编程语言。 即使是经验丰富的程序员也能更好地理解自然语言。

    编程语言有什么问题?

    很明显,即使我们可能已经花了多年的时间编写计算机代码,但我们对英语的习惯仍然要好得多。 使用非自然语言进行编码具有很高的成本。 任何程序员都知道编写代码仅仅是开始。 该代码需要记录,调试,维护和重构。 代码的非自然性质需要花费大量的精力和时间来理解代码的逻辑。 培训其他开发人员使用代码的要求甚至更高。 使用公共API(或公司范围的API)提出了更大的文档和培训挑战。 如果我们能用英语编码。

    初始编码仅占软件生命周期成本的5%

    …但是自然语言编程可行吗

    自然语言编程一直是软件界的圣杯。 在设计类似于自然语言(Cobol,SQL,AppleScript)的编程语言方面进行了一些尝试,但是没有一个类似于实际的自然语言。 自然语言编程只是一个无法实现的目标。 没有一种现代的,经常使用的编程语言试图模仿自然语言。 放弃NLP(自然语言编程)的最常见原因是:

    • 语言太复杂,计算机无法理解
    • 用人类语言陈述一条指令的方法有很多
    • 语言天生就是模棱两可的。 计算机语言必须明确(确定性)

    尽管没有人可以否认这些语句的可行性,但是它们还是代表了目标的二元视图,无论您使用自然语言编程还是没有。

    我想建议达到NLP的目标应该是一个渐进的过程,沿着非自然的计算机代码和自然的语言之间的连续性发展。 我想提供以下阶段来实现艰巨的目标:

    1. 受限制的自然语言处理
    2. 计算机辅助自然语言处理
    3. 需求编程

    第一阶段-受限制的NLP

    在此阶段,我们建议您像自然语言一样阅读一种计算机语言,但是编写它需要对编程有一定的了解,并需要一些可用的自然语言功能的知识。 考虑以下JavaScript表达式:

    strlen(Str);
    getElementById('button1').focus();
    Node2.parentElement.insertBefore(Node1,Node2);

    该符号是从数学函数中借用的,这是数学部门研究软件的日子的残余。 这没有什么自然的。 现在,考虑以下相似之处:

    length of Str
    focus on element "button1"
    insert Node1 before Node2

    第二个序列的含义与第一个序列完全相同,但是第二个序列是可读的,即使对于非程序员来说也很自然。 主要区别在于参数在函数名称中内联而不是在括号中分组。 语法上的微小差异会使代码的可读性产生巨大差异。 内联格式不需要任何复杂的机器学习算法。 它只与更改语言的语法有关。 考虑以下函数定义:

    DEFINE length of S AS
    return S.length;
    END

    该定义可以是确定性编程语言的一部分,可以与我们习惯的编程语言范例一起使用。 唯一的区别是参数是内联的。

    自然语言的另一个重要的“特征”是可以使用的形式,它可以导入正式的编程语言中。 在自然语言中,通常使用确定器“ the”在短语的上下文中引用实体,例如, move the image 23 pixels to the right 。 在传统的编程范例中,最大的缺点之一就是引用函数体外部的对象。 实际上,引用上下文对于编程至关重要。 解决方法是将上下文作为附加参数传递。 不用说,这不会提高代码的可读性。 在自然编程语言中,这可能看起来像这样:

    //defining the function
    DEFINE move to next token CONTEXT the text, the current position,the current token AS ... END
    // ==> function moveToNextToken(theText, theCurrentPosition, theCurrentToken){...};
    //calling the function
    the text = "hello world"; the current position = 0;
    move to next token;//referencing the text and the current position
    show (the current token)

    显然,自然语言编译器需要支持使用保存原始值的某些上下文值对象通过引用进行调用。

    现有编程语言还有其他“调整”,可以使它们更加“自然”,例如键入和使用代词。

    注意,程序员在编写代码时,需要知道length of S的可用函数length of S该函数采用的参数,以及通常如何编写程序,任何阅读length of Str文本length of Str都可以轻松理解其含义。这个词组 受限制的NLP意味着编写者必须使用现有的NLP功能,但读者可以在没有先验知识的情况下理解代码。 这暗示着不需要其他文档。 该代码是文档。

    我在github项目naturaljs中建议了这种语言的可能语法。 这是对Java自然语言扩展的建议,该扩展可转换为Javascript代码,与转换打字稿的工作方式类似。 如果您相信该项目,请给 加注 星标 。 我保证一旦项目获得100星就将实施它。

    第二阶段-计算机辅助NLP

    在第一阶段,编程经验与当前的编程语言范例非常相似。 程序员必须:

    1. 注意可用的不同功能及其语法
    2. 下载并集成所需的库
    3. 编写明确的代码- show (length of S)而不是show length of S

    计算机辅助NLP将通过放宽这些限制来简化编程过程。 输出仍将是相同的确定性代码。 但是,程序员可以更加自由地编写代码,并且交互式编译器会根据先前的编程历史,可用的NLP编程语料库和机器学习来建议不同的选项。 它可以建议以下内容:

    • 当程序员写“专注于按钮1”时,会提示“专注于(标记为'按钮1'的按钮)”
    • 当程序员编写“ S中的字符数”时,将建议现有的自然函数“ S的长度”
    • 当程序员编写“ S中的大写字符数”时,建议输入“自然文本”包,并将代码更改为“ S中的大写字符”,以匹配“自然文本”包中自然函数的语法。

    我确实相信,通过实施第一阶段和第二阶段,我们将大大改善编程经验,并显着降低软件开发和维护的成本。 但是,第三阶段将完全改变我们的软件开发概念。

    第三阶段-需求编程

    在我看来,自然语言编程的最终目标应该是从需求文档中自动获取计算机代码。 这意味着更深的自然语言理解能力,解决方案的很大一部分将是某种程度的自动软件设计。 “计算机”可能会使用在线配置文件或需求提示来设计最佳的工作设计。 设计也可以根据需求进行自动更改。

    尽管目前看来这很难实现,但我确实相信,随着机器学习技术的发展以及依靠前两个阶段的实现,这个目标是可以实现的。 这可能需要一些形式上的需求编写,但是达到这样一个阶段的意义是巨大的。 这将完全改变我们了解软件工程的方式。

    您能提供什么帮助

    如果您相信自然语言编程的概念,建议您看看我的naturaljs github项目 。 它包含有关我的相貌的一些想法。 我保证一旦该项目获得100颗星,就将开始实施第一阶段。

    马丁·福勒的话

    翻译自: https://hackernoon.com/its-time-we-code-in-english-e02df6b62ecc

    写代码 注释用英语还是中文

    展开全文
  • 如何写代码

    千次阅读 2017-08-26 16:45:52
    写代码就是学一门语言然后开始撸代码吗?看完了我的《GoF设计模式》系列文章的同学或者本身已经就是老鸟的同学显然不会这么认为。编程是一项非常严谨的工作!虽然我们自嘲为码农,但是这工作毕竟不是真正的搬砖,...

    博客链接:https://www.bughui.com/2017/08/21/how-to-write-code/  作者:Bug辉

    如何写代码 —— 编程内功心法

    写代码就是学一门语言然后开始撸代码吗?看完了我的《GoF设计模式》系列文章的同学或者本身已经就是老鸟的同学显然不会这么认为。编程是一项非常严谨的工作!虽然我们自嘲为码农,但是这工作毕竟不是真正的搬砖,我们是软件工程师。编程需要关注的问题太多,不仅仅有语言,还有算法、数据结构、编程技巧、编码风格、设计、架构、工程化、开发工具、团队协作等方方面面,涉及到很多层面的问题。本文将分享一下根据我这几年来的编程经验总结出的一些关于如何写代码的个人见解。

    由于“跟我混”的一些小伙伴编程功底相对来说比较薄弱,所以在此总结一篇“编程内功心法”帮助他们渡过职业生涯的第一个瓶颈期。顺便,也造福一下路过的有缘的同学!于是有了此文。

    前言

    首先,思考一个问题,何谓编程?编程就是写代码吗?

    所谓的编程,其实就是不断的对这个现实世界中的问题建立模型并将其固化为代码自动化执行的过程。
    ~ Bug辉GoF设计模式 - 解释器模式

    在对问题建立模型的过程中,我们会遇到非常多不同层面的问题,所以我们需要很多领域的知识去解决这些问题。

    • 我们需要管理被操作的数据,因为数据与数据之前是相互有关联的。将数据结构化,通常是编程的第一步。关于结构化数据的相关理论以及实践,需要有一个专门的学科分支或者说课题去研究——数据结构
    • 我们需要解决一个具体的问题,这个具体的问题如何一步步去解决,过程是怎么样子的——算法
    • 我们需要将解决方案进行自动化,并以代码的形式进行交付——编程语言
    • 如果将一个抽象的模型进行编码实现,如何实现“这个功能”,如何实现“那个功能”——编程技巧
    • 问题的规模大了,众多代码糅合在一起,连程序员自己都看不懂了!怎么来拆分、模块化这些代码——设计
    • 代码量已经到了一个人无法完成的地步了,需要团队分工合作才能完成了——工程化
    • 你写的代码我看不懂,没法调用或者很难调用,我写的代码你也看不懂,或者很难看懂。还怎么愉快的玩耍——编码风格/编码规范
    • 问题的规模继续扩大,到了系统工程的规模了,之前学的套路已经不管用了!怎么来构建这个系统才能实现正确、安全、高性能、高可用——架构

    然而这些也只是一个系统工程中的冰山一角!这是一个庞大的体系。也正是因为软件开发需要考虑到的问题太多且团队成员水品参差不齐,所以团队开发中并不是每个程序员做的事情都是一样的。每个人都有自己的角色、初级工程师、中级工程师、高级工程师、架构师、CTO。。。

    所以编程不仅仅只是堆砌代码!

    说到这里,我想起来了一件事情——为啥业界普遍鄙视培训出来半道出家的新人?人与人的区别是很大的!我见过培训出来也很牛的。其实,说到底,被鄙视的并不是所有人。而是那些培训了几个月之后发现随便找个工作也能拿“高薪”然后还自认为编程很简单的新人。因为这种经历给了他们一种错觉——编程如此简单,我培训几个月也会嘛!有点像刚学会开车的新司机,很嚣张的对老司机说“开车很简单嘛!你看我也会啊!”。语言和开发工具只是招式,这是外功。而编程思想、经验是内功。这些内功并不是靠短短几个月的培训能够掌握的,这一点有点像中国制造业和日本制造业的区别。动不动赶英超美可不好。。。

    编程并不简单!这是一件很严肃的事情。不过今天,我没有办法介绍完所有的方面!或者说,到今天为止,我也并没能掌握所有领域的知识。所以今天我只是分享一些关于编码本身的一些经验。

    另外,本文主要分享如何写代码,并不是如何用Java写代码。所以文章中各种语言都有可能出现。

    编码风格

    先来一个圈内的段子。
    大部分程序员在工作中都很讨厌这四件事情:

    1. 写注释
    2. 写文档
    3. 别人不写注释
    4. 别人不写文档

    o(∩_∩)o 哈哈。。中枪了没!

    这个段子其实反映出来一个问题,即大部分代码都需要通过大量注释和文档来说明才能将意图传达给维护这些代码的程序员!然而,就像上面的段子说的那样,写大量的注释和文档其实是一件很麻烦的事情。所以很多时候,由于嫌麻烦,注释和文档就没写,导致维护代码的人相当的痛苦。这个苦同学们肯定都是体会过的!相当于给你个精密仪器要你维护还不给说明书。

    其实,打破上面那个段子描述的那个怪圈的一个很有效的手段就是统一编码风格。优秀的代码可以实现代码即注释,代码本身就可以非常清晰的体现出它的意图来,让别人可以很容易读懂。这就是所谓的可读性!

    命名

    计算机科学领域中最难的两件事是命名和缓存失效!命名并不简单,很复杂。好的名字可以见名知意,非常容易理解。之所以说命名难是因为命名的过程同时也是概念提取的过程!对问题建立模型,需要提取概念并赋予其“术语”。这个过程其实是“万里长征”中最难的一步。毕竟,设计也好,架构也罢,都有成熟的套路可以参考。唯独这个过程,是需要程序设计者自己进行充分的思考的创造性工作!

    以下是总结出来的一些命名经验:

    • 一个类是某物、某事、某人的抽象,是数据与行为的集合体。这恰好符合名词的定义,因此 类名 是一个名词!
    • 方法名 或者说 函数名 是某操作或者某过程的抽象,是一个动作。这恰好符合动词的定义,因此函数名通常是一个动词。
    • 变量名宁可长一些说明清楚用途也不要用abc之类的无意义的名称,除非是循环计数器中用ijk等约定俗成的一些变量名。比如pageIndexpageSize就要比取名成is好!取成这种和用混淆器混淆过后的代码一样的名称没有什么好处,如果算法比较复杂的话,过一段时间恐怕自己都会看不懂。
    • 变量名最好包含变量本身的业务含义。比如List<Student> studentList = new ArrayList<>();就比List<Student> list = new ArrayList<>();好很多。如果同一段代码里再出现一个List<Teacher>的话,这样就可以很方便的取名为teacherList或者teachers而不是list1list2这样的毫无意义的名称!

    英文不好怎么办

    这个问题怎么说呢。。
    作为一名程序员吧,基础的英文还是要懂的。要不然发展也容易遇到天花板,学不好编程的。毕竟,最新的技术、解决方案、工具都是从国外传过来的。如果是解决一些基础性的问题,每天只做做CRUD,好像英文确实不怎么用得上。但是一旦遇到一些实质性问题,恐怕只能到英文网站上找喽!ㄟ(▔ ,▔)ㄏ 不要跟我说你编程可以不需要Stack Overflowcopying and pasting from stackoverflow 可是终极编程大法!o(∩_∩)o 这句话可是编程的真谛啊!(如果你看不懂这个梗那你有可能是伪程序员)

    其实,话说回来,实在不方便用英文的时候,我认为也可以用拼音命名。这个问题上可以务实一点,量力而行。但是,拼音和英语混用的做法就不太好了。最好别这样!逼格不高。

    注释

    怎么添加代码注释

    关于注释,我们需要解决的第一个问题是如何添加代码注释。

    对于Java、C#之类的语言,有专用的文档注释语法,很好处理。对于C/C++,则按约定的格式说明一下类和函数、代码片段的作用和意图即可,至少编译器会进行静态检查。在Python中,有更牛逼的文档字符串这样的语言级特性支持,看注释用help()很方便。不过对于Lua这样的弱类型解释型语言,注释就比较难处理了。这里以Lua为例给出一种注释的解决方案。

    借用Java语言文档注释的风格。

    文件注释,或者说类/模块注释。

    --[[
        Object-oriented helper functions for Lua
        @author: Elvin Zeng
        @date: 2017-8-21
    --]]

    函数注释

    --[[
        create a class with specified super class.
        if number of parameters is zero, derived class will extends from {}.
        @param superClass super class of target class
        @return derived class
    --]]
    local function createClass(superClass)
        local derivedClass = {}
    
        --  省略一堆代码
    
        return derivedClass
    end
    --[[
        register a new account
        @param user
          {
            username = "username",
            password = "password"
          }
        @return registered user
    --]]
    local function register(user)
    
    end

    tips: Lua中可以通过metatable机制实现类和继承,这一点与Javascript通过原型机制来实现类和继承有点类似。

    注释里该写些什么

    我们首先来看个反例。

    /**
     * 查询
     */
    public List<Article> queryPage(int pageSize, int pageIndex) throws PageIndexOutOfBoundsException {
        //  定义一个整型变量
        int offset;
    
        //  省略一堆代码
    }

    首先这个方法名本身就取得不好,这个暂且不说,先说注释问题。这里的注释犯了几个错:

    1. 方法注释为“查询”,这简直就是废话!方法名已经告诉别人这是查询方法了,还在这个注释里写这两个字有什么意义呢?而且到底查询些什么这里也没说!
    2. 参数没有注释。没有描述每一个参数的意义以及取值范围等!
    3. 什么情况下会抛出PageIndexOutOfBoundsException没有描述清楚。
    4. “定义一个整型变量”这种垃圾注释就不要写了,这么简单的语句谁看不懂啊!如果要注释,也是写上这个变量的含义。

    这里我们先不考虑设计问题(分页索引号最好做成可以自己调整成合理值),下面再来看改善注释之后的代码。

    /**
     * 列出指定分页的文章
     * @param pageSize 分页大小。如果等于0则表示查询出所有文章。
     * @param pageIndex 分页索引号。必须为一个大于0的整数,第一页索引为1。
     * @return 指定分页的文章列表
     * @throws PageIndexOutOfBoundsException 当分页索引号超出正常范围时抛出,即pageIndex小于0或大于最大页索引时。
     */
    public List<Article> listArticle(int pageSize, int pageIndex) throws PageIndexOutOfBoundsException{
        //  第一条文章记录在MySql数据库中的偏移量
        int offset;
    
        //  省略一堆代码
    }

    改完之后的注释有没有感觉信息更全很多!虽然说代码本身就是最好的注释,但是必要的注释还是得写上去,毕竟调用的时候别人没法猜测你的索引号到底从0还是从1开始。另外,如果函数内算法比较复杂,可以在代码块内注释,也可以在函数注释上直接写清楚这个函数内部的大概算法/逻辑。代码写出来就是给别人调用的,如果没有基本的注释信息,那么每次调用你的代码的时候,都得去看一下你的函数内具体逻辑才能知道怎么调用。这显然是非常低效的!

    命名与注释这两个基本方面没做好的话,会影响到整个团队的运作。也就是说,你封装的东西并没有给队友节省什么时间,别人用到你的代码的时候,又需要花上一些时间去读你的代码。如果团队里每个人都这样,那整个团队都会极其低效。我个人是非常不愿意与这种代码风格恶劣的人合作的。

    参考规范

    关于编码风格的问题,本文只说命名和注释这两个方面。关于缩进、空格、断行、空行等其他方面的问题,可以参考本节给出的参考规范。

    不同的企业会有不同的编码规范,所以这里没有办法给出一个符合所有公司的规范。不过制定自己团队的规范的时候,可以参考一些大企业的做法。以下是世界上最大的互联网公司谷歌的编码规范,同学们可以参考这个。

    异常处理

    异常与返回值有什么不同

    在C语言中,我们的函数通常会返回一个整型值作为状态码用于通知客户端调用的结果。比如0表示成功,非0表示失败。并且可以通过不同的数值来表示不同原因导致的失败。然而在Java、C#、C++一类面向对象语言中,一般不会用返回值来表示状态。返回值一般用于表示返回的业务值,而异常用于通知客户端程序运行状态改变了。

    什么时候需要抛出异常

    关于这个问题,我想到了一句极其精炼的话:当函数无法完成宣称的任务的时候抛出异常!
    比如上面的那个日子,当listArticle方法由于种种原因无法查询出文章列表的时候,则抛出异常。

    抛出异常在这种场景下是非常有必要的,因为这样其他人调用你的代码时可以非常放心的去调用,只要调用了你的方法,就会返回文章列表。如果无法返回文章列表,则会抛出异常。完全不用在调用这个函数的时候去怀疑是否执行成功了。

    再来一句至理名言:

    宁愿终止程序也不要带错运行下去。

    也就是说,遇到错误的时候,宁愿抛出异常终止程序,也不要带着错运行下去。这是在掩耳盗铃!

    异常需要携带什么信息

    首先,异常的类型本身会带有异常种类信息。其次,异常的message属性可以带上更详细一些的信息。这里需要注意,千万不要像下面这么做。

    throw new PageIndexOutOfBoundsException("失败!");

    抛出异常了肯定是执行失败了呀!带上这种信息有什么用,不是带了一句废话嘛!
    应该是下面这样

    throw new PageIndexOutOfBoundsException("参数分页索引号pageIndex不能大于分页总数");

    此外,异常堆栈也会携带很多信息。

    日志

    谈到日志,首先要搞清楚一个问题,日志是干嘛用的?
    用来记录运行时的错误信息啊!
    是啊。好像大家都知道日志是干什么用的,但是为什么写起代码来就会忘记初衷呢!
    来看看代码:

    /**
     * 异步发送通知邮件。
     * @param templateFile 邮件模板文件路径,相对于classpath。
     * @param modelMap 模型对象
     */
    public void sendEmail(String templateFile, Map<String, String> modelMap){
        //  这里省略一些代码
        System.out.println("1");
        //  这里省略一些代码
        System.out.println("2");
        //  这里省略一些代码
    }

    这里的代码是什么意思呢?程序员们应该都能明白的!很显然,这位程序员是想借助这些标记来调试,想知道代码到底执行到哪一行了。但是,这里很明显地犯了两个错。

    1. 为什么是System.out.println("");而不是logger.debug("");?
    2. 为什么是12而不是一些更明确的文字信息呢?

    在这里,合理的方式是下面这样。

    /**
     * 异步发送通知邮件。
     * @param templateFile 邮件模板文件路径,相对于classpath。
     * @param modelMap 模型对象
     * @throws ServiceException 当邮件模板文件不存在或者modelMap中缺少必须的字段。
     */
     public void sendEmail(String templateFile, Map<String, String> modelMap) throws ServiceException{
         //  这里省略一些代码
         if (isTemplateExists){
             logger.debug("模板文件存在");
             //  这里省略一些代码
             logger.debug("邮件发送任务成功入队。任务id:" + taskId);
             //  这里省略一些代码
         }else{
             logger.error("指定的模板文件[" + templateFile + "]不存在,邮件发送失败。");
             //  抛出异常
         }
     }

    我想给正在犯上面的错的同学提个醒:

    1. 使用日志框架,并用合适的级别输出日志非常重要。
      好多程序员从来不负责也不参与运维相关的工作,甚至是做了好几年的Web都从来没有自己发布过网站。所以压根没有后期维护的意识!
      如果没有这些日志,当项目上线之后,运维的背锅侠兄弟发现网站挂了之后只能直接重启,然后当作什么也没看到。因为没有排错的线索。

    2. 输出有效信息。
      不要去输出一些像123成功失败hello这样的毫无意义的日志,要输出logger.debug("邮件发送任务成功入队。任务id:" + taskId);这样的有效信息。
      也许当时你调试的时候,在你看来这些奇怪的字符串是有意义的,但是在其他人看来,这些就是天书。运维的背锅侠会提刀过来砍你的!另外像"-------开始执行--------"这种对运行期间定位问题没有半点好处的日志就不要输出了!自己用可以,提交代码前一定要删掉。

    3. 日志中带上上下文信息。
      孤立的一句错误日志通常没有什么实际作用。比如上面的例子中,如果在找不到指定的模板文件的时候未将发送邮件时指定的模板文件名输出,那么排错的时候无法知道到底是少了哪个模板文件。

    4. 不要在日志中输出用户的敏感信息。
      千万不要在日志中输出像用户密码、邮件内容之类的涉及用户隐私的敏感信息,也不要去输出像验证码的值之类的敏感信息。

    参数校验

    在你对外公开的方法前先插入一些检查参数的代码,以确保方法被“正确的姿势”调用。比如:

    /**
     * 列出指定分页的文章
     * @param pageSize 分页大小。如果等于0则表示查询出所有文章。
     * @param pageIndex 分页索引号。必须为一个大于0的整数,第一页索引为1。
     * @return 指定分页的文章列表
     * @throws PageIndexOutOfBoundsException 当分页索引号超出正常范围时抛出,即pageIndex小于0或大于最大页索引时。
     */
    public List<Article> listArticle(int pageSize, int pageIndex) throws PageIndexOutOfBoundsException{
        if (pageSize < 0){
            throw new IllegalArgumentException("pageSize不能小于0");
        }
        if (pageIndex < 1){
            throw new IllegalArgumentException("pageIndex不能小于1");
        }
    
        //  第一条文章记录在MySql数据库中的偏移量
        int offset;
    
        throw new PageIndexOutOfBoundsException("");
    
        //  省略一堆代码
    }

    参数校验的作用

    如果在对外公开的重要方法开始的位置不插入校验参数的代码,有时恐怕方法需要运行到方法内部比较深的位置才会抛出一个异常来。而且那种情况下,抛出的异常可能就会有各种各样的了。比如空指针、除零异常等。
    这种情况下,很难一眼看出引发这个异常的根源是参数传错了。需要对你的代码进行一番调试才行!如果一开始就在代码的入口插入了校验参数的代码,那么调用的时候,一眼就能看出来是参数传错了导致了一个异常。这样其他程序员看到这个异常之后就会去看一下你的方法注释。他一看,哦!原来分页索引号是从1开始计数的,那么这个问题就会就此打住,给团队节省了时间。

    参数校验问题是会影响团队运行效率的一个很关键的因素。所以,请同学们重视起这个问题来。我们都是工程师,团队作战的,自己写代码快不叫快,整个团队快起来才叫真的快!用好断言,可以让你的代码更健壮。

    tips: Java中默认断言是不开启的,所以建议无视Java语言的断言,自己处理。

    什么时候需要进行参数校验

    我认为一个方法或者函数在满足以下条件时有必要进行参数校验:

    1. 方法或者函数是对外公开的,不是私有的。
    2. 参数有可能为空指针的时候。
    3. 参数的合理值无法通过方法名、参数名、参数类型一眼看出来的时候!比如上面那个pageIndex是从1开始计数的,但别人并不知道你是从1开始计数的。

    如果对每一方法都进行校验的话,其实挺麻烦的。程序员的时间是很宝贵的,没这么多闲工夫。不过在满足上面条件的情况下,最好还是校验一下。因为做了这个校验,你自己是会稍微浪费几分钟的时间,不过从团队整体来看,总的调试损耗的时间却降下来了。要记住方法/函数写出来就是给别人调用的!

    参数校验需要做到什么程度

    我有一个标准,就是把自己当成调用这些代码的那个人,把自己想象成有可能以任何“姿势”调用的菜鸟(实际上也有可能是不了解你的代码的大牛)。如果这个时候自己也有可能会犯某些错(比如没注意边界值,没注意是否可空),那么这个时候是必须要做校验的。对于一些已经在其他层做过处理不太可能有错误的值的情况,可以不做校验。比如你的UserService中有一个签名为public void register(User user)的方法,用于注册一个用户。这种情况下,可以只校验一下user参数是否为空,而不用对userusernamepassword属性进行校验(用户名密码长度是否合法等)。因为你在上一层控制器层模型绑定的时候已经做过非常严谨的校验了。当然,这里如果你有充足的时间,也可以校验一下。具体做到什么程度,还需要你根据情况去自己把握。

    展开全文
  • 没用过这些IDEA插件?怪不得写代码头疼

    万次阅读 多人点赞 2020-03-13 09:57:06
    1、Background Image Plus 默认IDEA的背景一般都比较单调,要么白乎乎,要么褐乎乎,而Background Image Plus这个插件可以为IDEA设置自定义图片作为背景,而且还可以设置透明度,从此写代码乐趣十足! 背景图设置...

    image


    小伙伴们,大家好。

    今天准备和大家一起分享一下实际工作中常用的几款能提升幸福感和工作效率的IDEA插件吧,也欢迎小伙伴们在评论区安利出你们用过的觉得非常不错的插件,大家一起交流进步。


    1、Background Image Plus

    默认IDEA的背景一般都比较单调,要么白乎乎,要么褐乎乎,而Background Image Plus这个插件可以为IDEA设置自定义图片作为背景,而且还可以设置透明度,从此写代码乐趣十足!

    image

    背景图设置效果如下:

    image


    2、CodeGlance

    CodeGlance是一款非常好用的代码地图插件,可以在代码编辑区的右侧生成一个竖向可拖动的代码缩略区,可以快速定位代码的同时,并且提供放大镜功能

    右侧代码缩略图效果:

    image

    放大镜效果:

    image


    3、Translation

    代码中经常遇到不认识的英文单词或者句子,很蒙蔽怎么办?

    Translation是一款非常好用的翻译插件,可以随时随地翻译单词、甚至一段话,从此不再需要额外打开浏览器搜索翻译网站了!

    image

    翻译逐个单词:

    image

    翻译一段话:

    image


    4、Rainbow Brackets

    在代码非常复杂时,各种俄罗斯套娃式的括号简直让人心碎,Rainbow Brackets则是一款可以对成对括号进行着色的插件,顾名思义“彩虹色的括号”,从此复杂代码一眼即可看穿!

    装完插件,括号都被染上了彩虹的颜色:

    image

    image


    5、Grep Console

    默认情况下,IDEA控制台窗口在打印日志时都是一种颜色到底,比如各种info,warn,和error等类型的日志信息交织在一起,不好分辨。

    Grep Console插件则可以帮助我们自定义设置不用日志用不同的颜色进行标识,非常方便观看!

    设置自定义颜色:

    image

    着色后的日志打印效果:

    image


    6、Statistic

    程序员天天闷头做项目、写代码!

    • 你知道你项目到底有多少行代码吗?
    • 你知道项目代码里有多少是实际代码?
    • 有多少是空行?
    • 有多少是注释吗?
    • . . .

    Statistic则是一款可以做项目全局代码统计信息的小插件:

    image


    7、Markdown Navigator

    很多人私信问说,你是用什么markdown编辑器写博客的呢?不瞒你说,用IDEA就可以很愉快的写博客了,装了一个Markdown Navigator插件即可方便的实现:

    image


    8、RestfulToolkit

    • 你知道你项目里到底写了多少个URL接口吗?
    • 如何快速定位某个URL接口对应的Controller代码?
    • 如何快速测试你的Controller接口?

    RestfulToolkit则是一个可以解决上述问题的,非常方便的IDEA集成插件,从此Postman怕是要下岗了:

    image


    9、GsonFormat

    给你一段Json格式数据,除了手写之外,如何快速生成一个和该Json数据对应的Java对象?

    比如一段Json格式数据如下:

    {
        "status": 0,
        "msg": "操作成功",
        "data": 1
    }
    

    GsonFormat则是一个JSON格式数据 → 对象的快速代码自动生成插件。

    image

    image

    image


    10、MyBatis Log Plugin

    Mybatisxml文件中的SQL语句都是拼装起来的,但有时候(比如在调试的时候)想把某个请求对应的后台具体SQL查询语句单独拿出来测试或验证,该怎么办呢?

    MyBatis Log Plugin这个插件既可以帮你完美地解决这个问题:

    image


    11、Free Mybatis plugin

    除了全局搜索以外,如何方便地在Mybatismapper Java接口方法和mapper XML文件之间来回切换?

    Free Mybatis plugin插件此时就可以大显身手了:

    image

    image


    12、Lombok

    Lombok插件应该不用多说了吧,之前专门写过一篇文章《Lombok,嗯,真香香香香!》讲述过该插件的使用方式,相信有了它,从此代码5分钟,划水2小时不是梦!


    展开全文
  • 写代码:程序员最重要的技能 [英文版]

    千次阅读 多人点赞 2019-05-27 23:30:07
    作为一个程序员,写代码是你工作中最重要的部分。在你的编程生涯中,你需要跟各种各样的代码需求打交道。每次需求都会迫使你做出艰难的决定。这都没有问题。作为一个程序员,这是所有人对你的期待:写代码。然而,...
  • 适合写代码的字体

    2012-09-27 09:08:49
    一套很不错的适合写代码的字体,英文和中文的对齐都很优秀,而且看起来也比较美观,很适合码字一族
  • 写代码的常识.pdf

    2020-10-05 07:35:27
    写代码的常识 一 C++ 1 注意中英文切换下的符号 1.1 中文下的引号和英文的不同 Shift 的切换变得至关重要一般这将会 致使你在 C++程序运行时报错注意观察报错在第几行然后好好检查 1.2 中英文格式下也会不同每种...
  • 写代码的方法

    2013-09-05 15:32:05
     我觉得代码都是有规律的掌握了思路,写代码没那么难,而且还要掌握各种的英语,这是个很重要的事情,我应该 努力的补回以前拉下的了,要对写代码产生兴趣,要做到一日不写代码,一天睡不好觉的功力啊。好好写吧,...
  • 究竟怎样写代码才算是好代码

    万次阅读 多人点赞 2016-09-21 16:05:06
    今天让我们来谈谈代码吧。代码重要吗?当然,代码就是设计(Jack W.Reeves, 1992);...看下面这段英文解释: ‘Good code’ is code that works, is bug free, and is readable and maintainable. Some
  • 20万行代码写完,毕业了找一份工作不是问题! 刚一毕业因为找不到工作,就得报名去参加Java培训的大有人在。并不是说参加培训就不好,只不过以你现在这个毕业的时间点参加,就会显得特别匆忙。因为你的压力既来自于...
  • 为什么中国的程序员喜欢用英文写代码,甚至注释也用英文? 1.因为英语是国际通用的,用英语方便各国程序员. 2.因为英文才专业 3.因为语句只能用英文 4.因为变量名用英文方便外国同行看代码 5.因为英文注释可以显得很...
  • 谈写脚本、写代码和编程三者的区别

    万次阅读 多人点赞 2018-07-23 22:56:44
    谈写脚本、写代码和编程三者的区别
  • 一、写代码要写注释 “写代码要写注释”自从学编程,这就话就伴随着你。可见注释的重要性。 注释的作用: 说明函数的功能 说明函数参数的意思 说明函数这样设计的原理(计算公式) 说明函数的使用场景 作者和日期 ...
  • 前端开发写代码哪个软件更好用?

    千次阅读 多人点赞 2019-11-13 10:59:52
    群里的朋友,经常问到web前端开发写代码用那个软件好?今天在这里统一回答下,主流的web前端开发写代码的软件有这些Webstorm、Vscode、Sublime Text、HBuilder、Dreamweaver、notepad++、editplus等,做前端这么多年...
  • 软件开发的一个最基本的事实是写代码,但是最大的误区之一就是把写代码当做工作。当我作为一个程序员第一次参加工作的时候,就犯了这样的错误。老实说,写代码真的是一件特有意思的事,它的强大功能,它的多种作用...
  • 写代码必须要规范!!写代码必须要规范!!写代码必须要规范!!重要的事说三遍不然真的让后人太累了!!! 1.在开展一个项目之前要先沟通,沟通,沟通,重要的事情说三遍!沟通交流好具体要实现什么,具体要怎么做...
  • 天天都在python,你的破代码,别人能看懂吗?

    万次阅读 多人点赞 2021-07-02 15:44:40
    注释 对某些重要的代码块的功能说明,应使用单行注释 对整个模块功能的说明应使用多行注释 对类或函数的功能及使用方法的详细说明应使用文档字符串 python的注释尽量使用英文 【求评论、求点赞、求收藏】 
  • so easy! 10行代码写个"狗屁不通"文章生成器

    万次阅读 多人点赞 2019-11-20 17:35:00
    前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 ...背后实现代码一定很复杂吧,里面...当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不中文变量名的, 中文...
  • 代码整洁 vs 代码肮脏

    万次阅读 多人点赞 2019-09-16 12:05:12
    出整洁的代码,是每个程序员的追求。《clean code》指出,要想出好的代码,首先得知道什么是肮脏代码、什么是整洁代码;然后通过大量的刻意练习,才能真正出整洁的代码。 WTF/min是衡量代码质量的唯一标准,...
  • 软件开发的一个最基本的事实是写代码,但是最大的误区之一就是把写代码当做工作。当我作为一个程序员第一次参加工作的时候,就犯了这样的错误。老实说,写代码真的是一件特有意思的事,它的强大功能,它的多种作用...
  • 软件公司里面的经理几乎都是从做程序员写代码开始,然后逐渐升级到管理职位。程序员,每天大部分时间写代码;经理们,每天大部分时间写邮件,和其他部门沟通协调,为团队争取项目。看似经理们的工作就是每天就写写...
  • 给女朋友做个聊天机器人,这样就能安心写代码

    万次阅读 多人点赞 2019-06-11 16:15:43
    这是第 404 次女友因为我没有及时回微信而和我生气了 惹祸的是我,受伤的确是...最重要的是,因为没有回微信,我终于可以安心写代码 两耳不闻窗外事,一心只想写代码,这才是一名程序员的内心独白 作为程序员中的...
  • 最合适写代码的字体

    千次阅读 2015-01-27 15:05:12
    最合适写代码的字体 每天盯着屏幕写代码,自然需要寻找一种看得舒服的字体,能让自己的代码赏心悦目,一般来说,我们选择用于显示代码的字体,有如下几个要求: 字母的宽度一致 或称为等宽字体...
  • Delphi的中英文翻译程序源代码,好像调用的网址失效了,现在无法翻译了,这个程序和网络有关,同时实现对字符的控制,面向初学者。下面是核心的代码:  procedure TForm1.BitBtn4Click(Sender: TObject);  var ...
  • 代码规范、如何出好代码

    万次阅读 2016-08-08 15:41:14
    代码规范、如何出好代码 上大学以来,每当看到好的文章,第一反应都是使用浏览器的收藏功能,收藏下来,久而久之,收藏的网址越来越多。虽然浏览器收藏夹也有文件夹的功能可以分门别类,但是终究没有博客的Tag...
  • Xcode8写代码闪退

    千次阅读 2016-10-08 10:06:38
    #升级Xcode8 以后,一输入代码,Xcode 闪退问题 解决方法: 1、这个问题是由插件KSImageName,引起的。...比如:能输入中文,不能输入英文等。都可以通过删代码解决。 补充:KSImageName插件的位置 ~/Library
  • 2007年图书:代码工匠,出卓越代码的实践 代码 高清晰pdf 英文原版 电子书

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 504,196
精华内容 201,678
关键字:

写代码英文