在重新复习了一遍面向对象的概念之后,重新看了下股价提醒的代码,发现自己以前某些思路确实有很大的问题:
缓存数据模型为
[
[value:输入的值,flag:开关],
[value:输入的值,flag:开关],
......
[value:输入的值,flag:开关]
]
1.在键盘输入的数据判断的过程中,需要去除无效值:总位数超过六位的、小数位数不符合要求的、小于等于0的(包括小数点)、异常字符的、小数点位异常的,在删除的时候同样需要进行判断
2.同时,需要在输入完成后进行临时缓存,防止tableview复用将数据清空(需要获取flag)
3.此外,还需要考虑switch开关对输入框的操作(对flag有操作)
以上三点,都涉及到临时数据存储的问题
4.发送数据前以及离开页面前,还要判断空数据、对比数据、检测无效数据(数据有效但操作无效的情况),这里需要将临时数据转换成非临时数据,防止发送时用户修改,又需要将临时数据与非临时数据进行对比,还需要用空值初始化的数据与临时数据对比进行判断是否为空。(都需要使用flag)
在写入数据的时候,什么时候写入,写入一个值还是两个值,都应该抽象出来处理的,尤其是后面涉及到flag的使用(可能会出现有输入数据,但是开关是关闭的情况,这种情况只做展示,不做上传)
因此整理思路:
1.在初始化的过程中就需要对flag以及value进行赋初值
2.在第一次展示网络数据的时候就需要使用flag,这里的就应该将空文字的flag置空,单纯switch开关选项的value与flag保持一致,提醒次数这种必须有的flag设置true
3.输入操作与switch操作不能有先后顺序,因此,在输入的过程中可以进行对数据有效处理之后进行保存之后提示警告并切换flag同时修改switch开关(这一步与输入之后失去焦点重复),switch切换时修改flag并关闭警告
4.失去焦点时进行保存之后提示警告并切换flag同时修改switch开关(好像重复了,但是失去焦点获取方式不保险,加保险用)
5.以上操作都是写在临时数据中,页面滚动时也是获取临时数据
6.离开页面或者保存时,与非临时数据对比,处理之后,更新临时数据进行展示
其中,多次对数据的flag进行了操作,也就意味着switch也需要进行变动,警告提醒也需要进行显示隐藏,但是原有代码中,都是分散实现的。
新的想法是:
-(void)changeValue:(CGfloat value){}
-(void)changeFlag:(bool flag){}
-(void)changeSwitchAtIndex:(NSIndex *index) withBool:(bool flag){}
-(void)changeAlarmViewAtIndex:(NSIndex *index) withBool:(bool flag){}
-(void)setValue:(CGfloat value) AndFlag:(bool flag) AtIndex:(NSIndex *index)
{
//前面的都写上
}
将对象的某些行为抽象成方法,提炼出来,这应该是面向对象思想的重要部分,之前在这里,实现的并不好,改成这样的话,以后增加了新的指标,就只需要直接调用一个方法进行设置了,并且在初始化、输入、删除时都使用同一个函数。
网友评论