希望大家来讨论-在数据库编程中使用面相对象(300分)

  • 主题发起人 主题发起人 飘摇客
  • 开始时间 开始时间
to djh_djh:希望尽快看到你的源码。期待中
to plainsong:能说的详细些吗?

===========================
好像这个问题大家都不感兴趣,还是这个问题提的比较低级,不过这段时间突然就这个
问题比较感兴趣,希望大家能勇于讨论,多多指教我。
 
不用oop写数据库过.所以期待中.
 
继承比较不好处理
 
Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up


希望大家交流一下嘛。
 
正在练习用OO进行数据编程,,感觉自己写的很粗糙。。
左大侠的RE要多看看。。[:D]
 
正在阅读左大小的RE,有没有介绍这方面的网站?
 
这个你有看过么?
转贴:

我刚学DELPHI的时候也是按书中介绍的那样做我的数据库程序。生成一个DATAMODULE,在
上面放数据控件,比如TTABLE、TQUERY、TDATASOURCE。做小程序时这种方法很好效率也可
以,一般的项目一周就可以了。但做比较大的项目就有些混乱了。在一个DataModule里放上
好几十个数据控件,搞得我晕头转向。当然你也可以把数据控件放在多个DataModule里,这
样可以让你不晕头转向但程序“肥”了起来。这样做还有一个缺点,你不能把商业规则(
Business Logic)放在一处,程序做到最后你可能已经不知道哪儿是哪儿了。还会出现摸名
奇妙的错误。

---分析--------------------
用面向对象的方法做一般的应用程序比数据库程序容易一些,因为它不涉及到数据库。但
在做数据库程序时应该考虑类跟跟数据库是怎样联系的。还有DELPHI提供很多数据控件我们
是不是用它还是用一般的控件。

---解决--------------------
创建一个跟数据库联系的基类,其他的类从基类继承。
基类:DbRecordSet
TDbRecordset=class(TComponent)
private
FMasterFields: string;
FMasterSource: TDataSource;
function GetIsEmpty: boolean;
function GetRecordCount: integer;
function GetState: TDataSetState;
function GetDataSource: TDataSource;
procedure SetMasterFields(const Value: string);
procedure SetMasterSource(const Value: TDataSource);
protected
FTable:TTable;
FQuery:TQuery;
FDataSource:TDataSource;
FDisplayFields:TStringList;
FSqlType:TSqlType;
FIsEmpty:boolean;
FRecordCount:integer;
FOnRecordScrolled:TNotifyEvent;
FRecordListSource:TDataSource;
procedure FTableAfterScroll(DataSet: TDataSet);
function GetDisplayField: TStringList;virtual;
public
property DataSet:TTable read FTable;
property DataSource:TDataSource read GetDataSource;
property IsEmpty:boolean read GetIsEmpty;//表是不是为空
property RecordCount:integer read GetRecordCount;//记录数
property State:TDataSetState read GetState;
property DisplayField:TStringList read GetDisplayField;//要在DBGrid显示的字段
property RecordScrolled:TNotifyEvent read FOnRecordScrolled write FOnRecordScrolled;//记录滚动事件
property MasterSource:TDataSource read FMasterSource write SetMasterSource;
property MasterFields:string read FMasterFields write SetMasterFields;
property RecordListSource:TDataSource read FRecordListSource;//记录集合
procedure Insert;virtual;//添加记录
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
function Delete:boolean;virtual;//删除记录
function EmptyTable:boolean;virtual;
function First:boolean;virtual;//第一条记录
function Last:boolean;virtual;//最后一条记录
function Next:boolean;virtual;//下一条记录
function Prior:boolean;virtual;//前一条记录
function Post:boolean;virtual;//保存记录
function NoMsgPost:boolean;virtual;//没有提示信息的保存
function Cancel:boolean;virtual;
procedure OpenSql(TheQuery:TQuery;SqlStr:string;SqlType:TSqlType);//运行SQL语句
procedure RefreshRecordList;virtual;
procedure PRefresh;virtual;
end

图书类-TBooks
const
C_Book='Book';//表名
TBook=class(TDbRecordset)
private
FISBN:string;
FBookName:string;
FBookType:TBookType;
FBookTypeId:string;
FAuthor:string;
FPublisher:string;
FContent:string;
function GetBookName: string;
function GetContent: string;
function GetISBN: string;
function GetPublisher: string;
function GetType: string;
function GetAuthor:string;
procedure SetBookName(const Value: string);
procedure SetContent(const Value: string);
procedure SetISBN(const Value: string);
procedure SetPublisher(const Value: string);
procedure SetType(const Value: string);
procedure SetAuthor(const Value: string);
function GetBookTypeList: TStringList;
procedure BindFieldValues;
public
property ISBN:string read GetISBN write SetISBN;
property BookName:string read GetBookName write SetBookName;
property BookType:string read GetType write SetType;
property Author:string read GetAuthor write SetAuthor;
property Publisher:string read GetPublisher write SetPublisher;
property Content:string read GetContent write SetContent;
property BookTypeList:TStringList read GetBookTypeList;
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
function Post:boolean;override;
end;
 
楼上老兄,这些从哪里来的?这么多天了,就是希望看到这些东西。
 
那位富翁可以讲解一下,第一范式,第二范式,第三范式在数据库设计的时候
的具体应用啊?给个具体的例子最好,
老师讲了半天,还是不明白:(
 
对于oop是一种广义的概念。delphi对数据库的封装已经不错了。何必缘木求鱼?
如何建立业务的逻辑对象封装,是系统分析员的事情, delphi实现也比较容易。
我不知道up的方法的优点,有脱裤子放屁的感觉。用delphi的模块或form模板处理多好。
 
呵 ,再推荐一个贴子
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1061399
 
讨论继续。。。。。[up]
 
简单:

type
TMedClass=class of TMedObject; //元
TMedObject=class;//抽象类
public
Constructor Create(AOwner:TComponent);
Destructor Destroy;override;
procedure QueryByEnter(AstrCond:string);virtual;//封装从数据库中查找
.............
end;
TGoods=class( TMedObject)
procedure QueryByEnter(AstrCond:string);override; .........
...........//还封装了商品的其它操作:如经济订货点,平均日销量,等分析
end;
TStdEvent=class;//其实是组对象模型操作的元函数
public
class function DealKeyDown(AstrCond:string;AClass:TMedClass;Key:integer):string;overload;//处理TQuery Field.Onchange 事件
class procedure DealKeyDown(Sender:TObject;AstrCond:string;AClass:TMedClass;Key:Integer):string;overload;//处理界面上的OnKeyDown事件,所有KeyDown均只需调用此函数,也可由模板自动调用
如TEdit 中输入拼音码,DealKeyDown 自动带出编码,其它信息如名称,规格,
..................
end;
大家继续改进
 
继续讨论中....
 
建议大家不要在这上面让费时间。读UML方面的书后再研究
符合企业级应用的面向对象程序设计方法
 
Delphi 程序员的典型世界观: database - VCL - UI(界面)
而 Java 程序员则主要考虑 Design patterns 已经不单单考虑设计对象,而是在更多地考虑
对象间的交互关系。Decouple business logic from data access logic from UI。
建议大家不妨开阔一下眼界,读读下面的文章。
http://java.sun.com/blueprints/patterns/j2ee_patterns/catalog.html

上面 djh_djh 的例子考虑了用对象实现数据、操作的分离。
forss 提到的方法是一个很好的开端,用到了对象[red]继承[/red]。
Delphi 在 6.0 以前并没有接口继承。Design patterns 是非常依赖于的[red]接口[/red](interface),
Delphi 6 的接口已经做得很好 http://www.delphibbs.com/delphibbs/dispq.asp?lid=596317
实现 Design patterns 没有障碍了。
 
谢谢yysun老师。讨论继续....
 
多人接受答案了。
 
后退
顶部