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

标题有点看不懂,说简单点,第一种情况就是类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; 第三种情况也仅限于两种变量直接由一种强耦合固定的关系才能使用。

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

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

时间: 2024-10-12 04:43:46

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

python类内init外声明的属性与init内声明的对象属性的访问和操作区别

python类内init外声明的属性与init内声明的对象属性的访问和操作区别(面试题) 1.在ipython中输入以下代码,其输出会是什么? In [1]: class ClassOut: ...: out_mem = 'out_mem' ...: print out_mem ...: def __init__(self): ...: inner_mem = 'inner_mem' ...: self.inner_mem = 'self.inner_mem' ...: self._inner_

简单理解javascript中的原型对象,实现对之间共享属性和行为

javascript中提供了构造函数,能够方便的创建对象.典型的构造函数如下: function Person(name, age) { this.name = name; this.age = age; this.say = function () { return this.name + ',' + this.age;; } 之后就可以用new和构造函数创建多个对象.javascript中,类的不同对象之间,属性和方法都是独立的.什么意思呢?java中类的不同对象之间,成员变量是独立的(每个

继承(指类之间共享属性和操作的机制)

继承(指类之间共享属性和操作的机制) 虚基类继承时要添加关键字virtual,以避免二义性. { 自己理解: 公有:基类的公有和保护成员作为派生类的公有和保护成员,在派生类类体内可以对基类进行公有和保护操作,基类私有不可访问.在main()函数内,派生类对象可以访问基类成员.虽然基类的私有成员不被派生类访问,但派生类还是包含了基类的私有数据成员. 保护:基类的公有和保护成员作为派生类的保护成员,在派生类类体内可以对基类进行保护操作,基类私有不可访问.在main()函数内,派生类对象不可访问基类任

__unset()魔术方法 删除类内私有属性

__unset()魔术方法 删除私有属性 unset()对共有属性进行删除 可通过__unset()魔术方法对私有属性进行操作 当在类外部执行unset()函数时,自动执行类内__unset()魔术方法 class hdw { private $name; private $age; private $money; //员工工资 public $c; function __construct($name, $age = '', $money) { $this->name = $name; $th

C#用反射实现两个类的对象之间相同属性的值的复制

在进行实体转换操作的时候如果需要在对两个实体之间两个属性字段差不多相同的类要进行一个互相的转换,我们要把a对象的所有字段的值都复制给b对象,我们只能用b.属性=a.属性来写,如果属性字段太多的话,就要写很多行复制语句,麻烦还容易漏掉一些,这个时候可以利用c#的反射来实现复制.我们可以写这样一个利用泛型的映射函数. 1.适用于创建实体的时候从一个实体作为数据源赋值 /// <summary> /// 反射实现两个类的对象之间相同属性的值的复制 /// 适用于初始化新实体 /// </sum

cocos2dx 3.x以上(Sprite精灵类的相关属性与创建)

// //  MainScene.cpp //  helloworld // //  Created by apple on 16/9/19. // // #include "MainScene.hpp" Scene * MainScene::createScene() { auto scene = Scene::create(); //    CCScene * scene = CCScene::create();// 创建场景 //创建层 MainScene *layer = Ma

黑马程序员---Objective-C基础学习---类、对象、方法相关知识笔记

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 类.对象.方法相关知识笔记 Objective-C相对于C语言有了面向对象的特性,但是ObjC又没有其他面向对象语言那么多语法特性,ObjC本身对面向对象进行了精简.下面是一些相关知识笔记. 类定义 成员变量 方法和属性 self关键字 类定义 在C#.Java等其他高级语言中定义一个类是相当简单点的,直接一个关键字class加一对大括号基本就完成了,但是在ObjC中类的定义相对变化比较大.现

Python的getattr(),setattr(),delattr(),hasattr()及类内建__getattr__应用

@Python的getattr(),setattr(),delattr(),hasattr() 先转一篇博文,参考.最后再给出一个例子 getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattrGetattr用于返回一个对象属性,或者方法 class A: def __init__(self): self.name = 'zhangjing'   #self.age='24' def method(self): print"method print&quo

基本数据类型的包装类(wrapper class)、时间处理相关类、Math类、File类、枚举类

包装类(wrapper class) --基本数据类型对应的类统称为包装类(Wrapper Class).包装类均位于java.lang包,包装类和基本数据类型的对应关系如下表所示: 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double boolean Boolean char Character 包装类的用途 --作为和基本数据类型对应的类类型存在,方便涉及到对象的操作. --包含每种基