Sian 发表于 2014-3-23 21:25:30

设计一个函数计算代码量

该示例需要完成的任务,把某个代码目录中所有的代码文件进行扫描,并计算所有代码文件中代码量(总代码行数);
基本思想:
1、设计的该函数应该具备:传进文件目录,返回代码行数;
2、文件目录以字符串的方式传进函数体,如果无效给予提示;
3、如果传进的参数为目录,则将该目录及子目录下的所有文件全部计算出来并求和;
4、由于是计算代码量,所以只对.h/.m/.c的文件敏感(即忽略其他类型文件);
5、需要用到NSString及相关方法、NSArray及相关方法、NSFileManager及相关方法;
6、最重要的是:递归思想;
7、相关说明都在代码注释中;

代码示例
main.m
//
//main.m
//Practice
//
//Created by yusian on 14-3-23.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>

NSUInteger fileLineCounts(NSString *string);

int main()
{
    // 创建一个字符串用来存储文件路径
    NSString * path = @"/Users/yusian/Documents/Objective-C";
   
    // 创建一个临时变量接收结果返回值
    NSUInteger count = fileLineCounts(path);
   
    // 打印最终结果
    NSLog(@"%@ 下包含的代码总行数为:%ld", path, count);
   
    return 0;
}

// 主功能函数实现体,形参为需要计算的文件所在路径
NSUInteger fileLineCounts(NSString *path)
{
    // NSFileManager类,创建单例对象,引进这个类主要是需要用到该类文件管理的几个功能
    NSFileManager *mgr = ;
   
    BOOL dir = NO;
   
    // 方法:"fileExistsAtPath: isDirectory:"的主要功能为返回当前路径是否存在,并且返回是否为一个文件夹
    // 如果存在则返回YES,不存在返回NO,同时通过一个BOOL型指针变量修改另外一个值,实为返回两个参数
    BOOL exits = ;
   
    /****************************
   判断之后有三种结果:
   1、该路径不存在;
   2、该路径为一个目录;
   3、该路径为一个文件
   ****************************/
   
    // 第一种结果,路径不存在,直接退出该函数
    if (!exits) {
      
      NSLog(@"文件路径不存在!!!");
      
      return 0;
    }
   
    // 另外两种结果为存在,再分两种情况:1、文件夹;2、文件;这两种情况处理方式不一样
    // 首先定义一个计算器,用来接收返回的值
    NSUInteger count = 0;
   
    // 1、文件夹处理方式
    // 根据上述的判断结果,定义文件夹处理开始
    if (dir) {
      
      // 定义一个数组用来接收当前文件夹中所有对象(文件夹和文件)
      // 再次利用NSFileManager对象的一个方法:"contentsOfDirectoryAtPath: error:"
      // 该方法的返回值为一个数组,数组中各元素为当前目录下的的所有文件与子目录
      NSArray * current = ;
      
      // 对该数组进行遍历
      for (NSString *str in current) {
            
            // 遍历出来的每个元素为目录或文件,再对该目录或文件进行处理,实质上又回到了该函数的初衷
            // 递归给函数本身,由于函数的实参为绝对路径,而数组中取出来的元素为相对路径
            // 使用stringWithFormat方法对该元素进行重新组合,传给函数本身
            NSString *fullPath = ;
            
            // 函数的结果返回值为当前路径下各文件返回值,对其进行累加并重新赋值
            // 可得到当前目录所有文件返回值之和;
            count += fileLineCounts(fullPath);
            
      }
      
      // 打印当前目录及返回值之和
      // NSLog(@"%@,%ld", path, count);
      
      // 返回最终函数结果值,并退出函数
      return count;
      
    } else {
      
      // 如果判断当前路径为文件,进入该代码区进行以下处理
      
      // 首先利用NSString的对象方法“pathExtension”对文件名取扩展名,返回值为NSString
      // 再通过NSString的lowercaseString方法进行大小写转换(全转换成小写)
      NSString *extension = [ lowercaseString];
      
      // 对各扩展名进行过滤,非.h .m .c的文件,直接退出函数
      if (!(
            ||
            || )) {
            
            return 0;
      }
      
      // 如果OC相关的文件(.h/.m/.c)则通过"stringWithContentsOfFile: encoding: error:"方法读取到字符串中
      NSString *str = ;
      
      // 通过字符串的“componentsSeparatedByString:”方法对字符串进行分割
      // 该方法的返回值为一个数组,如果分割的依据为回车符,则数组长度数即为该文件的行数
      NSArray * array = ;
      
      // 返回该数值给外部调用者,由于array.count返回值为NSUInteger类型,所以所有的相关变量定义与返回值类型均为NSUInteger类型
      return array.count;
    }
   
}运行结果:
2014-03-23 21:22:45.904 Practice /Users/yusian/Documents/Objective-C 下包含的代码总行数为:5935Program ended with exit code: 0
页: [1]
查看完整版本: 设计一个函数计算代码量