年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2248|回复: 0

设计一个函数计算代码量

[复制链接]
  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

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

    代码示例
    main.m
    1. //
    2. //  main.m
    3. //  Practice
    4. //
    5. //  Created by yusian on 14-3-23.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. NSUInteger fileLineCounts(NSString *string);
    10. int main()
    11. {
    12.     // 创建一个字符串用来存储文件路径
    13.     NSString * path = @"/Users/yusian/Documents/Objective-C";
    14.    
    15.     // 创建一个临时变量接收结果返回值
    16.     NSUInteger count = fileLineCounts(path);
    17.    
    18.     // 打印最终结果
    19.     NSLog(@"%@ 下包含的代码总行数为:%ld", path, count);
    20.    
    21.     return 0;
    22. }
    23. // 主功能函数实现体,形参为需要计算的文件所在路径
    24. NSUInteger fileLineCounts(NSString *path)
    25. {
    26.     // NSFileManager类,创建单例对象,引进这个类主要是需要用到该类文件管理的几个功能
    27.     NSFileManager *mgr = [NSFileManager defaultManager];
    28.    
    29.     BOOL dir = NO;
    30.    
    31.     // 方法:"fileExistsAtPath: isDirectory:"的主要功能为返回当前路径是否存在,并且返回是否为一个文件夹
    32.     // 如果存在则返回YES,不存在返回NO,同时通过一个BOOL型指针变量修改另外一个值,实为返回两个参数
    33.     BOOL exits = [mgr fileExistsAtPath:path isDirectory:&dir];
    34.    
    35.     /****************************
    36.      判断之后有三种结果:
    37.      1、该路径不存在;
    38.      2、该路径为一个目录;
    39.      3、该路径为一个文件
    40.      ****************************/
    41.    
    42.     // 第一种结果,路径不存在,直接退出该函数
    43.     if (!exits) {
    44.         
    45.         NSLog(@"文件路径不存在!!!");
    46.         
    47.         return 0;
    48.     }
    49.    
    50.     // 另外两种结果为存在,再分两种情况:1、文件夹;2、文件;这两种情况处理方式不一样
    51.     // 首先定义一个计算器,用来接收返回的值
    52.     NSUInteger count = 0;
    53.    
    54.     // 1、文件夹处理方式
    55.     // 根据上述的判断结果,定义文件夹处理开始
    56.     if (dir) {
    57.         
    58.         // 定义一个数组用来接收当前文件夹中所有对象(文件夹和文件)
    59.         // 再次利用NSFileManager对象的一个方法:"contentsOfDirectoryAtPath: error:"
    60.         // 该方法的返回值为一个数组,数组中各元素为当前目录下的的所有文件与子目录
    61.         NSArray * current = [mgr contentsOfDirectoryAtPath:path error:nil];
    62.         
    63.         // 对该数组进行遍历
    64.         for (NSString *str in current) {
    65.             
    66.             // 遍历出来的每个元素为目录或文件,再对该目录或文件进行处理,实质上又回到了该函数的初衷
    67.             // 递归给函数本身,由于函数的实参为绝对路径,而数组中取出来的元素为相对路径
    68.             // 使用stringWithFormat方法对该元素进行重新组合,传给函数本身
    69.             NSString *fullPath = [NSString stringWithFormat:@"%@/%@", path, str];
    70.             
    71.             // 函数的结果返回值为当前路径下各文件返回值,对其进行累加并重新赋值
    72.             // 可得到当前目录所有文件返回值之和;
    73.             count += fileLineCounts(fullPath);
    74.             
    75.         }
    76.         
    77.         // 打印当前目录及返回值之和
    78.         // NSLog(@"%@,%ld", path, count);
    79.         
    80.         // 返回最终函数结果值,并退出函数
    81.         return count;
    82.         
    83.     } else {
    84.         
    85.         // 如果判断当前路径为文件,进入该代码区进行以下处理
    86.         
    87.         // 首先利用NSString的对象方法“pathExtension”对文件名取扩展名,返回值为NSString
    88.         // 再通过NSString的lowercaseString方法进行大小写转换(全转换成小写)
    89.         NSString *extension = [[path pathExtension] lowercaseString];
    90.         
    91.         // 对各扩展名进行过滤,非.h .m .c的文件,直接退出函数
    92.         if (!([extension isEqualToString:@"h"]
    93.               || [extension isEqualToString:@"m"]
    94.               || [extension isEqualToString:@"c"])) {
    95.             
    96.             return 0;
    97.         }
    98.         
    99.         // 如果OC相关的文件(.h/.m/.c)则通过"stringWithContentsOfFile: encoding: error:"方法读取到字符串中
    100.         NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    101.         
    102.         // 通过字符串的“componentsSeparatedByString:”方法对字符串进行分割
    103.         // 该方法的返回值为一个数组,如果分割的依据为回车符,则数组长度数即为该文件的行数
    104.         NSArray * array = [str componentsSeparatedByString:@"\n"];
    105.         
    106.         // 返回该数值给外部调用者,由于array.count返回值为NSUInteger类型,所以所有的相关变量定义与返回值类型均为NSUInteger类型
    107.         return array.count;
    108.     }
    109.    
    110. }
    复制代码
    运行结果:
    2014-03-23 21:22:45.904 Practice[3981:303] /Users/yusian/Documents/ObjectiveC 下包含的代码总行数为:5935
    Program ended with exit code: 0

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-11-24 08:14 , Processed in 0.046286 second(s), 20 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表