美文网首页
OCLINT && 代码规范

OCLINT && 代码规范

作者: coder1003 | 来源:发表于2019-05-26 21:40 被阅读0次
    
    一、安装OClint
    1、到官网下载安装包:oclint-0.13.1-x86_64-darwin-17.4.0.tar.gz
    2、双击解压后,把oclint-0.13.1移到当前用户的根目录下,即/Users/工号
      【或者使用终端控制台】:
      A、进入安装包存放目录:cd 安装包所在目录
      B、解压安装包:tar -xzf oclint-0.13.1-x86_64-darwin-17.4.0.tar.gz -C /Users/工号
      C、查看是否解压成功,即用户根目录是否有oclint-0.13.1目录:ls /Users/工号
    3、修改配置文件的环境变量:
      A、进入当前用户根目录: cd ~
      B、查看配置文件.bash_profile: ls -a
      C、打开文件: vim .bash_profile
      D、使文件进入编辑模式: 按 I 键
      E、在文件顶行输入: export PATH=$PATH:/Users/工号/oclint-0.13.1/bin
      F、退出编辑模式: 按 ESC 键,再按 : 输入wq,最后回车即可。
      G、查看配置文件是否修改成功: cat .bash_profile
      H、使修改的环境变量生效: source .bash_profile
      I、验证oclint是否安装成功: oclint -help
    
    二、安装xcpretty
    1、打开终端控制台
    2、安装xcpretty: sudo gem install xcpretty -n /Users/工号/oclint-0.13.1/bin
    3、验证是否安装成功: xcpretty -help
    
    三、运行脚本
    1、把oclintManager.sh文件拷贝到丰行者的根目录
    2、使用终端控制台修改oclintManager.sh文件的可执行属性。
      A、进入丰行者根目录: cd 丰行者目录
      B、查看是否有oclintManager.sh文件: ls
      C、修改oclintManager.sh的可执行属性: chmod +x oclintManager.sh
      D、执行脚本: ./oclintManager.sh
      E、等待几分钟,脚本执行成功后,浏览器会打开生成的报告文件。
    
    注意:如果运行脚本报xcode版本的错误时,可使用下面的命令: sudo xcode-select —switch /Applications/Xcode.app/Contents/Developer
    
    #!/bin/sh
    
    #  oclintDemo.sh
    #  
    #
    #  Created by 427486 on 2018/6/22.
    #  
    
    
    #工程名称
    projectName="Manager.xcodeproj"
    #编译策略
    schemeName="Manager.Beta"
    #oclint生成的报告类型,可以有html和xcode
    reportType="html"
    
    #检查是否安装 oclint 和 xcpretty
    command -v oclint-json-compilation-database >/dev/null 2>&1 || {
    echo >&2 "没有安装oclint"
    exit
    }
    command -v xcpretty >/dev/null 2>&1 || {
    echo >&2 "没有安装xcpretty"
    exit
    }
    
    #输出配置
    echo "projectName = ${projectName}"
    echo "schemeName = ${schemeName}"
    echo "reportType = ${reportType}"
    
    #清除上次生成的报告
    if [ -f ./oclintReport.html ]
    then
    echo "清除上次生成的报告"
    rm -f oclintReport.html
    fi
    xcodebuild clean
    
    startTime=$(date +%s)
    
    #生成编译数据
    echo "开始生成编译数据"
    xcodebuild -project ${projectName} -scheme ${schemeName} -sdk iphonesimulator -derivedDataPath ./build/derivedData -configuration Debug COMPILER_INDEX_STORE_ENABLE=NO | xcpretty -r json-compilation-database -o compile_commands.json
    if [ -f ./compile_commands.json ]
    then
    echo "生成编译数据完成"
    else
    echo "生居编译数据失败"
    exit
    fi
    
    xcodeBuildTime=$(date +%s)
    
    #排除不需要分析的目录,比如第三方库等,若有多个可这样 " -e Pos -e FMDB -e MJRefresh"
    excludePath=" -e Pods -e FMDB -e MJRefresh"
    echo "排除目录:${excludePath}"
    
    #设定报告配置
    if [ ${reportType} == "html" ]
    then
    reportTypeOption="-report-type html -o oclintReport.html"
    else
    reportTypeOption="-report-type xcode"
    fi
    echo "reportTypeOption = ${reportTypeOption}"
    
    #分析编译数据
    echo "开始分析编译数据"
    oclint-json-compilation-database ${excludePath} -- \
    ${reportTypeOption} \
    -disable-rule ShortVariableName \
    -disable-rule UnusedMethodParameter \
    -disable-rule ObjCAssignIvarOutsideAccessors \
    -disable-rule AssignIvarOutsideAccessors \
    -rc LONG_LINE=200 \
    -rc LONG_VARIABLE_NAME=20 \
    -rc NCSS_METHOD=200 \
    -rc CYCLOMATIC_COMPLEXITY=4 \
    -max-priority-1=100000 \
    -max-priority-2=100000 \
    -max-priority-3=100000
    echo "分析编译数据完成"
    
    xcprettyTime=$(date +%s)
    
    #清除当次编译数据
    rm compile_commands.json
    rm -rf ./build
    
    echo "生成编译数据耗费时间:"$(($xcodeBuildTime - $startTime))" s"
    echo "分析编译数据耗费时间:"$(($xcprettyTime - $xcodeBuildTime))" s"
    
    #显示报告
    if [ ${reportType} == "html" ]
    then
    echo "用浏览器打开报告文件"
    open oclintReport.html
    fi
    
    
    **iOS** **编码规范**
    
    **目的**
    
    统一规范 XCode 编辑环境下 Objective-C 的编码风格和标准,便于后续开发和维护。
    
    1.  **命名规则**
    
    本规则规定了源代码编写的格式的一般约定,用于指导编码,命名采用驼峰格式,命名参考下面规则:
    
    1)命名时采用英文单词,  避免使用汉语拼音的缩写。
    
    2)使用常见单词,不使用难懂的单词  。
    
    3)应该使用有意义的名称命名,能恰当解释其作用,不使用单个字母作为变量(大于等于3),但在循环中得循环变量可以使用。
    
    1.  **类名、分类、协议命名规则**
    
    类名(及其category name 和 protocol name)的首字母大写,且使用首字母大写的形式分割单词。
    
    *   在面向特定应用的代码中,类名应尽量避免使用前缀,每个类都使用相同的前缀影响可读性。
    *   在面向多应用的代码中,推荐使用前缀。
    
    如:SFSendMessage
    
    2.  **方法命名规则**
    
    方法名的首字母小写,且使用首字母大写的形式分割单词。不要使用前缀。方法的参数使用相同的规则。
    
    *   方法代表一个对象采取的行动,方法名以动词开头。
    *   方法名+参数应尽量读起来像一句话。
    *   getter的方法名和变量名应相同。不允许使用“get”前缀。
    
    | 
    
    (id)getDelegate; // 禁止
    
    (id)delegate;  // 正确
    
     |
    
    *   方法的命名开头需要避免使用copy、new等开头,  以避免编译器误报。
    
    3.  **变量和属性命名规则**
    
    *   属性和成员变量遵循小驼峰命名原则。
    *   常量、变量对外的放到头文件中,其他的则放到.m文件中。
    *   对外属性使用 @property来定义属性,内部使用的尽量采用成员变量方式,命名采用前下划线方式。
    
    @interface CarRecordGMSMarker : GMSMarker {
    
     GMSMapView *_mapView;
    
    }
    
    4.  **宏命名**
    
    *   全部大写, 单词间用 _ 分割 [不带参数] 
    
    例子:  **#define THIS_IS_AN_MACRO @****"THIS_IS_AN_MACRO"**
    
    *   以字母 k 开头, 后面遵循大驼峰命名 [不带参数]
    
    #define kWidth self.frame.size.width
    
    *   小驼峰命名 [带参数]
    
    #define getImageUrl(url) **[NSURL URLWithString:[NSString stringWithFormat:****@"%@%@"****,kBaseUrl,url]]**
    
    5.  **枚举**
    
    *   枚举常量:采用系统自带宏定义NS_ENUM、NS_OPTIONS枚举变量如:
    
    | 
    
    推荐使用:
    
    typedef  NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
    
     AFNetworkReachabilityStatusUnknown = -1,
    
     AFNetworkReachabilityStatusNotReachable = 0,
    
     AFNetworkReachabilityStatusReachableViaWWAN = 1,
    
     AFNetworkReachabilityStatusReachableViaWiFi = 2
    
    };
    
    不推荐使用C语言枚举定义类型:
    
      enum SFColor {
    
     kColorRed = 1,
    
     kColorCyany
    
     }
    
     |
    |  |
    
    6.  **控件属性及系统常用类变量命名规范**
    
    变量命名的默认规则是名称后部分必须采用其所属类的名称的后部分。
    
    如NSString *urlString、NSURL *checkURL等。
    
      针对NSString字符串,有特殊含义的命名,  可以不需要带String结尾;通知必须以Notification结尾,另外其他如xxPath、xxUrl、xxKey、xxName、xxText、xxId、xxPassword、xxIdentifier等。
    
    | 
    
    控件名称
    
     | 
    
    简写规范
    
     | 
    
    备注
    
     |
    | 
    
    UILabel
    
     | 
    
    xxxLabel
    
     |  |
    | 
    
    UIButton
    
     | 
    
    xxxButton
    
     |  |
    | 
    
    UISegmentedControl
    
     | 
    
    xxxSegmentedControl
    
     |  |
    | 
    
    UITextField
    
     | 
    
    xxxTextField
    
     |  |
    | 
    
    UISlider
    
     | 
    
    xxxSlider
    
     |  |
    | 
    
    UISwitch
    
     | 
    
    xxxSwitch
    
     |  |
    | 
    
    UIActivityIndicatorView
    
     | 
    
    xxxActivityIndicatorView
    
     |  |
    | 
    
    UIProgressView
    
     | 
    
    xxxProgressView
    
     |  |
    | 
    
    UIPageControl
    
     | 
    
    xxxPageControl
    
     |  |
    | 
    
    UITableView
    
     | 
    
    xxxTableView
    
     |  |
    | 
    
    UITableViewCell
    
     | 
    
    xxxTableViewCell
    
     |  |
    | 
    
    UIImageView
    
     | 
    
    xxxImageView
    
     |  |
    | 
    
    UITextView
    
     | 
    
    xxxTextView
    
     |  |
    | 
    
    UIWebView
    
     | 
    
    xxxWebView
    
     |  |
    | 
    
    MKMapView
    
     | 
    
    xxxMapView
    
     |  |
    | 
    
    UIScrollView
    
     | 
    
    xxxScrollView
    
     |  |
    | 
    
    UIDatePicker
    
     | 
    
    xxxDatePicker
    
     |  |
    | 
    
    UIPickerView
    
     | 
    
    xxxPickerView
    
     |  |
    | 
    
    UIViewController
    
     | 
    
    xxxVeiwController
    
     |  |
    | 
    
    UITableViewController
    
     | 
    
    xxxTableViewController
    
     |  |
    | 
    
    UINavigationController
    
     | 
    
    xxxNavigationController
    
     |  |
    | 
    
    UITabBarController
    
     | 
    
    xxxTabBarController
    
     |  |
    | 
    
    UIPageViewController
    
     | 
    
    xxxPageViewController
    
     |  |
    | 
    
    UIView
    
     | 
    
    xxxView
    
     |  |
    | 
    
    UIWindow
    
     | 
    
    xxxWindow
    
     |  |
    | 
    
    UINavigationBar
    
     | 
    
    xxxNavigationBar
    
     |  |
    | 
    
    UINavigationItem
    
     | 
    
    xxxNavigationItem
    
     |  |
    | 
    
    UISearchBar
    
     | 
    
    xxxSearchBar
    
     |  |
    | 
    
    UIToolbar
    
     | 
    
    xxxToolBar
    
     |  |
    | 
    
    UIBarButtonItem
    
     | 
    
    xxxBarButtonItem
    
     |  |
    | 
    
    UITabBar
    
     | 
    
    xxxTabBar
    
     |  |
    | 
    
    UITabBarItem
    
     | 
    
    xxxTabBarItem
    
     |  |
    | 
    
    NSArray
    
     | 
    
    xxArray
    
     |  |
    | 
    
    NSMutableArray
    
     | 
    
    xxMarray
    
     |  |
    | 
    
    NSDictionary
    
     | 
    
    xxDict
    
     |  |
    | 
    
    NSMutableDictionary
    
     | 
    
    xxMdict
    
     |  |
    | 
    
    NSSet
    
     | 
    
    xxSet
    
     |  |
    | 
    
    NSMutableSet
    
     | 
    
    xxMset
    
     |  |
    
    7.  **文件命名规则**
    
    *   文件命名,  需要采用驼峰格式,代码文件首字母需要大写,格式:项目缩写 + 模块名 + 功能 + 类型结尾,如: SFDriveRouteViewController
    *   图片等资源文件字母小写,”_”作为连接符(字母数字下划线),格式:模块(我的模块)_功能(编辑按钮),如:[mine_edit_btn@2x.png](mailto:gomp_car_record_edit_btn@2x.png)、mine_edit_btn @3x.png
    
    2.  **格式化代码**
    
    1.  **基本格式:**
    
    *   函数后的 { 与 }另启一行,这样代码更紧凑,代码方便查看及维护,如样例:
    
    | 
    
    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    
    {
    
      self = [super  initWithStyle:style reuseIdentifier:reuseIdentifier];
    
      if (self)
    
     {
    
     }
    
      return  self;
    
    }
    
     |
    |  |
    
    *   指针“*”号的位置,如:NSString ***varName****;****(***前空格)
    *   每行的长度
    
    1.  每行最多不得超过200个字符;通过 “Xcode => Preferences => TextEditing => 勾选Show Page Guide / 输入200 => OK” 来设置提醒;
    
    *   if语句中嵌套不要超过4层,否则选用其他方法。
    *   Method与Method之间空一行
    
    2.  **代码函数控制在****20****0****行以内****(****与****UI****相关的函数不作要求****)**
    3.  **方法的声明和定义**
    
    1.  在 - OR + 和返回值之间留1个空格,方法名和第一个参数间不留空格。
    
    | 
    
    + (BOOL)isSubclassOfClass:(Class)aClass 
    
    {
    
    }
    
     |
    
    2.  当参数过长时,每个参数占用一行,以冒号对齐。
    
    | 
    
    - (void)doSomethingWith:(GTMFoo *)theFoo
    
     rect:(NSRect)theRect
    
     interval:(float)theInterval
    
    {
    
    }
    
     |
    
    4.  **方法的调用**
    
    *   调用方法沿用声明方法的习惯。例外:如果给定源文件已经遵从某种习惯,继续遵从那种习惯。
    *   所有参数应在同一行中,或者每个参数占用一行且使用冒号对齐。
    
    | 
    
    如:
    
    [myObject doFooWith:arg1 name:arg2 error:arg3];
    
    或
    
    [myObject doFooWith:arg1
    
     name:arg2
    
     error:arg3];
    
     |
    
    5.  **for****循环**
    
    1.  在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
    
    | 
    
    for (col=0; col<5; col++ ) 
    
    {
    
    for (row=0; row<100; row++)
    
     {
    
     sum = sum + a[row][col];
    
    }
    
    }//推荐
    
     |
    
    2.  不要在for 循环体内修改循环变量,防止for 循环失去控制, 可用逆序循环或其他方法。
    
    **3.1.6 switch****语句**
    
    switch语句的基本格式是:
    
    | 
    
    Switch (variable)
    
    {
    
    Case value1 : … 
    
    break;
    
    Case value2 : … 
    
    break;
    
    …
    
    Default: … 
    
    break;
    
    }
    
     |
    
    *   每个case语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。
    *   不要忘记最后那个default分支。即使程序真的不需要default处理,也应该保留语句 default : break; 这样做并非多此一举,而是为了防止别人误以为你忘了default处理。
    *   如果每个case语句后跟着的操作有多行语句需要添加 { }。
    
    3.  **注释**
    
    程序中的注释是源代码的重要组成部分,用于解释类、函数、变量的含义。
    
    1.  **类的注释**
    
    类注释采用下面方式,简要说明该类的功能  。
    
    如:
    
    | 
    
    /**
    
    * 网络接口封装
    
     */
    
    @interface SFMapNetwrok : NSObject
    
     |
    
    2.  **函数注释**
    
    每一个函数、过程、方法前应该使用块注释,说明本函数的功能、算法、参数、返回值。对于有副作用,如修改全局变量的操作或者调用顺序要求的操作需要在注意事项中进行说明。没有返回的函数,@return可以不写,函数的功能尽可能写全  。
    
    其格式要求如下:
    
    | 
    
    /**
    
    * 那些类型可以拖动
    
     *
    
    * @param type 标注类型
    
     *
    
    * @return 返回是否可以拖动
    
     */
    
    + (BOOL)draggableByType:(SFMPAnnotationTypeEnum)type;
    
     |
    
    3.  **语句注释**
    
    1) 应对不易理解的分支条件表达式加注释;
    
    2) 不易理解的循环,应说明;
    
    3) 过长的函数实现,应将其语句按实现的功能分段加以概括性说明;
    
    4.  **变量常量注释**
    
      每个重要的变量声明都应有嵌入注释,用以描述被声明变量的用途,格式:/// 说明,格式如下:
    
    @property (nonatomic, copy) NSString **annotationId;/****< 标记id
    
    >*/
    
    5.  **善用****#pragma mark -**
    
    当类使用#pragma mark将各方法进行归类,便于浏览以及查找,归类的顺序建议如下:
    
    1)系统方法,如viewDidLoad
    
    2)公共方法或对外接口。#pragma mark -  Public  method
    
    3)代理方法。#pragma mark - UITableView 代理
    
    4)按钮等响应函数。#pragma mark -  Action  method
    
    5)本类私有方法  #pragma mark -  Private  method
    
    4.  **注意事项**
    
    1.  **创建通知地方,在类销毁时要移除通知。**
    2.  **使用****block****时,访问成员变量、方法时使用****__week** **修饰当前类临时实例,避免****block****持有不释放。**
    3.  **代理声明使用****weak****,不要使用****strong****或为空(为空为****strong****),避免循环引用。**
    4.  **数组使用前要检查是否越界。**
    5.  **多线程访问同一数据时要考虑加锁。**
    
    

    相关文章

      网友评论

          本文标题:OCLINT && 代码规范

          本文链接:https://www.haomeiwen.com/subject/uxowbftx.html