链式编程之科学计算

前段时间因为经常遇到数值的计算,本来用➕➖✖️➗。但是遇到精度问题,所以必须得用NSDecimalNumber类,而使用NSDecimalNumber类计算很不方便,需要大量的初始化和超长的方法。如下:

  NSDecimalNumber *A = [NSDecimalNumber decimalNumberWithString:@"11.99"];
  NSDecimalNumber *B = [NSDecimalNumber decimalNumberWithString:@"22.99"];
  NSDecimalNumber *C = [A decimalNumberByAdding:B];

这样大家明白了,其实我们开发只需要知道是加减还是乘除,不需要在使用的时候有这么多的初始化操作。于是,我便想着封装起来。这时第一个反应就是链式编程了,可读性强、简洁。而链式编程的核心就是点语法加上返回对象本身。

既然知道主体思想,那么开始实现了,

比如完成 (1+2) x 3

那么大概思路应该是有个Calculation类,Calculation 有四个属性“加减乘除”,
既然要计算,每个属性肯定有个入参,而属性想调用属性,那么返回的必须是对象本身。综上,那么这个属性得是一个有入参和返回值得block。
按照思路,如下:

add(1).add(2).multiplyingBy(3)

但是为了增加代码的可读性和多次计算应该有个开始和结束,于是修正版本:

start(1).add(2).multiplyingBy(3).result

下面就该写属性了

//.h
typedef MCCalculation*(^CalculateOption)(id);
@property(nonatomic,copy) CalculateOption start;
…
….
//.m
-(CalculateOption)start{
    return ^(id inputNum){
        if (inputNum ==nil ||
        …………….
        }
        return self;
    };
}

最后,这样就实现一个链式编程的计算工具类,其实链式编程应用地方有很多,比如Masory自动布局库等。

代码传送门 :链式编程科学计算
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容