OCLint的部分规则(Convention 部分)

2023-05-16

OCLint的部分规则(Convention 部分)

对OCLint的部分规则进行简单翻译解释,有部分进行了验证以及进一步分析、测试。OCLint其他相关内容如下:

--
OCLint-iOS-OC项目几种简单使用OCLint的部分规则(Basic 部分)
OCLint的部分规则(Unuseed 部分)OCLint的部分规则(Size 部分)
OCLint的部分规则(Redundant 部分)OCLint的部分规则(Naming 部分)
OCLint的部分规则(Migration 部分)OCLint的部分规则(Empty 部分)
OCLint的部分规则(Design 部分)OCLint的部分规则(Convention 部分)
OCLint的部分规则(CoCoa 部分)



1、avoid branching statement as last in loop

      Since:0.7 定义类传送门~点击

Having branching statement as the last statement inside a loop is very confusing, and could largely be forgetting of something and turning into a bug.

简单解释:不要再循环最后加入分支,负责理解起来比较困难,很大程度上会遗忘一些事情,导致一些错误。

    void example() {
        for (int i = 0; i < 10; i++) {
            if (foo(i)) {
                continue;
            }
            break;      // this break is confusing
        }
    }

2、base class destructor should be virtual or protected

      Since:0.10.2 定义类传送门~点击

Make base class destructor public and virtual, or protected and nonvirtual

简单解释:基类的析构函数需要是publicvirtual或者protected``nonvirtual

    class Base {
    public:
        ~Base(); // this should be either protected or virtual
    }
    class C : public Base {
        virtual ~C();
    }

Sutter & Alexandrescu (November 2004). [“C++ Coding Standards: 101 Rules, Guidelines, and Best Practices”(http://gotw.ca/publications/c++cs.htm)]. Addison-Wesley Professional

3、unnecessary default statement in covered switch statement

      Since:0.8 定义类传送门~点击

When a switch statement covers all possible cases, a default label is not needed and should be removed. If the switch is not fully covered, the SwitchStatements Should Have Default rule will report.

简单解释:如果switch覆盖了所有的条件,default是不需要的应该被移除。如果不是default还是需要的。

    typedef enum {
        value1 = 0,
        value2 = 1
    } eValues;
    //
    void aMethod(eValues a)
    {
        switch(a)
        {
            case value1:
                break;
            case value2:
                break;
            default:          // this break is obsolete because all
                break;        // values of variable a are already covered.
        }
    }

4、 ill-placed default label in switch statement

      Since:0.6 定义类传送门~点击

It is very confusing when default label is not the last label in a switch statement.

简单解释:default应该在switch的最后,负责会很难理解。

    void example(int a) {
        switch (a) {
            case 1:
                break;
            default:  // the default case should be last
                break;
            case 2:
                break;
        }
    }

5、destructor of virtual class

      Since:0.8 定义类传送门~点击

This rule enforces the destructor of a virtual class must be virtual.

简单解释:这个规则是虚拟类的析构函数必须是虚拟的。

    class Base { // class Base should have a virtual destructor ~Base()
        public: virtual void f();
    };
    class Child : public Base {
        public: ~Child();  // destructor ~Child() should be virtual
    };

6、inverted logic

      Since:0.4 定义类传送门~点击

An inverted logic is hard to understand.

简单解释:倒置逻辑不易理解。

    int example(int a) {
        int i;
        if (a != 0)             // if (a == 0)
        {                       // {
            i = 1;              //      i = 0;
        }                       // }
        else                    // else
        {                       // {
            i = 0;              //      i = 1;
        }                       // }
        return !i ? -1 : 1;     // return i ? 1 : -1;
    }

PS:在做判断的时候,应该先做的判断,在做的判断。做个一个测试如果只有非的测试是不会有警告的。

    int example(int condition) {
        int temp;
        if (acondition!= 0)            //不会有警告
        {                       
            temp = 1;            
        }                  
    }

7、missing break in switch statement

      Since:0.6 定义类传送门~点击

A switch statement without a break statement has a very large chance to contribute a bug.

简单解释:在switch语句中缺失了break,很有可能引发bug

    void example(int a) {
        switch (a) {
            case 1:
                break;
            case 2:
                // do something
            default:
                break;
        }
    }

8、non case label in switch statement       Since:0.6 定义类传送门~点击

It is very confusing when label becomes part of the switch statement.

简单解释:label出现在switch条件中不易理解。

    void example(int a) {
        switch (a) {
            case 1:
                break;
            label1:     // label in a switch statement in really confusing
                break;
            default:
                break;
        }
    }

9、 ivar assignment outside accessors or init       Since:0.8 定义类传送门~点击

This rule prevents assigning an ivar outside of getters, setters, and init method.

简单解释:检查某些成员的初始化不再getterssetters andinit method中。

    @interface Foo : NSObject {
        int _bar;
    }
    @property (assign, nonatomic) int bar;
    @end
    @implementation Foo
    @synthesize bar = _bar;
    - (void)doSomething {
        _bar = 3; // access _bar outside its getter, setter or init
    }
    @end

PS:简单和小伙伴讨论了下,感觉iOS开发并不是很适合。

10、parameter reassignment       Since:0.6 定义类传送门~点击

Reassigning values to parameters is very problematic in most cases.

简单解释:对参数进行重新赋值,在很多情况下是有问题的。

    void example(int a) {
        if (a < 0) {
            a = 0; // reassign parameter a to 0
        }
    }

PS:简单测试了传值时使用指针,经测试不会有警告。也就是说不会对指针类型的参数做检查。

11、prefer early exits and continue       Since:0.8 定义类传送门~点击

Early exits can reduce the indentation of a block of code, so that reader do not have to remember all the previous decisions, therefore, makes it easier to understand the code.

简单解释:在有退出语句 的时候,应该让退出语句靠前,这样阅读代码使代码可以很好的被理解。

    int *doSomething(int a) {
      if (!foo(a) && bar(a) && doOtherThing(a)) {
        // ... some really long code ....
      }
      return 0;
    }
    // is preferred as
    int *doSomething(int a) {
      if (foo(a)) {
        return 0;
      }
      if (!bar(a)) {
        return 0;
      }
      if (!doOtherThing(a)) {
        return 0;
      }
      // ... some long code ....
    }

12、 missing default in switch statements       Since:0.6 定义类传送门~点击

Switch statements should have a default statement.

简单解释:检查 Switchdefault缺失的情况。

    void example(int a) {
        switch (a) {
            case 1:
                break;
            case 2:
                break;
            // should have a default
        }
    }

13、 too few branches in switch statement       Since:0.6 定义类传送门~点击

To increase code readability, when a switch consists of only a few branches, it’s much better to use an if statement instead.

简单解释:如果switch语句条件很少,可以一用if else 代替。

    void example(int a) {
        switch (a) {
            case 1:
                break;
            default:
                break;
        } // Better to use an if statement and check if variable a equals 1.
    }

Thresholds:
MINIMUM_CASES_IN_SWITCH The reporting threshold for count of case statements in a switch statement, de-
fault value is 3.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OCLint的部分规则(Convention 部分) 的相关文章

  • Decode Ways问题及解法

    问题描述 xff1a A message containing letters from A Z is being encoded to numbers using the following mapping 39 A 39 gt 1 39
  • Android性能优化(一)内存泄露优化(静态变量、单例模式、属性动画)

    内存泄露优化分为两个方面 xff0c 一方面是在开发过程中避免写出有内存泄露的代码 xff0c 另一方面是通过一些分析工具比如 MAT来找出潜在的内存泄露继而解决 一 静态变量导致内存泄露 一般情况下静态变量引用了或者内部持有Activit
  • 图论 —— 图的连通性 —— Tarjan 求强连通分量

    概述 Tarjan 算法是基于对图深度优先搜索的算法 xff0c 每个强连通分量为搜索树中的一棵子树 搜索时 xff0c 把当前搜索树中未处理的节点加入一个堆栈 xff0c 回溯时可以判断栈顶到栈中的节点是否为一个强连通分量 基本思路 定义
  • 开发日记(一)

    这是自己编程第二天 xff0c 自己解决了好几个问题 xff0c 觉得很有成就感 xff0c 决定写下以后开发中遇到的问题 1 在多个Activity中传递数据 xff0c 之前只学过绑定基本的putExtra xff0c 今天上网一搜 x
  • 源程序生成控制流图和du-path

    最近上 源代码分析技术 这个课 xff0c 老师让写一个程序 xff0c 由一段c代码 xff0c 生成生成控制流图和du path xff0c 控制流图不用解释了 xff0c 说一下du path xff0c 这个术语是针对变量来说的 x
  • pandas使用笔记

    DataFrame使用笔记 dates 61 pd date range span class hljs string 39 20160728 39 span periods 61 span class hljs number 6 span
  • keras

    大神笔记 xff0c 转载自http blog csdn net u012162613 article details 45397033 Keras简介 Keras是基于Theano的一个深度学习框架 xff0c 它的设计参考了Torch

随机推荐

  • gensim similarity计算文档相似度

    向量空间模型计算文档集合相似性 0 将原始输入的词转换为ID xff0c 词的id表示法简单易用 xff0c 但是无法预测未登记词 xff0c 难以挖掘词关系 xff1b 词汇鸿沟 1 任意两个词之间是独立的 xff0c 无法通过词的ID来
  • doc2vec计算文档相似度

    doc2vec是基于word2vec的 xff0c word2vec对于计算两个词语的相似度效率比较好 xff0c 修改了word2vec中的cbow和skip gram模型 xff0c paragraph vector直接得到doc向量
  • win10远程登录提示“您的远程桌面会话已结束。另一用户已连接到此远程计算机,因此您的连接已丢失……”

    远程登陆的Windows 10 系统是否没有设置密码 xff1f 没有密码的话设计机制是唤醒自动登陆 xff0c 所以会把远程挤下来 xff0c 设置密码就好了
  • Spring注解

    注解介绍 注解有两个作用 xff1a 标注和注入 标注 xff1a 类路径下自动扫描 xff0c 减少在xml中配置bean 例如 64 Component 64 Service注入 xff1a 自动装配 xff0c 需要类的地方直接加注解
  • akka基础

    基本概念消息传递API 通用API消息传递方式 Future机制Actor生命周期处理状态和错误 监督kill actor生命周期监控和DeathWatch安全重启状态 纵向扩展 Router调度方式使用策略 横向扩展 订阅集群事件启动 退
  • Ubuntu使用root登录系统界面、免密码、添加开机启动

    以下测试环境为Ubuntu 16 04 一 使用root登录系统界面 Ubuntu在命令行模式下 xff0c 是可以登录root的 为了安全 xff0c 在图形界面模式下 xff0c 默认不允许使用root登录系统 可以通过修改50 uni
  • 线程(Thread)的三种等待唤醒机制详解

    1 为什么需要线程的等待和唤醒 线程的等待唤醒机制是一种经典的 生产者和消费者 模型 例如食品加工厂 xff0c 食品加工人员和原料补给人员 xff0c 在有充足原料时 xff0c 补给人员是在等待 xff0c 等到原料不够时 xff0c
  • Linux常用终端命令之cat、grep、echo

    这三个指令 xff0c 每一个都很常用 xff0c 用法也都很多 作为一个linux初学者 xff0c 我还不能很好的掌握三个命令的用法 xff0c 于是先在这篇博客里做一个简单的整理和总结 xff0c 以加深对三个指令的理解 grep 先
  • Python+Pycharm使用opencv

    http blog csdn net whykifan article details 66478421 在这个配置过程中 xff0c 遇到了不少的问题 xff0c 于是就写了这篇博文 xff0c 希望可以帮到遇到相同问题的人 主要步骤 x
  • Linux启动流程rcN.d rcS.d rc.local等

    1 环境 当前系统环境为 xff1a Linux mint mate 17 1 基于ubuntu14 04的衍生版 备注 xff1a etc rc d文件夹中的脚本文件的链接目标为 xff1a etc init d文件夹下的脚本 为系统运行
  • Ubuntu 启用root账户并开启远程登录

    生产环境尽量不要如下操作 生产环境尽量不要如下操作 生产环境尽量不要如下操作 本地虚拟机 xff0c 为了方便 xff0c 直接root远程登录 Ubuntu 20 4 1 启用root账户 sudo passwd root 2 开启远程登
  • datatable中报错 table.XXX is not a function的解决方法

    在datatable中可以通过三种不同的方式为一个或多个表获取一个新的Datatables API实例 xff1a xff08 1 xff09 selector DataTable xff08 2 xff09 selector dataTa
  • 在ubuntu下安装libpcap库

    这两天公司里要我了解一下pcap xff0c 但是还不知道它是干什么的 首先 xff0c 我从网上查到了 xff0c pcap实际上是抓包库 这个抓包库给抓包系统提供了一个高层次的接口 所有网络上的数据包 xff0c 甚至是那些发送给其他主
  • Python 获取当前路径(文件及所在文件夹,正斜线)

    参考博客 xff1a http www cnblogs com wind wang p 5822192 html 更多路径读取请参照上述博客 xff08 使用Python 2 x版本 xff09 xff0c 这里只挑出个人认为最直接 常用的
  • 基于docker搭建mysql,redis,mongo,gitlab,wiki等开发环境

    今天基于docker搭建一整套开发环境 首先安装docker yum y install docker io 使用加速器 xff1a vim etc docker daemon json 添加163的加速地址 xff1a 34 regist
  • Android编译系统分析五:system.img的生成过程

    Android编译系统分析系列文章 xff1a android编译系统分析 xff08 一 xff09 source build envsetup sh与lunch Android编译系统 xff08 二 xff09 mm编译单个模块 an
  • linux学习笔记--Xshell远程登陆linux

    1 登录xshell官网XSHELL NetSarang Website xff0c 输入姓名和邮箱 xff0c 下载免费版的Xshell xff0c 下载链接会发送到邮箱中 下载完成后直接安装即可 2 双击打开安装完成的Xshell xf
  • Apache使用localhost可以访问但使用本机IP(局域网)不能访问

    Apache使用localhost可以访问但使用本机IP 局域网 不能访问 Apache 使用localhost 127 0 0 1 可以访问 xff0c 使用本机IP 局域网 不能访问 xff0c 为什么本机ip地址不能访问localho
  • ubuntu14.04LTS命令行安装xfce4桌面

    安装ubuntu14 04LTS后 xff0c 需要一个桌面 xff0c 因此选择安装xfce4 1 安装 1 1 安装默认版本4 10 sudo apt get install xfce4 1 2 安装版本4 12 1 sudo add
  • OCLint的部分规则(Convention 部分)

    OCLint的部分规则 xff08 Convention 部分 xff09 对OCLint的部分规则进行简单翻译解释 xff0c 有部分进行了验证以及进一步分析 测试 OCLint其他相关内容如下 xff1a OCLint iOS OC项目