类内与类之间相关属性耦合采取刷新的讨论

    标题有点看不懂,说简单点,第一种情况就是类A与类B两个类。其中类B需要类A的一个数据,并且到A中的数据进行更改时,类B需要被通知,进行刷新修改本地保存的类A中的相关属性。懂设计模式的朋友一看就知道可以用Observe观察者模式,将类B当成观察者,类A当成被观察者。即

   

A a;

B b;

a.addObserve(&b);

a.update();

当每次A的数据发生改变时,维护A的人需要手动去刷一把update来让A的所有观察者进行刷新,更新数据,这是一种方法。当然了,像我平时Qt开发,自然而然的有Qt为我准备的connect信号连接,我也只需要

connect(&a, SIGNAL(test()), &b, SLOT(onTest()));

即可实现当a发射test信号的时候,我b可以知道并且去调用onTest这个槽函数。这两种方法里其实都有一个由A主动去调B的过程,如观察者模式中的显示update和Qt中的显示emit,其实归根到底,你是把这次连接关系进行了相应的抽象,解耦了A和B之间的关系,只需要A自己去update或者emit就可以,它不需要知道到底有多少监听者在到底他的消息发射出来。这是类之间的相关属性耦合刷新机制。

    第二种,是我们平常一直忽略的类内的相关属性耦合刷新机制,因为在我们平时开发过程中,对于类之间的敏感度往往要大于类内,所以对类内的相关属性,往往会忽略它的一些耦合关系。比如

class A

{

public:

    void draw(int width, int height) {

    // some draw code

    }

private:

    int width;

    int height;

};

也许我们并没有需求每次去进行draw或者将内置变量传给draw函数,我们可能仅仅需要width和height两个数值,并且我们希望到width和height两者任何一种发生改变的时候,我们必须手动去刷一把draw。因为当前的draw它依赖的是width和height的值,而不是他们本身。所以需要我们来维护他们的值发生变化的时候draw的显示调用。

    所以问题来了,这其实就是简单的类内的相关属性耦合刷新机制,解决方法也有好几种。其中一种

// some codes

    setWidth(value);

    draw(width, height);

    setHeight(value);

    draw(width, height);

// end

类似这样,我们会在每次set之后都去主动调一把draw来让它刷新获得最新的width和height数据,当然,这个解法的问题就是代码重复过高,以及有可能你会在哪一天漏掉之后的draw函数。

    第二种

setWidth(int value)

{

    width = value;

    draw(width, height);

}

即将set函数进行改装,到外部用户每次进行set的时候,我在内部帮用户都调取一把draw函数,避免用户会漏掉,也避免了一些相关的代码重复。

    第三种情况比较特殊,就是当两个变量彼此耦合度很高的时候可以采取一个值固定,一个值活动的方式,比如

int rol;

int col;

int sum;

其中sum稳定不变,现在就可以采取row固定,即row可以正常setRow,而col不能set,只能取的方式,即col= sum / row;或者col固定,row不能设置,只能取的方式row= sum / col; 第三种情况也仅限于两种变量直接由一种强耦合固定的关系才能使用。

    另外会混淆的情况就是用引用或者指针

void test(int &a, int &b);

void test(int *a, int *b);

这种情况一般来说,就忽略了主动刷新这个机制,可能你这个test函数必须要在a或者b改变的时候要显示调一把,但你现在这么做只是保证了a或者b对于test来说是最新的,而不是说test会在最新之后运行一遍,这个方法和之前的几种方法的区别同学要好好理解。

    综上,相关属性耦合分为类内与类之间,仔细观察发现其实两者真正的维护都在于自己本身出发。唯一能做的就是减低耦合度和代码重复度,希望同学对于类内属性耦合也有一个重新的认识,因为相对于类之间,确实类内耦合比较容易忽视。

你可能感兴趣的:(属性)