過程的另類想法是否有錯?

foreveryday007 2003-02-11 03:24:17
//這種語句用到的地方很多,我想寫成一個過程
procedure SetSValue(Q:TQuery; sPara,sValue: string);
begin
Q.ParamByName(sPara).AsString := sValue;
end;

//添加SQL的where語句並賦值
procedure SetSWhere(Q:TQuery; sPara,sValue: string);
begin
if Trim(sValue) = '' then
Q.SQL.Add(' and ((' + sPara + '=:' + sPara + ' ) or( k'
+ sPara + ' is null)) ')
else
Q.SQL.Add(' and ' + sPara + '=:k' + sPara + ' ');

SetSValue(Q, 'k' + sPara, sValue);//此處有調用上面的過程
end;

現在的想法是:
第一個過程好像是多此一舉(只有一行代碼,也用一個過程實現)
第二個過程中的調用感覺也是多此一舉;

其實我是比較喜歡這種寫法;維護起來方便,代碼一致性也比較好;
有一個問題不懂:速度上是否有所影響?
向各位請教!!
...全文
35 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzdiyu 2003-03-19
  • 打赏
  • 举报
回复
这样写是比较好的。
不过上面的过程好像是不对的。
分的不对。
就象你要封装一个头
把脸,眼睛,鼻子,耳朵放在一起了
而嘴巴单独出来封。
应该要不就都分处理,眼睛是眼睛,嘴巴是嘴巴,
要不就封到头,全部在一起。
就是意思要封装到同一等级。
yzdiyu 2003-03-19
  • 打赏
  • 举报
回复
hehe,给分阿,
hansion3406 2003-02-16
  • 打赏
  • 举报
回复
呵呵...楼上说的很有意思..
breezing 2003-02-12
  • 打赏
  • 举报
回复
同意
307 2003-02-12
  • 打赏
  • 举报
回复
关注
foreveryday007 2003-02-12
  • 打赏
  • 举报
回复
來此僅為學習!
謝謝各位的參與!
foreveryday007 2003-02-12
  • 打赏
  • 举报
回复
謝謝 outer2000(天外流星) :
對於你所說的問題,也有考慮過;
加了if判斷語句,是否有多了一條執行指令(速度上應該有點影響)
此處的功能只有一個,把你給sql賦AsString值的地方,修改成這個過程就行了
不知道你在給sql賦AsString值的地方是否也有if判斷語句呢
我想是不會有的,會用此過程的人應該考慮到了

不過,還是很感謝你的參與,畢竟,此處確實有這個bug的可能
hydonlee 2003-02-12
  • 打赏
  • 举报
回复
来晚了,
同意: zhang21cnboy(沧桑男人)的说法。

outer2000 2003-02-12
  • 打赏
  • 举报
回复
楼主的想法的确是很好
但是有问题啊;

procedure SetSValue(Q:TQuery; sPara,sValue: string);
begin
//这里需要判断TQUERY是否已经创建的;
if Assigned(Q) then....
Q.ParamByName(sPara).AsString := sValue;
end;
bluemeteor 2003-02-12
  • 打赏
  • 举报
回复
楼主的想法的确是很好的

procedure SetSValue(Q:TQuery; sPara,sValue: string);
begin
Q.ParamByName(sPara).AsString := sValue;
end;

这个过程仅仅只是个sample而已,将来可以在里面增加各种的防错处理等等

学JAVA的时候会发现很多例似的procedure
largewang 2003-02-12
  • 打赏
  • 举报
回复
没错!

无速度影响!
ronaldli 2003-02-12
  • 打赏
  • 举报
回复
数据库操作时磁盘操作,函数调用是内存操作,时间差着几个数量级呢
就好像你在二万五千里长征前上几次厕所一样,瞎操什么心啊!

完全赞成你的看法,好程序员就要模块化!
jakefj 2003-02-12
  • 打赏
  • 举报
回复
up
寫程序當然是能有更好的方法來維護就用.
zhang21cnboy 2003-02-11
  • 打赏
  • 举报
回复
我认为,像上面的两个过程的编写思想还是很好的。至于说这样写代买支离破碎的老兄,我觉得可能是你没有过开发大项目的经验的原因。
1、这样写还是很方便的,
procedure SetSValue(Q:TQuery; sPara,sValue: string);
begin
Q.ParamByName(sPara).AsString := sValue;
end;
如果程序中有100地方调用了这个过程,假如你把该过程直接改变为一条语句的话,那么当你发现这条语句有问题的时候,你就需要修改100个地方,而如果使用了这个过程的话,你仅仅需要修改一个地方!!
大家可以去仔细体会者之间的差别!像这样的问题,对于现代的硬件条件,速度和空间上的差别我觉得用不着考虑。因为使用过程调用跟使用直接的内联代码,其差别仅仅在于一个调用的跳转指令!!
我个人认为,使用这样的过程,最大的意义在于方便我们的程序调试,程序维护,并不在于其它方面。
foreveryday007 2003-02-11
  • 打赏
  • 举报
回复
TommyTong(童童--#改变、突破#)
的說法正是我擔心的問題,
调用函数、过程,毕竟要经历一个压栈、出栈的过程?
來此就是請教此問題的是否對速度有所影響?

對於你所的說的
其次,过程SetSValue写得也不好,没有防御功能。
不知道是甚麼意思?

Wally_wu(不想再写代码) 與我意見相同

//這種語句用到的地方很多,我想寫成一個過程
procedure SetSValue(Q:TQuery; sPara,sValue: string);
begin
Q.ParamByName(sPara).AsString := sValue;
end;
寫此過程的目的
一是減少代碼數量(估計是一點點吧)
另外在整個項目中,AsString的出現相對來說減少很多(大家自己可以算算)
另一個目的再給大家看另一個類似的過程
procedure SetMValue(Q:TQuery; sPara,sValue: string);
begin
if sDataType <> '1' then //sDataType是何種資料庫的標誌
Q.ParamByName(sPara).AsMemo := sValue
else
SetSValue(Q, sPara, sValue);
end;
//此語句是對Memo類型的賦值;
請注意此處
if sDataType <> '1' then
對於不同的資料庫,有可能AsMemo,有可能AsString
此處好處就不用多說

//添加SQL的where語句並賦值
procedure SetSWhere(Q:TQuery; sPara,sValue: string);
對於這個過程,我想代碼量肯定是減少很多,自己可以算算

另外還有一目的,就是對於資料的加密,我想修改起來是不是很方便

速度才是要討論的重點,當然寫法確實比較另類;或者哪方面還有甚麼不妥之處





mrfanghansheng 2003-02-11
  • 打赏
  • 举报
回复
我觉得以现在的计算机性能来讲,这不会影响速度的,但还是觉得这样写有点支离破碎的感觉
Wally_wu 2003-02-11
  • 打赏
  • 举报
回复
To:TommyTong(童童--#改变、突破#) ( )
我不同意你的说法,因为从编译原理上来说,原理都是一样,因为同样要为每行个代码分配一定内存,不相信的话,查一下有关编译原理的书籍,并且好象《Delphi4开发大全》也提到。
墨梅无痕 2003-02-11
  • 打赏
  • 举报
回复
写出SetSValue()过程肯定是多余的,在速度上肯定慢于使用一条单一的语句,因为调用函数、过程,毕竟要经历一个压栈、出栈的过程,而一条语句是直接到寄存器的。

其次,过程SetSValue写得也不好,没有防御功能。
mrfanghansheng 2003-02-11
  • 打赏
  • 举报
回复
Wally_wu(不想再写代码) 说的也有些道理,但这样分模块是不是太细了?反而觉得有点过。大家说呢?
mrfanghansheng 2003-02-11
  • 打赏
  • 举报
回复
觉得对速度的影响应该不大,就是读起来怪怪的……呵呵
加载更多回复(8)

5,387

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧