首页 文章 精选 留言 我的

精选列表

搜索[质量保障],共10000篇文章
优秀的个人博客,低调大师

基于Win10极简SonarQube C#代码质量分析

博客有些好些时间未更新了,这几个月的时间里,离开了实习的公司、大学毕了业、来了新公司、转了户口,有点忙,最近总算稍微闲下来了,打算重新拾起博客,坚持写下去。 言归正转,什么是SonarQube ? SonarQube(曾用名Sonar(声纳))是一个优秀的开源代码分析系统管理系统,支持超过25+种编程语言,对.Net Core当然也是支持的。 最近公司做的项目是用的Framework开发的,久仰SonarQube大名,今天在本地搭建SonarQube之后对项目进行分析,效果惊人。揪出了系统中潜藏的若干Bug,功不可没,所以在这里搭建的方法分享给大家,希望对大家有所帮助。 在网上找一些资料,关于Sonar的介绍在Linux平台下较多,所以我下面的介绍主要是基于Win平台的,其他平台大同小异。 安装Sonar主要有以下几步: 安装JAVA SDK Sonar是一款基于JAVA开发的工具,安装JAVA SDK的过程在此不再叙述,建议安装好之后配置好JAVA_HOME的环境变量,以下是下载地址。 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装SonarQube 首先到官网下载安装包,值得注意的是,该安装包是不分平台的,下载下来之后,选择Windows的文件夹中StartSonar.bat文件运行即可。 https://www.sonarqube.org/#downloads 如果java环境安装正常,Sonar应该是能正常启动的,启动后浏览。启动效果如下: 刚刚装好是英文的,我是安装了中文包,如何安装中文包,后面会叙述。 配置Sonar 我们需要对Sonar进行简单配置,使其能连接上MySQL数据库。 打开MySQL数据库,执行以下指令。 CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER 'sonar' IDENTIFIED BY 'sonar'; GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar'; GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar'; FLUSH PRIVILEGES; 该操作是为Sonar创建数据库并添加该数据库的用户,数据库名称是sonar ,用户名是sonar,密码是sonar。 打开sonar.properties将内容替换成如下: sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false 其中sonar.jbc.url是mysql数据库的连接字符串。 重新启动Sonar(关闭运行startsonar.bat控制台,并在任务管理器中关闭所有和java有关的进程,重新运行startsonor.bat),使用管理员账户登录(admin/admin)。 登录之后,安装中文包,如下,安装之后需要点击重新启动,启动之后,Sonar就变成中文的了。 Sonar-Scanner for MSBuild安装与配置 下载并解压SonarQube Scanner for MSBuild,它是C# Framework的分析插件。 https://github.com/SonarSource/sonar-scanner-msbuild/releases/download/4.3.1.1372/sonar-scanner-msbuild-4.3.1.1372-net46.zip 解压之后,设置SonarQube Scanner for MSBuild的环境变量,如我的解压路径是:C:\MyWorkSpace\Tools\sonar-scanner-msbuild-4.3.1.1372-net46,则把该路径添加到path下: 修改SonarQube.Analysis.xml文件 要修改的地方只是关于sonarQube服务器的一些配置,关于服务器URL、USER、PASSWORD等,修改如下: <?xml version="1.0" encoding="utf-8" ?> <!-- This file defines properties which would be understood by the SonarQube Scanner for MSBuild, if not overridden (see below) By default the SonarScanner.MSBuild.exe picks-up a file named SonarQube.Analysis.xml in the folder it is located (if it exists). It is possible to use another properties file by using the /s:filePath.xml flag The overriding strategy of property values is the following: - A project-specific property defined in the MSBuild *.*proj file (corresponding to a SonarQube module) can override: - A property defined in the command line (/d:propertyName=value) has which can override: - A property defined in the SonarQube.Analysis.xml configuration file [this file] which can override: - A property defined in the SonarQube User Interface at project level which can override: - A property defined in the SonarQube User Interface at global level which can't override anything. Note that the following properties cannot be set through an MSBuild project file or an SonarQube.Analysis.xml file: sonar.projectName, sonar.projectKey, sonar.projectVersion The following flags need to be used to set their value: /n:[SonarQube Project Name] /k:[SonarQube Project Key] /v:[SonarQube Project Version] --> <SonarQubeAnalysisProperties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.sonarsource.com/msbuild/integration/2015/1"> <Property Name="sonar.host.url">http://localhost:9000</Property> <Property Name="sonar.login">admin</Property> <Property Name="sonar.password">admin</Property> <!-- Required only for versions of SonarQube prior to 5.2 --> <Property Name="sonar.jdbc.url">jdbc:mysql://localhost:3306/sonar?useUnicode=true;characterEncoding=utf8;rewriteBatchedStatements=true;useConfigs=maxPerformance;useSSL=false</Property> <Property Name="sonar.jdbc.username">sonar</Property> <Property Name="sonar.jdbc.password">sonar</Property> </SonarQubeAnalysisProperties> 接下来,重要的一步,找到你电脑中的MSBuild.exe并添加到path环境变量,便于后面在命令行中调用MSBuild,我的是在vs 2017的安装目录下 C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\amd64 C# 项目分析 CMD进入C#项目所在的根目录,依此执行以下三条命令。 MSBuild.SonarQube.Runner.exe begin /k:"xxh.xzc.api" /n:"xhh.xzc.api" /v:"1.0" MSBuild.exe /t:Rebuild MSBuild.SonarQube.Runner.exe end 参数说明: /key(简写k):对应projectKey即项目的唯一代码,如两套源代码使用同一个projectKey那扫描的结果将混在一起,所以一个项目需要有一个单独的projectKey /name(简写n):对应projectName即项目的名称,为项目的一个显示的名称,建立使用完整的项目名称 /version(简写v):对应projectVersion即项目的版本,项目在不同的时期版本也是不一样的,如果方便,可以在sonarQube的服务器中查看到不同的版本代码其中问题的变化 三条命令分别是分析的前期准备,MSBuild编译,将报告上传给SonarQube。 查看分析结果 最后,进入http://localhost:9000/projects 查看分析结果吧,惊喜不惊喜? 界面中功能强大,很多认为绝对发现不了的Bug都展现出来了,还可以查看单元测试的覆盖率,相信如果坚持使用该工具,一定会对编码习惯有很大帮助。 快快搭建一个SonarQube看看自己的代码有没有BUG!! 我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。 参考文献:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+MSBuild

优秀的个人博客,低调大师

javascript成神之路(1):如何编写高质量的js代码

一、如何书写可维护性的代码 当出现bug的时候如果你能立马修复它是最好的,此时解决问题的四路在你脑中还是很清晰的。否则,你转移到其他任务或者bug是经过一定的时间才出现的,你忘了那个特定的代码,一段时间后再去查看这些代码就 需要: 1.花时间学习和理解这个问题 2.化时间是了解应该解决的问题代码 还有个问题,特别对于大的项目或是公司,修复bug的这位伙计不是写代码的那个人(且发现bug和修复bug的不是同一个人)。因此,必须降低理解代 码花费的时间,无论是一段时间前你自己写的代码还是团队中的其他成员写的代码。这关系到底线(营业收入)和开发人员的幸福,因为我们更应该去开发新的激动 人心的事物而不是花几小时几天的时间去维护遗留代码。所以创建可维护性代码是至关重要的,一般可维护性的代码有以下几个原则: 可读性 一致性 可预测性 看上去就像同一个人写的 已记录 二、全局变量的问题 全局变量的问题在于,你的JavaScript应用程序和web页面上的所有代码都共享了这些全局变量,他们住在同一个全局命名空间,所以当程序的两个不同部分定义同名但不同作用的全局变量的时候,命名冲突在所难免。web页面包含不是该页面开发者所写的代码也是比较常见的,例如: 第三方的JavaScript库 广告方的脚本代码 第三方用户跟踪和分析脚本代码 不同类型的小组件,标志和按钮 例如说,该第三方脚本定义了一个全局变量,叫做A;接着,在你的函数中也定义一个名为A的全局变量。其结果就是后面的变量覆盖前面的,第三方脚本就一下子失效啦!而且很难debug出来。 因此:尽可能少的使用全局变量是很重要的,例如命名空间模式或是函数立即自动执行,但是要想让全局变量少最重要的还是始终使用var来声明变量。 三、忘记var作用的副作用 隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。具体如下: 通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。 没有通过var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。 所以隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的,具体代码我就不写了。 四、访问全局对象 在浏览器中,全局对象可以通过window属性在代码的任何位置访问(除非你做了些比较出格的事情,像是声明了一个名为window的局部变量)。但是在其他环境下,这个方便的属性可能被叫做其他什么东西(甚至在程序中不可用)。如果你需要在没有硬编码的window标识符下访问全局对象,你可以在任何层级的函数作用域中做如下操作: var global = (function () { return this; }()); 五、for循环 在for循环中,你可以循环取得数组或是数组类似对象的值,譬如arguments和HTMLCollection对象。通常的循环形式如下: // 次佳的循环 for (var i = 0; i < myarray.length; i++) { // 使用myarray[i]做点什么 } 这种形式的循环的不足在于每次循环的时候数组的长度都要去获取下。这回降低你的代码,尤其当myarray不是数组,而是一个HTMLCollection对象的时候。 六、不扩展内置原型 扩增构造函数的prototype属性是个很强大的增加功能的方法,但有时候它太强大了。增加内置的构造函数原型(如Object(), Array(), 或Function())挺诱人的,但是这严重降低了可维护性,因为它让你的代码变得难以预测。使用你代码的其他开发人员很可能更期望使用内置的 JavaScript方法来持续不断地工作,而不是你另加的方法。另外,属性添加到原型中,可能会导致不使用hasOwnProperty属性时在循环中显示出来,这会造成混乱。 七、避免隐式类型转换 JavaScript的变量在比较的时候会隐式类型转换。这就是为什么一些诸如:false == 0 或 “” == 0 返回的结果是true。为避免引起混乱的隐含类型转换,在你比较值和表达式类型的时候始终使用===和!==操作符。 var zero = 0; if (zero === false) { // 不执行,因为zero为0, 而不是false } // 反面示例 if (zero == false) { // 执行了... } 八、避免eval() 如果你现在的代码中使用了eval(),记住该咒语“eval()是魔鬼”。此方法接受任意的字符串,并当作JavaScript代码来处理。当有 问题的代码是事先知道的(不是运行时确定的),没有理由使用eval()。如果代码是在运行时动态生成,有一个更好的方式不使用eval而达到同样的目 标。例如,用方括号表示法来访问动态属性会更好更简单: // 反面示例 var property = "name"; alert(eval("obj." + property)); // 更好的 var property = "name"; alert(obj[property]); 使用eval()也带来了安全隐患,因为被执行的代码(例如从网络来)可能已被篡改。这是个很常见的反面教材,当处理Ajax请求得到的JSON 相应的时候。在这些情况下,最好使用JavaScript内置方法来解析JSON相应,以确保安全和有效。若浏览器不支持JSON.parse(),你可 以使用来自JSON.org的库。 同样重要的是要记住,给setInterval(), setTimeout()和Function()构造函数传递字符串,大部分情况下,与使用eval()是类似的,因此要避免。在幕后,JavaScript仍需要评估和执行你给程序传递的字符串: // 反面示例 setTimeout("myFunc()", 1000); setTimeout("myFunc(1, 2, 3)", 1000); // 更好的 setTimeout(myFunc, 1000); setTimeout(function () { myFunc(1, 2, 3); }, 1000); 使用新的Function()构造就类似于eval(),应小心接近。这可能是一个强大的构造,但往往被误用。如果你绝对必须使用eval(),你 可以考虑使用new Function()代替。有一个小的潜在好处,因为在新Function()中作代码评估是在局部函数作用域中运行,所以代码中任何被评估的通过var 定义的变量都不会自动变成全局变量。另一种方法来阻止自动全局变量是封装eval()调用到一个即时函数中。 考虑下面这个例子,这里仅un作为全局变量污染了命名空间。 console.log(typeof un); // "undefined" console.log(typeof deux); // "undefined" console.log(typeof trois); // "undefined" var jsstring = "var un = 1; console.log(un);"; eval(jsstring); // logs "1" jsstring = "var deux = 2; console.log(deux);"; new Function(jsstring)(); // logs "2" jsstring = "var trois = 3; console.log(trois);"; (function () { eval(jsstring); }()); // logs "3" console.log(typeof un); // number console.log(typeof deux); // "undefined" console.log(typeof trois); // "undefined" 另一间eval()和Function构造不同的是eval()可以干扰作用域链,而Function()更安分守己些。不管你在哪里执行 Function(),它只看到全局作用域。所以其能很好的避免本地变量污染。在下面这个例子中,eval()可以访问和修改它外部作用域中的变量,这是 Function做不来的(注意到使用Function和new Function是相同的)。 (function () { var local = 1; eval("local = 3; console.log(local)"); // logs "3" console.log(local); // logs "3" }()); (function () { var local = 1; Function("console.log(typeof local);")(); // logs undefined 九、编码规范 建立和遵循编码规范是很重要的,这让你的代码保持一致性,可预测,更易于阅读和理解。一个新的开发者加入这个团队可以通读规范,理解其它团队成员书写的代码,更快上手干活。 十、缩进 代码没有缩进基本上就不能读了。唯一糟糕的事情就是不一致的缩进,因为它看上去像是遵循了规范,但是可能一路上伴随着混乱和惊奇。重要的是规范地使用缩进。 十一、注释 你必须注释你的代码,即使不会有其他人向你一样接触它。通常,当你深入研究一个问题,你会很清楚的知道这个代码是干嘛用的,但是,当你一周之后再回来看的时候,想必也要耗掉不少脑细胞去搞明白到底怎么工作的。 很显然,注释不能走极端:每个单独变量或是单独一行。但是,你通常应该记录所有的函数,它们的参数和返回值,或是任何不寻常的技术和方法。要想到注 释可以给你代码未来的阅读者以诸多提示;阅读者需要的是(不要读太多的东西)仅注释和函数属性名来理解你的代码。例如,当你有五六行程序执行特定的任务, 如果你提供了一行代码目的以及为什么在这里的描述的话,阅读者就可以直接跳过这段细节。没有硬性规定注释代码比,代码的某些部分(如正则表达式)可能注释 要比代码多。 十二、花括号{} 花括号(亦称大括号,下同)应总被使用,即使在它们为可选的时候。技术上将,在in或是for中如果语句仅一条,花括号是不需要的,但是你还是应该总是使用它们,这会让代码更有持续性和易于更新。 原文发布时间:2018年01月06日 作者:技术金三胖 本文来源:开源中国如需转载请联系原作者

优秀的个人博客,低调大师

iOS-《编写高质量代码》笔记-第五章 实现

建议33:使用类别把类的实现拆分成不同的文件 类别可以访问其继承的类的实例变量,类别的方法具有最高的优先级类别,可以分散到不同的文件中,甚至不同的框架中。 1.利用类别机制,可将同一个类的实现,由一个常规的实现文件.m拆分成多个实现文件.m。 2.把同一个类的实现文件.m拆分成多个实现文件.m,适合类的实现文件大多比较庞大,拆分的标准多是以同类型或同业务来作为参照。 建议34:明智地使用内省可使程序更加高效和健壮 内省是对象揭示自己作为一个运行时对象的详细信息的一种能力。这些详细信息包括对象在继承树上的位置、对象是否遵循特定的协议,以及是否可以响应特定的消息。 建议35:尽量使用不可变性对象而非可变性对象 对象的不可变性可以保证对象在使用时不会被意外的改变。 1.尽量不要把可变对象存储到集合对象中,否则容易导致存储的可变对象被破坏或变成无效。 2.在开销上,可变对象比不可变对象要大,因为可变对象必须动态管理一个可变的辅助存储---在必要的时分配或解除分配内存块,所以比相应的不可变版本效率低。 3.不能确定对象是否可变,则将它当成不可变处理。 建议36:利用复合能巧妙地把两个类或两个对象融合 在OOP编程中有两个技术用于描述类与类或对象与对象之间的关系:一个是继承,另一个是复合。 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。 复合:通过在类中声明一个指向另一个类对象的指针作为实例变量,从而将这两个类进行复合。 在OC中所有对象之间的交互都是通过指针实现的。 建议37:使用类扩展来隐藏实现的细节 类扩展(Extension)作用: 1.能为某个类附加额外的属性、成员变量、方法声明 2.一般的类扩展写到.m文件中 3.一般的私有属性写到类扩展中 建议38:使用内联块应注意避免循环引用 内联:在类内定义的函数被默认成内联函数 块:block 引进弱引用来避免在内联块中直接引用self导致的循环引用。 建议39:利用类别把方法添加到现有的类 类别可以用于声明实例方法或类方法,但通常不适合用类别来声明额外的属性。在类别接口中包括一个属性声明的语法是有效的。但是不能在类别中声明一个额外的实例变量。这意味着,编译器不会合成任何实例变量,也不会将它合成任何属性访问器方法。 建议40:通过强弱引用来管理对象的所有权 http://www.jianshu.com/p/4a1d1921284b

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册