问题描述
- 关于程序健壮性的问题
-
从服务器获取到的数据或提交到服务器的数据有可能是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);
解决方案
解决方案二:
需要判断,不只是判断服务器返回的数据是否为空,还要判断是否是字符串类型,如果服务器返回的是其他类型的数据,其他类型的数据赋给字符串的变量就会出现崩溃;而且在上传数据的时候,如果有的字段数据为空也是会出现崩溃问题;所以还是要判断。我自己就封装成一个特定的函数来判断这些异常情况。
解决方案三:
一个是健壮性的问题、一个是臃肿的问题;首先要保证的是健壮性,在健壮性的基础性,尽量去优化程序,对一些共性的东西去封装,尽量达到不臃肿的状态。对照的自己的编程经验,首先字段尽量去专门放到一个.h文件宏定义,这样服务器字段变化你只需要改.h的宏定义对应第字段就可以了;其次提交数据最后用可变字典去存放,判断一个字段,存放一个字段;然后从服务器取得数据进行模型赋值,如果数据过多,然后把这些数据的赋值也封装一个函数,这样不至于一个函数过大(臃肿)。
解决方案四:
其实你可以写个工具类用于处理异常。逻辑缜密就不会有健壮的问题
解决方案五:
这玩意就是吃一次亏上一次当的问题 java 就没有这么脆弱 也就那几个注意点 比如说什么nsmutableArray 不能add nil 。。。。之类的 看到这些的时候考虑一下就可以了
时间: 2024-12-01 13:42:32