当需要计算的任务量比较大时,比如1000多万的数据,除了通过对任务池任务进行合理调度,并行多个线程运行,除此外,我们还期望知道每个线程的具体执行情况,以及计算剩余的时长。。
采用面向对象术解决这个问题
1,首先建立一个TaskTimer的类,并定义外部方法,例如设置总任务长度setTotal,以及每执行一次任务进行快照的take,由于有一些任务是不定长的,我们增加addTotal,用于延长任务长度(与setTotal不同之处在于不用记住之前的总长度,因为当子任务运行时,并不一定知道也不关心总队列的长度),差不多这些就够了
2,在未实现代码具体功能前,先编写UnitTest(面向API开发),审查实际应用场景下,所设计的API是否能满足一般需求,例如又补充了getRate和getInfo分别获取任务完成比率和剩余时间。
3,开始具体的实现,内部方法使用private修饰,防止外部使用的人错误调用,可被继承重载的方法使用protect修饰,又补充了一些私有的运算所需的avgTime与diffTime属性
4,运行测试,检验功能是否符合预期,返回修改代码,或调整单元测试。
tips:所有标记为public的方法修改都必须仔细小心,一点改动就容易造成不兼容,然后就是带来一大把的重构任务,而private的方法,可以随便怎么改,无任何外部兼容问题。
对于属性,尽量以get/set方法提供对外的访问,这样才好兼容和控制,当然偷懒的人也用public属性,但仅适合小团队和个人使用,容易挖坑,比如window
location.href,至今没有任何办法知道哪块代码会通过赋值修改它,然后重载它以便予以阻止..
有时不得不采用freeze冻结它,以防止恶意或未知的代码控制跳转,不是所有的代码都是可靠可被修改的,