食之无味,弃之可惜,面向对象设计在Delphi中不过是一块鸡肋。 (100分)

  • 主题发起人 主题发起人 lncd
  • 开始时间 开始时间
MIS为什么不能面向对象?
比如进销存,你可以将“库存”设计成一个类,将入库、出库等库存操作设计成类方法;
你也可以将所有表单设计成类,进货单是一个类、销售单是一个类等等,每个单据可以从共同的祖先继承,一些共有特性可以在祖先类中实现。
这种方式下扩充和维护都相当方便。
 
关注此题!!!!
做MIS就是这样!读表--》显示编辑记录--》保存
老这样做自己也觉得烂,以前曾经在这上面问过类似的问题,但回答的要吗讲的很简单
要吗也跟我一样的做!!感觉写MIS就是这么这样!!
 
softdog:
你好象有这方面经验,不过我还有些不明白想向你请教:
就以你举的进销存例子。
把进货单设计成一个类,类的方法有进货。
但用户想进行查询进货单时,用户会说,我只要给出查询条件,然后发一个查询命令,就查出满足条件的进货单了。
我们如果把进货单设计成一个类,你会我们是不是要在类里实现这个查询方法?一个进货单就要创建一个实例。我们查出1000条记录,是不是要创建1000个实例?这1000个例又如何与界面的操作和显示相关联?愿闻其详?
//
而我们目前的做法就很简单了。
放几个edit用于设置查询条件,一个dbgrid用于显示查询到的记录。连上query,组合成sql.再query.open就搞定了。
哪种方法简单有效呢?我认为是后者。
 
用oo做出Delphi,不用oo一样做出了Windows。
擅长用什么就用什么吧。不会oo强做oo,只会徒具其表。反而觉得oo不好了。
我的体会是oo很难,很难。特别是做分析的时候,一步错将影响全局!
但做好了,生产力的提高就不是一点点的问题了。比如,以前我们用SDK做Windows程序。
后来用MFC做,再用VCL做,那个生产力高,不言而喻!
我最近也开始尝试在软件中使用自己的类,注意,仅仅是使用类。还谈不上用oo来分析问题。不过我已经觉得比我以前写的那些代码更加清晰,明了,维护的时候也方便一些了。
mis系统我没有做过,但我觉得,如果把里面的一些共通的属性操作封装到一起也许比
用函数库更加清楚,明白。
好了,不说了,我知道的就这么多了。我是半碗水响叮当,废话了这么多,不要骂我啊!
大家讨论问题嘛。[:D][:D][:D]
 
条条大道通罗马,哪个效率高成本低就用哪个,一切从利益出发~
 
TO lncd:
我认为绝对可以实现OO的设计,只是划分层次要清晰,采用一定模式,softdog说
进货单是一个类,不是说每个进货单都生成一个类,其实设计的全局只要有几个进货
单类就够了,你查找进货单,找到一个进货单后,这个进货单类根据数据库里的参数
利用类似TStrings的Assign方法,更新自身一些参数,提供给用户一致的界面方便修
改,同时利用这个进货单类的一些方法很容易封装一些通用方法,同时可以让这个进
货单类成为一个表单的属性可以实现更多功能。
 
张大侠,你下面的话我没看明白。
=============================
我认为绝对可以实现OO的设计,只是划分层次要清晰,采用一定模式,softdog说
进货单是一个类,不是说每个进货单都生成一个类,其实设计的全局只要有几个进货
单类就够了,你查找进货单,找到一个进货单后,这个进货单类根据数据库里的参数
利用类似TStrings的Assign方法,更新自身一些参数,提供给用户一致的界面方便修
改,同时利用这个进货单类的一些方法很容易封装一些通用方法,同时可以让这个进
货单类成为一个表单的属性可以实现更多功能。
========================================
<<"进货单是一个类,不是说每个进货单都生成一个类,">>
我不是说每个进货单都生成一个类(class),是生成一个类实例,或叫对象(object)
<<其实设计的全局只要有几个进货单类就够了>>
怎么把进货单设计成几个类?这几个类有什么关系?我越发不明白了。
<<你查找进货单,找到一个进货单后>>
我怎么查找进货单,“查找”方法是进货单类提供的方法吗?
我是用Query控件来查找吗?
我找到的不是一个进货单,而是一个进货单记录集呀。
<<这个进货单类根据数据库里的参数利用类似TStrings的Assign方法,更新自身一些参数,提供给用户一致的界面方便修改,同时利用这个进货单类的一些方法很容易封装一些通用方法,同时可以让这个进货单类成为一个表单的属性可以实现更多功能。>>
我还没想出来怎么和界面上的那些vcl结合。
可以再说详细些吗?最好能举个具体的例子。

 
试试bold for delphi
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2139835
 
1。我的描述不太规范,进货单是一个类,不是说每个进货单都生成一个类
应该改成 把进货单设计成类,不是说每个进货单都生成一个对象,全局只
要几个和进货单相关的表单需要生成一个这样的对象就够了。
2。进货单类由上层的进货管理类管理,查找进货单的由操作进货管理类实现
unit StockManager;
interface
uses
DB, SysUtils, DBTables;
type
TStockDoc = class //进货类
public
procedure Assign(AQuery: TQuery);
virtual;
abstract;
procedure update(SQL: string;
IsOpen: boolean);
virtual;
abstract;
end;

TStockDocument = class;
TStockManager = class //进货单管理类 //
private
FStockDocCount: Integer;
FStockCount: Integer;
FStockDocArray: array of TStockDoc;
//根据需要控制进货单的对象个数
procedure InitStockDocument;
procedure CleanupStockDocument;
function FindDocument(StockDocument: TStockDoc): Integer;
public
constructor Create(StockCount: Integer);
destructor Destroy;
override;
function FindStockDocument(SQL: string;
Query: TQuery): TStockDoc;
procedure CloseStockDocument(StockDocument: TStockDoc);
end;

TStockDocument = class(TStockDoc)
private
FQuery: TQuery;
FManager: TStockManager;
function GetStockID: Integer;
procedure SetStockID(const Value: Integer);
public
property StockID: Integer read GetStockID write SetStockID;
property Manager: TStockManager read FManager;
constructor Create(Manager: TStockManager);
destructor Destroy;
override;
procedure update(SQL: string;
IsOpen: boolean);
override;
property Query: TQuery read FQuery;
procedure Assign(AQuery: TQuery);
override;
end;

implementation
{ TStockManager }
procedure TStockManager.CleanupStockDocument;
var
i: Integer;
begin
for i := Low(FStockDocArray) to High(FStockDocArray)do
FStockDocArray.Free;
end;

procedure TStockManager.CloseStockDocument(StockDocument: TStockDoc);
var
index, i: Integer;
begin
index := FindDocument(StockDocument);
if index < 0 then
raise Exception.Create(' ');

if Index = FStockDocCount - 1 then
begin
Dec(FStockDocCount);
Exit;
end;

for I := index to FStockDocCount - 2do
begin
FStockDocArray[index] := FStockDocArray[index + 1];
end;

Dec(FStockDocCount);
FStockDocArray[FStockDocCount] := StockDocument;

end;

constructor TStockManager.Create(StockCount: Integer);
begin
FStockCount := StockCount;
InitStockDocument;
end;

destructor TStockManager.Destroy;
begin
CleanupStockDocument;
inherited;
end;

function TStockManager.FindDocument(StockDocument: TStockDoc): Integer;
var
i: Integer;
begin
Result := -1;
for i := Low(FStockDocArray) to High(FStockDocArray)do
begin
if FStockDocArray = StockDocument then
begin
Result := i;
break;
end;
end;
end;

function TStockManager.FindStockDocument(
SQL: string;
Query: TQuery): TStockDoc;
begin
Result := nil;
if FStockDocCount > 11 then
Exit;
Query.SQL.Clear;
Query.SQL.Add(SQL);
Query.Close;
try
Query.Open;
except
raise;
end;

Result := FStockDocArray[FStockDocCount];
if Result <> nil then
begin
Result.Assign(Query);
Inc(FStockDocCount);
end;

end;

procedure TStockManager.InitStockDocument;
var
i: Integer;
begin
setlength(FStockDocArray, FStockCount);
for i := Low(FStockDocArray) to High(FStockDocArray)do
begin
FStockDocArray := TStockDocument.Create(Self);
end;
FStockDocCount := 0;
end;

{ TStockDocument }
procedure TStockDocument.Assign(AQuery: TQuery);
begin
FQuery := AQuery;
FQuery.SQL.Clear;
FQuery.SQL.Add('select * from Stock');
FQuery.Close;
try
FQuery.Open;
except
end;
end;

constructor TStockDocument.Create(Manager: TStockManager);
begin
self.FManager := Manager;
end;

destructor TStockDocument.Destroy;
begin

inherited;
end;

function TStockDocument.GetStockID: Integer;
begin
Result := FQuery.FieldByName('StockID').AsInteger;
end;

procedure TStockDocument.SetStockID(const Value: Integer);
begin
if Value <> GetStockID then
FQuery.FieldByName('StockID').AsInteger := Value;
end;

procedure TStockDocument.update(SQL: string;
IsOpen: boolean);
begin
FQuery.SQL.Clear;
FQuery.Close;
FQuery.SQL.Add(SQL);
with FQuerydo
begin
if IsOpen then
FQuery.Open
else
FQuery.ExecSQL;
end
end;

end.

上面是我刚才写的一个简单例子,就是实现我所说的观点。
 
上面只是个简单的例子,你可以让表单有一个TStockDocument对象什么的,这样就
可以实现代码重用。
 
建议楼主看看这两个帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1703563
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1951482
 
来瞧热闹,别说我灌水
 
看来楼主对Delphi理解深度不够!
好好学习!
 
楼主要好好学习,天天向上!!!
人家 VB 都面对对象化了!!!!
 
来自:幕后黑手, 时间:2003-9-28 7:54:00, ID:2205031
楼主要好好学习,天天向上!!!
人家 VB 都面对对象化了!!!!
-外行话少说,看清人家的问题先。
 
我也是从事MIS的开发的。在实际开发中,就像楼主讲的那样,有绝大多部分的开发人员没有在使用MIS,而只是按照结构化设计的方式在做。为什么会这样呢,归根结底是由于以下几个原因:
1.在非软件行业的公司做MIS,有很多的时候没有宽裕的时间来做oop。oop一开始做起来绝对比结构化设计要麻烦得多,难得多,花时间得多,如果那样做老板不说你效率低才怪呢;
2.社会上的大环境如此,试问那位大富翁,有谁是一开始学系统开发方法是学oop的?如果是那样,恐怕也早就跳出来说上几句了,而人本来就有惰性,你原来用结构化设计的方法就能很容易完成的,你会去用一开始麻烦得多的oop设计吗?
3.用oop要求的开发人员的素质条件要高得多,如果你没有实际的经验,很难会习惯去运用;
4.oop是一种优秀的设计方法,其最大的特点就是用重用性来提高生产率,所以,不是写一个两个能表现它优秀的地方出来。但是目前中国的软件设计这一块离规范还差得远,大部分的公司,包括一些小软件公司,都追求短期效益,不会花时间去用oop;
我从事MIS系统的开发也有快8年了,但是我平常在写得时候也照样用结构化设计来写,甚至于连标准的结构化设计方法也没有运用全,至于用oop的设计方法,也在自己的兴趣下学习,这就是现状。但是我想,不能因为自己无法做到,有很多人无法做到,就否定oop的设计方法,就可以认为delphi的oop不好什么的,其实只不过是delphi为了适应开发人员的需要,对于底层做了包装而已,但是其底层是oop的。作为delphi的开发人员,你可以用结构化设计的方法来开发,也可以用oop的方法来开发。但是oop是以后开发人员一定会用到的。
顺便提一下,现在在windows平台上运用得最多的com,com+就是用OOP的!
 
samboy111, 老大真的没看清楚题目(糊涂)
设计要看你的需求和团队决定,Object Design 在重开发和 Debug 上都比较有效率,但如果你的团队99% 都是 Structure Design 老板也没意见那就用 Structure 啦
 
发表一下俺的愚见:
基于对象 和 面向对象是两个不同的概念。
从字面就可以看出:
正如我们经常所为,拖拉几个控件,设置几下属性,或是写几行代码,是基于对像的,即使用别人已经作好的类。你只是一个使用类的人,而非创作类的人,也就是你在基于对象,而非面向对象。
所谓面向对象,是逢山开路,遇水架桥.
 
依我愚见,面向对象的编程开发可以在较大程度上提高软件维护的质量和效率
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部