我在编一个类,但遇到一些疑惑,请大家指教:Type
Tabc=class
private
a1:integer;
public
procedure Seta1(q:integer);
Function ddd:boolean;
Function hhh:boolean;
end;implementationprocedre Tabc.seta1(q:integer);
begin
a1:=q;
.....
end;function Tabc.ddd:boolean;
begin
....
end;function Tabc.hhh:boolean;
var
b:integer;
begin
......
seta1(b)
ddd
......
end;我总觉得这个hhh方法有点别扭,它只是一个调用Tabc类中方法的方法,可以将它从Tabc类中剥离出来,而Tabc类不受影响,我完全可以在其他单元需要调用hhh方法时粘贴这段代码。问题是我需要把hhh作为一个公用的函数。
请问大家我该如何修改,程序结构才合理。
Tabc=class
private
a1:integer;
public
procedure Seta1(q:integer);
Function ddd:boolean;
Function hhh:boolean;
end;implementationprocedre Tabc.seta1(q:integer);
begin
a1:=q;
.....
end;function Tabc.ddd:boolean;
begin
....
end;function Tabc.hhh:boolean;
var
b:integer;
begin
......
seta1(b)
ddd
......
end;我总觉得这个hhh方法有点别扭,它只是一个调用Tabc类中方法的方法,可以将它从Tabc类中剥离出来,而Tabc类不受影响,我完全可以在其他单元需要调用hhh方法时粘贴这段代码。问题是我需要把hhh作为一个公用的函数。
请问大家我该如何修改,程序结构才合理。
不过如果你:
procedure Seta1(q:integer);
改为
property Al:integer read _al write _al;
更加直观一些。也不用写setall的函数增加开销了
procedure Seta1(q:integer);可以用屬性來代替
结构也不是太乱 有功底 努力吧
Function ddd:boolean;这两个函数你为什么要公共呢?就你这个情况,这两个东西应该给你的类内部使用,放到private里面去,结构就合理了
Type
Tabc=class
private
a1:integer;
procedure Seta1(q:integer);
public
Function ddd:boolean;
Function hhh:boolean;
end;
有什么不一样的吗?
还有……
procedre Tabc.seta1(q:integer);
begin
a1:=q;
.....
end;
因改不光是赋值A1这么简单,后面还有其他工作,怎么能用属性来代替呢?
1 类主要是封装实现,即使你里面“别扭”也不要让外面别扭
2 如果是你出现了“重复的调用”,你应该考虑:是否函数接口设计有问题/是否可以简化/将外面不用的函数用在private里
3 如果你的hhh是一个完整的功能,即使只是几个对其他函数的调用,也应该写在类里面,而不是外面,外面关心的应该是逻辑上的结构,而不是实现的步骤。
4 放在里面多了一次调用 ,而copy到外面会增加代码,并且不易维护。对系统开销的影响不很大,建议放在里面
不过看你对hhh的分类如何分而已!一般放在Tabc下很好!
如果是通过setal来访问al变量的话。
那么
call .......
mov ...,eax
和直接
mov ...,self+delta
(这里delta表示al:integer字段的偏移量)
来比。
前一个的运行周期要长些。(通过服务器中转)
(2003-08-01 09:21:20)
还有一点
(通过服务器中转)
(2003-08-01 09:22:21)
而call则保存下一个指令的地址,然后无条件跳转到xxxx处。
(通过服务器中转) 运行栈(不知道是否这样说)会增大....................
(2003-08-01 09:24:16) qxj
把你的话贴到贴子上去
(2003-08-01 09:23:43)
具体内容就不太清楚了。呵呵,我在Delphi版来之前,总在C++ Builder潜水,看了别人讨论过很多这方面的问题
Tabc=class
private
Fa1:integer;
procedure Seta1(q:integer);
public
Function ddd:boolean;
Function hhh:boolean; property AL: integer read fAL write SetAL;
end;
我认为这样是比较合理的,没有必要把hh提到外面去。
type
tabc=class
private _al:integer;
public
procedure setal(q:integer);
property al:integer write _al;
end;
procedure tabc.setal(q:integer);
begin
_al:=q;
end;然后var abc:tabc;
begin
abc:=tabc.create;
abc.setal(10);
abc.al:=10;
abc.free;
end;
从abc.setal(10)开始反编译:
调用 abc.setal(10):
mov edx,$0000000a
mov eax,ebx
call tabc.setal
其中abc.setal:
mov [eax+$04],edx
ret
而调用:abc.al:=10:
mov [ebx+$04],$0000000a
靠~~区别一下就看出来了。
property al: integer write setal;(只写)或者
property al: integer read _al write setal;(读写)
本来的hhh过程是从外部拷贝到类中来的,总觉得hhh和类没有多大关联(只是单独实现功能罢了,完全可以剥离出来),放入类觉得结构不合理, 但firetoucher说道“hhh是一个完整的功能,即使只是几个对其他函数的调用,也应该写在类里面,而不是外面,外面关心的应该是逻辑上的结构,而不是实现的步骤”,使我消除了这种误解。
其次在hhh中seta1(b)的写法应按ImFool所说a1:=b写法,这样才会使hhh方法和这个类才更紧密点。
另外,seta1是不是用作属性,并不是我要问意思,不过还是要感谢 Eastunfail,我会尽量把seta1改为属性