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

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;

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

其實我是比較喜歡這種寫法;維護起來方便,代碼一致性也比較好;
有一個問題不懂:速度上是否有所影響?
向各位請教!!
...全文
43 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)
Gidot box的存在意义: 1,节约你的搜索时间:让你从“想要搜索”到“看见结果”,仅需要等待你键入关键字的几秒钟,节约你的时间并尽可能让搜索操作不打断和分散你的思路。从而降低工作时的脑力损耗。 2,快速打开你想要的程序或文件或网址:让你在想执行某个程序或打开某文件时,只需要敲打一两个字母并回车即可。 Gidot box的使用效果: ·不用Gidot box: 产生需要搜索的想法 -> 打开浏览器(或切换到浏览器窗口) -> 输入网址并打开搜索引擎(或选中激活浏览器上的搜索框) ->输入关键字并回车 -> 查看结果 ·使用Gidot box: 产生需要搜索的想法 -> 按快捷键激活Gidot box ->输入关键字并回车 -> 查看结果 Gidot box可以双手不离键盘;而平常搜索过程可能需要鼠标点击,或者用更复杂的键盘操作实现搜索。 Gidot box可以移动到屏幕的任何位置。搜索“软件界面”或“图片上”的文字时不必来回拖拽着浏览器了。 G Gidot box的存在意义: 1,节约你的搜索时间:让你从“想要搜索”到“看见结果”,仅需要等待你键入关键字的几秒钟,节约你的时间并尽可能让搜索操作不打断和分散你的思路。从而降低工作时的脑力损耗。 2,快速打开你想要的程序或文件或网址:让你在想执行某个程序或打开某文件时,只需要敲打一两个字母并回车即可。 Gidot box的使用效果: ·不用Gidot box: 产生需要搜索的想法 -> 打开浏览器(或切换到浏览器窗口) -> 输入网址并打开搜索引擎(或选中激活浏览器上的搜索框) ->输入关键字并回车 -> 查看结果 ·使用Gidot box: 产生需要搜索的想法 -> 按快捷键激活Gidot box ->输入关键字并回车 -> 查看结果 Gidot box可以双手不离键盘;而平常搜索过程可能需要鼠标点击,或者用更复杂的键盘操作实现搜索。 Gidot box可以移动到屏幕的任何位置。搜索“软件界面”或“图片上”的文字时不必来回拖拽着浏览器了。 Gidot box快捷键列表: 激活或隐藏吉特盒子:alt 空格 快速切换搜索引擎:alt 数字键1-6 移动吉特盒子在屏幕上的位置:alt 键盘方向键(在使用多显示器时,此功能只能在主屏幕使用 ) 英语辞典查询:输入单词后,按shift 回车 在百度知道里搜索:输入关键字后,按ctrl alt 回车 手气不错功能:ctrl 回车(可直接打开百度结果页首个结果的网址)比如输入:宜家,按ctrl 回车,浏览器就会自动打开宜家的官方网站。或者输入:卓越,浏览器会自动打开卓越亚马逊的网站。 清空吉特盒子上的关键字:esc或者ctrl 退格键 查找并切换历史搜索记录:键盘上下方向键 Gidot box配合百度引擎的另类小技巧: 1、计算器:直接输入算式并回车,则百度显示计算后的结果,比如输入:12345678 87654321 2、天气预报:输入北京天气或者上海天气,回车后百度显示当地今天及未来两天的天气预报。 3、查询火车票:比如输入北京到葫芦岛,回车可显示各车次及余票情况。 4、汇率查询:输入 50美元=?人民币 即可看到50美元当前能兑换多少人民币。

5,928

社区成员

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

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