首页 > 关于程序健壮性的问题

关于程序健壮性的问题

从服务器获取到的数据或提交到服务器的数据有可能是nil,那我们是否需要对需要用到的每个数据都判断其是否为nil呢?
如果是的话,会不会有些繁琐? 尤其是当从服务器返回的数据或提交到服务器的数据比较多的时候。问一下该怎么保证
程序的健壮性同时又不让程序变得很臃肿。
这是我的从服务器获取数据的代码片段

    NSDictionary *data = responseObject[@"data"];
        NSArray *list = data[@"list"];
        //这个数组用于用户点击苗木列表时,给苗木详情页面传值
        if (_pageIndex == 1) {
            self.sapArr = [NSMutableArray arrayWithArray:list];
        }else{
            for (NSDictionary *item in list) {
                [self.sapArr addObject:item];
            }
        }

        for (NSDictionary *item in list) {
            HDNurseryItemModel *itemModel = [[HDNurseryItemModel alloc] init];
            itemModel.itemID = item[@"_id"];
            NSArray *imgArr = item[@"images"];
            if (imgArr.count > 0) {
                itemModel.iconName = imgArr[0];
            }
            itemModel.specID = [item objectForKey:@"specId"];
            NSString *mainSpec = [Util decodeSapType:[itemModel.specID integerValue]];
            NSInteger specMax = [[item objectForKey:@"specMax"]integerValue];
            NSInteger specMin = [[item objectForKey:@"specMin"]integerValue];
            NSInteger wocID = [[item objectForKey:@"planting"]integerValue];
            NSString *woc = [Util decodeWOC:wocID];
            //规格值
            NSString *finalSpec = [Util combineSpec:mainSpec specMax:specMax specMin:specMin];
            itemModel.loginName  = item[@"loginName"];
            itemModel.nickName = item[@"supplyLinkman"];
            itemModel.leftTitle = finalSpec;
            itemModel.rightTitle = woc;
            itemModel.describe= item[@"spec"];
            itemModel.price = [item[@"price"]floatValue] ;
            itemModel.stock = [item[@"quantity"] intValue];
            itemModel.addr = [NSString stringWithFormat:@"%@ %@",item[@"province"],item[@"city"]];
            itemModel.city = item[@"city"];
            itemModel.province = item[@"province"];
            itemModel.spec = item[@"spec"];
            itemModel.specID = item[@"specId"];
            itemModel.specMax = item[@"specMax"];
            itemModel.specMin = item[@"specMin"];
            itemModel.treeID = item[@"treeId"];
            itemModel.treeName = item[@"treeName"];
            itemModel.nurseryID = item[@"nurseryId"];
            itemModel.nurseryName = item[@"nurseryName"];
            itemModel.planting = item[@"planting"];
            itemModel.supplyflag = [item[@"supplyflag"] integerValue];
            [_dataSource addObject:itemModel];

这是提交到服务器的函数的代码片段

  NSString *treeID = realTarget.model.treeID;
                NSString *treeName = realTarget.model.treeName;
                NSString *specMin = realTarget.model.specMin;
                NSString *specMax = realTarget.model.specMax;
                NSString *spec = realTarget.model.spec;
                NSString *planting = realTarget.model.planting;
                NSString *price = [NSString stringWithFormat:@"%.2f",realTarget.model.price] ;
                NSString *quantity =[NSString stringWithFormat:@"%d",realTarget.model.stock] ;
                NSString *nurseryID = realTarget.model.nurseryID;
                //        NSString *nurseryName = realTarget.model.nurseryName;
                NSString *specID = realTarget.model.specID;
                NSString *city = realTarget.model.city;
                NSString *province = realTarget.model.province;
                NSString *seedlingID = realTarget.model.itemID;
                NSString *type = @"1";
                NSString *loginName = [Util getLoginNameFromUserDefault];
                NSString *nickName = [Util getNickNameFromUserDefault];
                NSString *userID = [Util getUserIDFromUserDefault];
                NSDictionary *param = [NSDictionary dictionaryWithObjects:@[userID,treeID,treeName,specMin,specMax,spec,planting,price,quantity,nurseryID,loginName,nickName,specID,city,province,type,seedlingID]  forKeys:@[@"ym.memberId",@"ym.treeId",@"ym.treeName",@"ym.specMin",@"ym.specMax",@"ym.spec",@"ym.planting",@"ym.price",@"ym.quantity",@"ym.nurseryId",@"ym.pLoginName",@"ym.pNickName",@"ym.specId",@"ym.city",@"ym.province",@"ym.type",@"ym.seedlingId"]];
                NSLog(@"param:%@",param);

首先,后端对参数是一定要检验的,而且不只是检验nil的问题,“SQL注入”等等安全问题都是要考虑的。
IOS发参数,如果逻辑正确,参数的来源可信,就不需要多余的检验,但是基本的检验还是要有的。
IOS对服务器返回的数据应该也有基本的检验,至少服务器跪掉、报错、数据异常都是可能的。
服务器返回数据,应该区分有正常和异常的数据情况吧。

诸如此类,程序的健壮性,项目的质量,程序员的个人追求……
臃肿或者单纯……
……


json 序列化之后续费这么几种形式:
NSNumber
NSDictionary
NSArray
NSString
NSNull

由于OC对nil的友好,
你反序列化的时候,nil是不会有什么问题的。
NSNumber 是nil的话,就是0
NSDictionary,NSArray,NSString,NSNull就是nil,

不过你序列化的时候要注意,
NSArray, NSDictionary组装的时候不能有nil,你要保证这个的话,可以在addObject,setObject:forKey: 这些方法前做一些判断即可。


https://github.com/CoderMJLee/MJExtension

【热门文章】
【热门文章】