代码的坏味道

7.Feature Envy(依恋情结)

表现形式:
  • 一个类的函数对其他类的操作多于自己类中数据的操作。
重构方案:
  • 对其他类的操作提炼出来放到一个函数中
  • 将提炼出来的函数移动到对应类中
例子:
 //请求圈子顶部运营广告位
    [[self.subject_requestAdsBannerInfo flattenMap:^RACStream *(id value) {
        return [[[GetAppHomeBannerList signal_request] doNext:^(CallBackModel_GetAppHomeBannerList* x) {
            // 解析数据
            @strongify(self);
            {
                NSArray *bannerListArray = x.bannerListArray;
                if(bannerListArray.count >0){
                    
                    NSMutableArray *bannerObjects = [NSMutableArray array];
                    for (int index = 0; index < bannerListArray.count; index++) {
                        GetAppHomeBannerList_BannerListObject *bannerObject = bannerListArray[index];
                        HZBannerObject *bannerObj = [HZBannerObject new];
                        bannerObj.coverUrl = bannerObject.bannerImgUrl;
                        bannerObj.bannerTitle = bannerObject.title;
                        bannerObj.bannerType = [bannerObject.targetType intValue];
                        // 后端targetInfo配置时需要注意
                        switch (bannerObj.bannerType) {
                            case bannerTypePostList:
                            {
                                HZTagPostObject *tagObject = [HZTagPostObject new];
                                NSDictionary *postInfoDict = [self serializationBannerInfo:bannerObject.targetInfo];
                                tagObject.tagId = postInfoDict[@"tagId"];
                                tagObject.pageNumber = postInfoDict[@"pageNumber"];
                                
                                bannerObj.bannerObject = tagObject;
                            }
                                break;
                            case bannerTypeArticleInfoPage:
                            {
                                GetPostList4C_PostListObject *postObject = [GetPostList4C_PostListObject new];
                                postObject.postId = [[self serializationBannerInfo:bannerObject.targetInfo] objectForKey:@"postId"];
                                HZTagModel *tagModel = [[HZTagModel alloc]init];
                                tagModel.tagId = [[self serializationBannerInfo:bannerObject.targetInfo] objectForKey:@"tagId"];
                                postObject.tagListArray = @[tagModel];
                                postObject.postType = [NSString stringWithFormat:@"%d", PostType_article];
                                bannerObj.bannerObject = postObject;
                            }
                                break;
                            case bannerTypeVideoInfoPage:
                            {
                                GetPostList4C_PostListObject *postObject = [GetPostList4C_PostListObject new];
                                postObject.postId = [[self serializationBannerInfo:bannerObject.targetInfo] objectForKey:@"postId"];
                                HZTagModel *tagModel = [[HZTagModel alloc]init];
                                tagModel.tagId = [[self serializationBannerInfo:bannerObject.targetInfo] objectForKey:@"tagId"];
                                postObject.tagListArray = @[tagModel];
                                postObject.postType = [NSString stringWithFormat:@"%d", PostType_video];
                                bannerObj.bannerObject = postObject;
                            }
                                break;
                            case bannerTypeWebDetail:
                            {
                                NSString *url = [NSString stringWithFormat:@"%@%@",[[INIT share] interfaceAddressFromKey:@"resourceHost"],bannerObject.targetInfo];
                                NSString *poCode = [[[[INIT share] activityInfo] experienceBenfit] poInfo];
                                NSString *activityUrl = [NSString stringWithFormat:@"%@?poCode=%@",url,poCode];
                                bannerObj.bannerObject = activityUrl;
                            }
                                break;
                            default:
                                break;
                        }
                        //屏蔽掉无数据时的占位数据
                        //首页广告运营位无标题
                        if(bannerObj.coverUrl.length){
                            [bannerObjects addObject:bannerObj];
                        }
                    }
                    self.adBannerArray = [bannerObjects copy];
                }else{
                    self.adBannerArray = [NSArray new];
                }
            }
        }] catchTo:[RACSignal empty]];
    }] subscribeNext:^(id x) {
    }];

整个for 函数中大部分是对 HZBannerObject对象进行操作(整合数据)。我们可以将其提取到一个函数中并将这个函数放在HZBannerObject类中。

8.Data Clumps(数据泥团)

表现形式:
  • 两个类中多个相同的属性字段。
  • 多个函数签名中相同的参数。
  • 多个数据有关联的出现在一起。
重构方案:
  • 将其提炼到一个新的对象中
优点:
  • 减少字段和参数的个数
  • 新对象的重用
例子:
    NSArray *array = [self.arraySource objectAtIndex: indexPath.row];
    NSString * nameStr ;
    if (array.count>6) {
        nameStr = array[6];
    }else{
        nameStr = array[1];
    }

    [cell setPreAuthorizeCellWithViewDetailDirection:[[array objectAtIndex:0] integerValue]
                                     andDetailNumber:nameStr detailSort:[array objectAtIndex:2]
                                    andLabelTimeText:[array objectAtIndex:3]
                                       andCellStatus:[[array objectAtIndex:4] integerValue]
                                andTableCellPosition:[[array objectAtIndex:5] integerValue]];

可以将数组中的数据整合成一个对象。

9.Primitive Obsession(基本类型偏执)

表现形式:
  • 习惯于用基本类型的数据作为数据的传递工具。
重构方案:
  • 可以将两个基本类型的参数包装成一个对象,以对象的形式进行传递。
    [self.setPasswordInfo setInfoWithName:@"交易密码" placeHolder:@"请设置您的交易密码"];
  • 声明一个状态类(父类),抽象出一个方法。再创造子类,重写抽象方法。
if ([self.modelHospitalDetail.languageList[index] isEqualToString:@"03"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:日语", nil)];
            }else if ([self.modelHospitalDetail.languageList[index] isEqualToString:@"04"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:法语", nil)];
            }else if ([self.modelHospitalDetail.languageList[index] isEqualToString:@"05"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:韩语", nil)];
            }else if ([self.modelHospitalDetail.languageList[index] isEqualToString:@"06"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:泰语", nil)];
            }else if ([self.modelHospitalDetail.languageList[index] isEqualToString:@"07"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:柬埔寨语", nil)];
            }else if ([self.modelHospitalDetail.languageList[index] isEqualToString:@"08"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:马来语", nil)];
            }else if ([self.modelHospitalDetail.languageList[index] isEqualToString:@"09"]){
                 [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:粤语", nil)];
            }else if ([self.modelHospitalDetail.languageList[index] isEqualToString:@"10"]){
                 [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:德语", nil)];
            }else if ([self.modelHospitalDetail.languageList[index] isEqualToString:@"11"]){
                 [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:俄语", nil)];
            }else if ([self.modelHospitalDetail.languageList[index] isEqualToString:@"12"]){
                 [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:维吾尔语", nil)];
            }else if([self.modelHospitalDetail.languageList[index] isEqualToString:@"13"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:西班牙语", nil)];
            }else if([self.modelHospitalDetail.languageList[index] isEqualToString:@"14"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:瑞典语", nil)];
            }
            else if([self.modelHospitalDetail.languageList[index] isEqualToString:@"15"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:越南语", nil)];
            }
            else if([self.modelHospitalDetail.languageList[index] isEqualToString:@"16"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:印尼语", nil)];
            }
            else if([self.modelHospitalDetail.languageList[index] isEqualToString:@"17"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:缅甸语", nil)];
            }
            else if([self.modelHospitalDetail.languageList[index] isEqualToString:@"18"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:蒙古语", nil)];
            }
            else if([self.modelHospitalDetail.languageList[index] isEqualToString:@"19"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:阿拉伯语", nil)];
            }
            else if([self.modelHospitalDetail.languageList[index] isEqualToString:@"20"]){
                [ICMBProgressHelper ShowNoticeWithTitle:nil Detail:CustomLocalizedString(@"支持语言:意大利", nil)];
            }
优点:
  • 可扩展。

10.Switch Statments(switch 惊悚现身)

表现形式:
  • 出现过多的Switch。
重构方案:
  • 用多态的方式代替。
  • 以明确的函数取代参数。
优点:
  • 解耦。
  • 可扩展。
例子:
第一个例子中有switch,我们可以采用的多态的方式,代替他。
首先以bannerType为父类建立对应的四个子类,四个子类有各自的bannerObject的实现方式。
在父类中添加要给公用的方法getBannerObject。

11.Parallel Inheritance Hierarchies(平行继承体系)

表现形式:
  • 某个继承体系的类名称前缀和另一个继承体系的类名称前缀完全相同。
  • 平行继承体系 是霰弹式修改的特殊情况,一种变化引发多个类的修改。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容