代码优化之减少重复代码-实践
背景
在APP中列表是一種比較常見(jiàn)的數(shù)據(jù)展示方式,當(dāng)有數(shù)據(jù)時(shí),就顯示數(shù)據(jù);如果沒(méi)有數(shù)據(jù),一般不會(huì)顯示一個(gè)空白頁(yè)面,而是在空白頁(yè)面上加一些提示信息,比如像下面這樣:
不同的APP會(huì)有不同的設(shè)計(jì),但不管是什么樣的設(shè)計(jì),它在整個(gè)APP內(nèi)部應(yīng)該是一致的,要變也只是文字或圖片稍有不同。
現(xiàn)狀
因?yàn)槲覀兡壳暗捻?xiàng)目還算比較龐大,所以這種列表無(wú)數(shù)據(jù)的情況出現(xiàn)了20多次,所以類(lèi)似下面的代碼出現(xiàn)了就有20多次。為什么說(shuō)類(lèi)似,因?yàn)槭怯刹煌娜藢?xiě)的,邏輯也是差不多,但真的各不相同,有的封裝成一個(gè)方法,比如:setNoMessageView,有的直接寫(xiě)在viewDidLoad里面......
- (void)setNoMessageView{self.noInfoView = [[UIView alloc] initWithFrame:CGRectMake(0, 45, SCREEN_WIDTH, SCREEN_HEIGHT)];self.noInfoView.backgroundColor = [UIColor clearColor];[self.view addSubview:self.noInfoView];UIImageView *carImageView = [[UIImageView alloc] initWithFrame:CGRectMake((SCREEN_WIDTH-120)/2, 60, 120, 86)];[carImageView setImage:[UIImage imageNamed:@"no_message.png"]];[self.noInfoView addSubview:carImageView];UILabel *noInfoLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 160, SCREEN_WIDTH, 20)];noInfoLabel.textAlignment = NSTextAlignmentCenter;noInfoLabel.textColor = LCRGBColor(211, 211, 211);noInfoLabel.text = NSLocalizedString(@"Dear, no information", nil);noInfoLabel.backgroundColor = [UIColor clearColor];noInfoLabel.font = [LCFont systemFontOfSize:20];[self.noInfoView addSubview:noInfoLabel];}先不考慮重復(fù)的問(wèn)題,只是孤立的看上述代碼,它也有一些問(wèn)題:
- self.noInfoView的frame應(yīng)該視根據(jù)上下文獲得的,而不是和屏幕大小綁定,而且yOffset是45也是不對(duì)的。
- carImageView的frame是固定大小的,而圖片有可能變。
第一個(gè)解決辦法
因?yàn)閯?chuàng)建noInfoView的代碼基本差不多,我們可以封裝出一個(gè)Util方法。
+ (UIView*)createNoMessageViewWithFrame:(CGRect)frame image:(UIImage*)image text:(NSString*)text {UIView* noMessageView = [[UIView alloc] initWithFrame:frame];noMessageView.backgroundColor = [UIColor clearColor];UIImageView *carImageView = [[UIImageView alloc] initWithFrame:CGRectMake((frame.size.width-image.size.width)/2, 60, image.size.width, image.size.height)];[carImageView setImage:image];[noMessageView addSubview:carImageView];UILabel *noInfoLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 160, frame.size.width, 20)];noInfoLabel.textAlignment = NSTextAlignmentCenter;noInfoLabel.textColor = LCRGBColor(211, 211, 211);noInfoLabel.text = text;noInfoLabel.backgroundColor = [UIColor clearColor];noInfoLabel.font = [LCFont systemFontOfSize:20];[noMessageView addSubview:noInfoLabel];return noMessageView; }調(diào)用:
- (void)setNoMessageView {CGRect rect = self.shopListView.frame;UIImage* image = [UIImage imageNamed:@"no_message.png"];NSString* text = NSLocalizedString(@"Dear, no information", nil);self.noInfoView = [HJUIUtil createNoMessageViewWithFrame:rect image:image text:text];[self.view addSubview:self.noInfoView]; }這樣改看起來(lái)好多了,把共性封裝,把差異作為接口留出。然后其他地方原本要寫(xiě)20行代碼,現(xiàn)在只要寫(xiě)5行,而且多個(gè)地方調(diào)用的代碼不會(huì)有太大的出入,便于閱讀和理解。
第二個(gè)解決辦法
上面的辦法已經(jīng)不錯(cuò)了,不過(guò)除了寫(xiě)5行代碼之外,還給ViewController增加了一個(gè)屬性:noInfoView。現(xiàn)在仔細(xì)想一下noInfoView出現(xiàn)的原因,是因?yàn)門(mén)ableView沒(méi)有內(nèi)容顯示的時(shí)候,noInfoView才顯示出來(lái),否則就隱藏。可見(jiàn),這個(gè)noInfoView和TableView是緊密聯(lián)系的,我們可以從UITableView的狀態(tài)得出noInfoView的狀態(tài)。那為什么不把它綁定到UITableView上呢?好,那就給UITableView增加一個(gè)屬性,叫做emptyView。
給一個(gè)系統(tǒng)的類(lèi)增加屬性不是那么的簡(jiǎn)單,但是只要看過(guò)SVPullToRefresh的代碼,就知道怎么做了。
首先,給UITableView增加一個(gè)Category。
然后外部調(diào)用就很簡(jiǎn)單了,沒(méi)有額外的屬性,而且一句話就搞定。
[self.shopListView.shopListTableView addEmptyViewWithImageName:@"no_message.png" title:@"Dear, no information"];然后在加載數(shù)據(jù)前進(jìn)行判定是否顯示emptyView
self.shopListView.shopListTableView.emptyView.hidden = ([self.dataArray count] != 0);?
轉(zhuǎn)載于:https://www.cnblogs.com/yulang314/p/5084372.html
總結(jié)
以上是生活随笔為你收集整理的代码优化之减少重复代码-实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 互联网思维之求职信,百战百胜
- 下一篇: Hibernate学习(三)