精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Powerbuilder>>PB中使用注册表技术>>[ 各执己见的讨论 ]>>Re: 关于面向对象

主题:Re: 关于面向对象
发信人: edison()
整理人: edison(1999-11-24 07:10:56), 站内信件
很好,我的 OO 开发与你有少许出入。为了省事我就简练一点描述一下:

首先,所有关于业务处理的 Code 绝对不会出现在 Button 的 Clicked 事件或者

Dw 的 Double Click 、Menu 的 Click 之类的事件中。关于业务处理的 CODE 要

不就放在 Window 中要不就放在 UserObject 中。这点我们几乎一样。我要强调

的意思是这点很重要。这是将界面逻辑与业务逻辑分开的第一步!然后我也和你

一样每个 Dw 对应一个 UserObject 。但是这里有少于出入,我们探讨探讨!

我定义了一个叫 n_om ( Object Manager ) 对象作为所有这些 UserObject 的父

类。这个对象的意思顾名思义叫做对象管理器。因为数据库表中的一条记录可以

看作是一个实体(或者叫对象实例)。关于所有这些对象的一些公共操作肯定有

插入、删除、保存、修改等。所以我把这种 Object 称作 Object Manager 。而

且这个 n_om 是直接继承 DataStore 的。它的 DataObject 自然就对应那个

DataWindow 。这样整个增删改操作都全部封装起来了。除了这个 OM 之外。我还

要同时再定义一个 n_cst_object 。这个 Object 中的属性包括了 DataWindow 

中的所有列。这个对象就可以形象的表示一个一个的实体。n_om 管理的对象就是

n_cst_object 。这样那些关系到一个 Object 的方法就放到 n_cst_object 中来。

同时业务关系中的各个对象之间的联系也放到 n_cst_object 中完成。我觉得这

样更加 OO 一点。其实我的 OO 思路还不是很成熟,一直处于一中摸索阶段。所以

希望大家一起来讨论讨论。

【 在 fanpb (笨笨) 的大作中提到: 】
:    我们在产品的开发中使用面向对象技术。有一点心得供大家参考。
: 一、界面逻辑分离。
:    面向对象重要特性是封装,那么用什么封装?是窗口还是UserObject?
:    我们看PB的例子,包括PFC(我只看了PB5的),一般程序的主体是窗口。
: 大多script都是事件驱动的。例如窗口上一个button"新增记录",那个这个表的

: "新增"是逻辑是依赖这个button存在的。如果没有新增button就没有这个表的新

: 增逻辑。但如果在复杂的调用中就存在问题了。

:    我看了前些天有人问的一问题极具代表性,我重复一下这个问题:

:   作 者: superwolfman (小飞) 1999.11.18 
: 有一个进货表test1: 
: 货品名称  卖出否 
:  苹果       n 
:  梨子       n 
: 西红柿      n 
: 主索引为"货品名称" 
: d_test1 
: w_test1 
: 另一个售货表test2: 
: 货品编号   货品名称 
:    1         苹果   
: 主索引为"货品编号" 
: d_test2 
: w_test2 

: 可不可以在表test2提交的同时将存在于test2中的数据影响到表test1的数据?即
:  
: 在出货表test2中卖出了"苹果"在单击"保存"按钮的同时使test1表变成: 
:        货品名称  卖出否 
:          苹果       y     //原来是"n" 
:          梨子       n 
:         西红柿      n 
:  
:      这个问题我这样理解:表test1和表test2各应有一个逻辑实体(一个uo)负责

: 管理。每个uo都具有:
:      公共成员变量(属性)、函数(方法)、事件。uo本身包括了表的所有方法
: :
:   1、新增 2、查询、3、修改 、4、删除方法 。并且是不依赖任何界面存在的。

:      那么如果要编辑数据时该怎么办,这就是第5个方法:编辑。调用该方法打
: 开
: 窗口进行交互式操作,并且把所有GUI的事件发给UO,由UO进行界面处理。
:      如果这样做,就这样设计:
:      uo n_test1表test1的管理对象。  
:      uo n_test2表test2的管理对象。

:      在n_test2中内嵌一个n_test1 test1。
:      在n_test2.of_update()保存方法中,调用test1.修改方法。

:      这个时候体现出界面逻辑分离的好处,因为并没有出现编辑test1的窗口。


:      如果就这个例子而言,这样做显然多此一举。可以把test1的update复制到

:       test2的保存script中。但如果是大规模开发,这就是维护的灾难。因为t
: est1
:      的update可能出现在数百个窗口的Script中,如果需要修改test1.update,
: 要找
:      出所有这些修改的script,并且一个不漏简直就是奇迹。事实上我们公司统
: 计
:      发现这种原因造成的软件BUG不在少数。
:      所以需要uo封装商业逻辑,而窗口封装界面逻辑。窗口对触发事件,没有任
: 何逻辑
:      处理(不对数据库进行任保读写)。窗口是uo的一个可视表现。

:      一个逻辑不要出现在两个地方。对表test1的任何修改绝对不允许出现在非

:      n_test1的地方。 结构如图: 



:           uo逻辑部分                     界面部分
:             查询方法
:             增加方法
:             修改方法
:             删除方法
:             编辑方法  ----------------》打开一个或多个编辑窗口 
:                       <-----------------发送gui 事件
:             响应事件  ----------------》调用窗口的界面处理方法。
:        就写这么多,请大家指正。




--
谢谢没有在 "将本文章寄一份给原作者" 处打勾, 再次感谢!

※ 来源:.网易 BBS bbs.netease.com.[FROM: bbs.szptt.net.cn]

[关闭][返回]