delphi面向对象及数据库(300分)

  • 主题发起人 活化石
  • 开始时间

活化石

Unregistered / Unconfirmed
GUEST, unregistred user!
听听高手间的探讨
 
C

coldew

Unregistered / Unconfirmed
GUEST, unregistred user!
Bold是什么好东西,这讨论里提到好多次,看了这个讨论受益非浅,要好好去消化。
 
T

TOTO

Unregistered / Unconfirmed
GUEST, unregistred user!
to barton:
>>procedure EnumBizObjects(Objects: TBizObjects);//TBizObjects封装了TBizObject的构造方法
>>function AddBizObject(Provider: TBizBuffer): TBizObject;//TBizBuffer与TBizObjects耦合,同时为Dataset提供数据
这两个方法是什么类的?TBizObjects是TBizObject的一个容器类吗?
还有,前面您说明的哪个查询的实现方式不太明白。是把每一个查询条件封装成一个类吧?如果是几个条件的组合呢?是封装成一个呢还是多个?比方说: name='zhagsan' age = 19
按照前面的例子是两个类。那么在具体查询时,是先构造一个完整的SQL语句查询还是先查询一次,第二次从前一次的结果集中查询呢?
没明白您的意思,可能问的有些幼稚了,见谅...
btw://我们是做CGI的,每次的状态是不保存的。每次的数据都要丛数据库读取。所以,我们的控制类并没有保存任何信息,只是在需要的时候到数据库中读取,然后返回。以后考虑把这些数据保存在控制类中留做数据缓存。您有什么更好的办法吗?
 
Y

yyanghhong

Unregistered / Unconfirmed
GUEST, unregistred user!
barton,
>>你如何在运行时解决DDL与DML间的冲突?
当然, 我获得数据是通过select statement,可存在文件或数据库中.DML statement是通过域定义器和sql引擎动态生成的. 只有把数据域定义从code中分离出来, 才能做到
数据表和对象的映射真正同步, 用code生成器来做数据表和对象的映射是老办法,维护很麻烦, model driven是发展方向. bold也是这样做的.
用bizObject的方法是比较理想, 但需要大量工作, 是IDE开发商的工作, 不是我们可以考虑的.
 
B

barton

Unregistered / Unconfirmed
GUEST, unregistred user!
EnumBizObjects/AddBizObject是数据库操作的封装类的方法,由BizObjects调用。当然,
TBizObjects是TBizObject的容器类,管理业务对象。
有关查询,我列一个例子,你去理解,好吗?
TFindType = (ftGeneral, ftString, ftInteger, ftFloat, ftBool....);
//查询子
TFind = class
private
FIndex: Integer;
FDesc: string;
protected
class function GetFindType: TFindType;
virtual;
abstract;
public
constructor Create(Index: Integer;
const Desc: string);
function Compare(Sender: TBizObject): Boolean;
virtual;//非SQL方式比较
function Resolve: string;virtual;//生成SQL语句
end;
//查询子的聚合类
TFindList = class(TFind)
private
FList: TList;//聚合所有的单项条件
protected
class function GetFindType: TFindType;
virtual;
abstract;
public
constructor Create;
destructor Destroy;
overridel
function Compare(Sender: TBizObject): Boolean;
override;//所有子查询子中必须全部返回真
function Resolve: string;override;//归并所有的查询子
end;
//字串查询子
TStringFind = class(TFind)
protected
class function GetFindType: TFindType;
virtual;
abstract;
public
function Compare(Sender: TBizObject): Boolean;
override;//支持*和?通配
function Resolve: string;override;//生成SQL语句
end;
//整数查询子
TIntegerFind = class(TFind)
protected
class function GetFindType: TFindType;
virtual;
abstract;
public
function Compare(Sender: TBizObject): Boolean;
override;//支持","和"-"分隔
function Resolve: string;override;//生成SQL语句
end;
//浮点数查询子(可兼容日期类型)
TFloatFind = class(TFind)
protected
class function GetFindType: TFindType;
virtual;
abstract;
public
function Compare(Sender: TBizObject): Boolean;
override;//支持","和"-"分隔
function Resolve: string;override;//生成SQL语句
end;

在实施的时候,建立一个TFindList对象,并不断添加查询子。每个查询子的意义通过
Index在TBizObjects中找答案。而生成SQL语句根据你的数据库设计来具体实现。这个子
框架很适合在ListView中显示,将ListItem与查询子通过Data相连。可参考:
http://www.delphibbs.com/delphibbs/dispq.asp?LID=2010662
中我所举的TTreeView的例子。
如果你设计的CGI真的那么依赖数据库,那大可不必使用OO方式。我使用的时候,所有的
关键数据(有人称之为代码词典)一定放在内存中,而核心数据(例如学生)则使用“兴趣
注册”方式管理。所谓兴趣注册,就是每个客户只对一部分核心对象感兴趣,就通知服务
器放到内存中,当没有“兴趣”的时候就从内存中释放它。
 
D

delp

Unregistered / Unconfirmed
GUEST, unregistred user!
to barton 进来
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2024983
 
D

delp

Unregistered / Unconfirmed
GUEST, unregistred user!
to 活化石
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2024983
 
Y

yyanghhong

Unregistered / Unconfirmed
GUEST, unregistred user!
to barton,
>>其实表结构变化了,意味着业务关系发生变化,你无法避免地要修改代码,即使你不用O/R Mapping。
持久层代码和业务层代码应该是分离的, 如果因为需修改业务层代码,而不去做持久层程序的自动化控制, 那model driven做什么
 
B

barton

Unregistered / Unconfirmed
GUEST, unregistred user!
yyonghhong:恕我愚钝,没有理解。使用code生成器或是 model driven似乎并没有解决DDL
与DML之间的冲突呀!我想你的意思是不是说当有个表格有10万记录的时候,加一个字段,
其缺少值先设为可空,以便这个表还能够容纳已经存在的记录,然后在方便的时候再改为不
可空,是吗?
在项目开发期间,Code生成器是很有意义的,维护中不可能再使用代码生成。但如果OOD做
得好,文档齐全,可以在很小范围内改动的,这只是很小的代价,比起运行时负荷Meta要
轻得多。
 
D

delp

Unregistered / Unconfirmed
GUEST, unregistred user!
to barton 兄弟联系一下实际考虑一下
我知道前两天出言不逊,还请谅解,其实是大家对面向对象开发数据的不同看法罢了
目前我碰到的业务需求几乎经常发生变化,一次性把数据库设计到位非常的难,我目前通过OO就是为了解决维护上的麻烦,各种操作分层,这样在发生业务变动的时候,修改的代价也就最小.....不是吗?
 
Y

yyanghhong

Unregistered / Unconfirmed
GUEST, unregistred user!
其实O/R MAPPING的原理很简单, 难点是怎样解决获得数据过程的性能问题, 比如, 我们需
通过ado或dbexpress去连接数据库,得到数据后在放到对象中, 这样一来就有一个数据复制的过程. 造成内存和速度上的浪费.
update, delete, insert只用生成sql后, 再通过ado或dbexpress去执行就行了. 这不存在
性能的问题.
 
W

wisenow

Unregistered / Unconfirmed
GUEST, unregistred user!
to delp:
按你所说的思想可以使得代码、思路和程序结构都很清晰,偶也是前一段时间才认识的:)
 
W

wisenow

Unregistered / Unconfirmed
GUEST, unregistred user!
看代码都是享受,艺术品,呵呵,说的有点过了。
 
W

wisenow

Unregistered / Unconfirmed
GUEST, unregistred user!
不同意“这种毫无意义的封装”
 
D

delp

Unregistered / Unconfirmed
GUEST, unregistred user!
to wisenow
哈,找到知音不容易呀,帮忙看看
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2024983
 
Y

yyanghhong

Unregistered / Unconfirmed
GUEST, unregistred user!
barton,
你怎能保证在开发期表结构不变化呢? 至于code生成器, 象rose也有提供, 但很多人对他在
实际中的运用都不满意, 就第一次方便, 日后更改很麻烦, 要不然bold为什么写了那样多控件去保证对象和表结构的映射呢. 这也是bold很受欢迎的一个重要原因.
 
B

barton

Unregistered / Unconfirmed
GUEST, unregistred user!
我认为mapping中减少对象间的耦合才是难点。虽然数据放到对象中对内存有些浪费,但却
大大降低了数据库的压力,获得的实际利益是一样的。至于数据复制过程那完全是在数据
库操作层设计时的策略而已。
to delp:我已经看过了,只是从外表看不出精妙之处。如果有设计文档更好,或者至少有
个业务说明书。我对你愤恨是因为那个关于七七事变纪念日的贴子。既然你愿意和解,我
更是乐意。至于对你软件的有关的评价我会在你的贴子中发表。
 
D

delp

Unregistered / Unconfirmed
GUEST, unregistred user!
to yyanghhong
兄弟这几天老是听到 bold ,能介绍一下是个什么东西吗?
可以去什么地方下载吗?
 
Y

yyanghhong

Unregistered / Unconfirmed
GUEST, unregistred user!
barton,
>>我想你的意思是不是说当有个表格有10万记录的时候,加一个字段,
其缺少值先设为可空,以便这个表还能够容纳已经存在的记录,然后在方便的时候再改为不
可空,是吗?
看不懂, 但这好象是dba的事
 
顶部