首页 新闻 赞助 找找看

面向对象中对象中方法调用时机的疑问

0
[待解决问题]

如题,在面向对象中,问题被分解到各个对象中去处理,这样一来类中的方法调用就“好像”被延迟了。
例如有如下代码

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Layer
{
    Ilist<Field> myFields;
    public Ilist<Field> MyFields
    {
     get{
              if(myFields == null){ myField = GetFields();}
              return myFields;
          }
    } 
    private Ilist<Field> GetFields(){……}//代码省略
}
 
public class Field
{
    string FieldName;
    public string FieldName{get;set;}
    string FieldZh;//中文名称
    pulic string FieldZH{get;set;}
}
 
//客户端
public void Main()
{
    Ilist<Layer> myLayers = GetLayers();//GetLayers代码省略
    foreach(var nextLayer in myLayers)
        {
            foreach(var nextField in nextLayer.MyFields)//此处才能调用Layer中的GetFields()方法
                {
                       console.writeline(nextField.FieldName);
                }
        }
 
}

 


如上代码中对Layer中的GetFields()方法的调用问题,我们只能在客户端中才能调用对象中的方法,此时Layer中的GetFields()方法运算量很大的话,客户界面就会非常卡,如果在客户界面载入之前就将数据准备好的话,就可以解决这个问题。现在有一个疑问就是,对于对象中的方法,其调用时机如何控制?求各位大神解答,不胜感激!

chopic的主页 chopic | 菜鸟二级 | 园豆:202
提问于:2014-06-24 23:10
< >
分享
所有回答(2)
0

说一点抛砖引玉吧

1、假设调用需要10秒或是更多。

2、这个事情是在打开一个FORM时进行。

如果是这样的话,你在客户界面FORM载入之前准备数据,好像也是不妥的,就会出现这样一个情况

我点下菜单或是一个按钮,希望出现一个界面FORM,结果等啊等,10秒后,出现了。

对于这样的情况,我的处理方式是

1、打开FORM,渲染。(通常1秒左右,看界面复杂度),显示界面。

2、使用BackgroundWorker加载数据,如果感觉时间会比较长,可以显示Busy Loading 界面。

3、数据加载完成,显示在GRID或是其他控件中。

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-06-25 00:06

谢谢答复,现在的情况就是一个窗体界面,我传入了一个Ilist<Layer>,然后将这个list绑定到combobox中,用户选中哪个layer,就在datagrid中读取layer的field数据,但是读取的数据很多,在用户界面上很卡,应该如何处理呢?

支持(0) 反对(0) chopic | 园豆:202 (菜鸟二级) | 2014-06-25 10:05

@chopic: 

Data loading.... Please wait.

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-06-25 10:34

@爱编程的大叔: ……确实是好方法

支持(0) 反对(0) chopic | 园豆:202 (菜鸟二级) | 2014-06-25 10:59
0

首先“在面向对象中,问题被分解到各个对象中去处理,这样一来类中的方法调用就“好像”被延迟了”,这句话有些问题,前半句是对的,这个问题分解是为了程序架构更明晰,每个问题更简单。但是,类中的方法调用其实仍然是由业务来确定,所以,什么时候调用类的方法取决于你什么时候执行业务,而业务的触发则是用户在UI上的操作或是后台某些数据的变化。

因此,调用的时机并不是延迟了。

而你说的问题,其实是可以总结为业务需求:用户需要在打开界面时,看到myLayers中的数据。

那么数据准备自然是在用户看到界面之前,至于是在界面显示时准备数据还是用户打开之前就准备数据,只要最终完成了用户需要的业务,并且保证了用户体验即可。

hailants | 园豆:750 (小虾三级) | 2014-06-25 08:56

“但是,类中的方法调用其实仍然是由业务来确定,所以,什么时候调用类的方法取决于你什么时候执行业务,而业务的触发则是用户在UI上的操作或是后台某些数据的变化。”这句话正是我想问的,在我需要调用这个业务的时候,需要执行的时间很长,造成用户界面很卡,这个问题应该如何解决呢?实际情况就是

我传入了一个Ilist<Layer>,然后将这个list绑定到combobox中,用户选中哪个layer,就在datagrid中读取layer的field数据,但是读取的数据很多,在用户界面上很卡,应该如何处理呢?

支持(0) 反对(0) chopic | 园豆:202 (菜鸟二级) | 2014-06-25 10:07

@chopic: 你说的多是指每个layer中的数据多么?

如果是每个layer中的数据少,而layer很多的话,就把layer中的数据读取延迟到用户点击layer时,或者如果是固定数据的话,则可以提前到layer构造的时候。如果layer中的数据多,可以在点击Layer时搞分页,

支持(0) 反对(0) hailants | 园豆:750 (小虾三级) | 2014-06-27 12:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册