武汉ios培训
达内武汉中心

15827352908

热门课程

武汉IOS培训:如何实现精益编程

  • 时间:2016-04-26 17:51
  • 发布:湖北ios培训
  • 来源:达内新闻

达内ios培训专家发现,Copy-Paste是多数程序员易犯的错误,并且导致了重复代码,以下将详解如何实现IOS开发的精益编程。

需求1:仓库中查找所有颜色为红色的产品

我们以最简单的方式去实现它,,硬编码

- (NSArray *)findAllRedProducts:(NSArray *)products

{

NSMutableArray *list = [@[] mutableCopy];

for (Product *product in products) {

if (product.color == RED) {

[list addObject:product];

}

}

return list;

}

需求2:仓库中查找所有颜色为绿色的产品

这时候很多人都会出现Copy-Paste错误,引入了大量重复代码。

- (NSArray *)findAllGreenProducts:(NSArray *)products

{ 3.NSMutableArray *list = [@[] mutableCopy];

for (Product *product in products) {

if (product.color == GREEN) {

[list addObject:product];

}

}

return list;

}

消灭硬编码,得到可重用的代码,然后引入简单的参数化设计

- (NSArray *)findProducts:(NSArray *)products byColor:(ProductColor)color

{

NSMutableArray *list = [@[] mutableCopy];

for (Product *product in products) {

if (product.color == color) {

[list addObject:product];

}

}

return list;

}

需求3:查找所有重量小于10的所有产品

多数分程序员依然会使用Copy-Paste解决这个问题,拒绝Copy-Paste,每次尝试Copy-Paste时提醒自己做更好的设计

- (NSArray *)findProducts:(NSArray *)products byWeith:(float)weight

{

NSMutableArray *list = [@[] mutableCopy];

for (Product *product in products) {

if (product.weight < weight) {

[list addObject:product];

}

}

return list;

}

消除两者重复的代码,简单的参数化不仅不能解决问题,还会引入过度的复杂度和偶发成本。

- (NSArray *)findProducts:(NSArray *)products byColor:(ProductColor)color byWeith:(float)weight type:(int)type

{

NSMutableArray *list = [@[] mutableCopy];

for (Product *product in products) {

if ((type == 1) && product.color == color) {

[list addObject:product];

continue;

}

else if ((type == 2) && (product.weight < weight))

{

[list addObject:product];

continue;

}

}

return list;

}

函数的参数列表随着需求增加不断增加,函数逻辑承担的职责越来越多,逻辑也变得越来越难以控制。

通过参数配置应对变化的设计往往都是失败的设计

我们需要抽象,使其遍历的算法与查找的标准能够独立地变化,互不影响。

@interface ProductSpec : NSObject

- (BOOL)satisfy:(Product *)product;

@end

filter的算法逻辑封闭,将函数名重命名,使其算法更具普遍性。

- (NSArray *)findProducts:(NSArray *)products bySpec:(ProductSpec *)spec

{

NSMutableArray *list = [@[] mutableCopy];

for (Product *product in products) {

if ([spec satisfy:product]) {

[list addObject:product];

}

}

return list;

}

以可复用的类来封装各种变化,使变化因素控制在最小范围内。

@interface ColorSpec()

@property (nonatomic, assign) ProductColor color;

@end

@implementation ColorSpec

+ (instancetype)specWithColor:(ProductColor)color

{

ColorSpec *spec = [[ColorSpec alloc] init];

spec.color = color;

return spec;

}

- (BOOL)satisfy:(Product *)product

{

return product.color == RED;

}

@end

@interface BelowWeightSpec()

@property (nonatomic, assign) float limit;

@end

@implementation BelowWeightSpec

+ (instancetype)specWithBelowWeight:(float)limit

{

BelowWeightSpec *spec = [[BelowWeightSpec alloc] init]; spec.limit = limit;

return spec;

}

- (BOOL)satisfy:(Product *)product

{

return (product.weight < _limit);

}

@end

如此一来,用户接口简单、富有表现力。

[self findProducts:_products bySpec:[ColorSpec specWithColor:RED]];

达内ios培训专家总结,设计模式本身是极好的,但不能滥用,设计模式是为了简单的设计,无需去管是否是不是模式,只要设计是简单的,那它就是模式。

上一篇:iOS开发中Swift的十大特点总结
下一篇:ios开发人员不容错过的练手小项目大全!

达内iOS班学员就业喜人,薪资达12000

达内ios培训专家解码哪儿买iPhone SE便宜

如何通过iOS学习获得价值

Android VS iOS竞争的输家?

选择城市和中心
贵州省

广西省

海南省