reallike(认真学习Cpp用Cpp考虑delphi) 和 ZyxIp(绝望中...) 请进。关于面向对象的思想在实际编程中的应用!也同时欢迎其它高手进来讨论

PrettyMurphy 2003-08-30 02:02:00
reallike(认真学习Cpp用Cpp考虑delphi)和ZyxIp(绝望中...)

昨天看到你们的讨论,小弟受益无穷。从昨天一直想到现在。想我原来我的做法我的想法。对于面向对象一直不得要领。还想请教:

我从半年前开始用DELPHI写程序,在此以前一直用VB做东东,确切的说VB并不是完全面向对象的语言(这样说没错吧?),或者是我本人没有这种思想吧。用现在的眼光来看,原来我应该是一直是面向过程编程。

我以前做过一个点歌系统(VB写的),看代码几乎没有面向对象的概念在里面。所以,我想用DELPHI重写一遍,用面向对象的方法去写。练练手也好,刚好我又比较熟悉这些业务。其实点歌系统没有什么东西,所以我把定义了以下几个类:

T点歌钮=class(Tbutton) //多加些属性
T歌曲=class //总的歌曲
T分类歌曲=class(T歌曲) //分类的歌曲
T单曲=class(T分类歌曲) //对单一歌曲的描述

基本就是这些对象了,不知道这样分对不对?然后就是一些控制性的过程及函数。这些过程和函数需不需要也归类成一个对象?还是怎么样?还是把它们分散到T单曲或T分类歌曲的类中?

对于面向对象,我真是一知半解,请两位看一下我这样做好不好?怎么样做才算是符合面向对象?还有就是,如果我定义了这些类之后,我怎么样去在实际的开发中便用它们?比如我现在要把歌曲数据从数据库里面取出来然后显示到LISTVIEW里?怎么样去通过定义好的对象做到面向对象编程?

呵呵,不好意思,可能提的问题太多了,我当然希望两位能够帮忙回答这些问题,但是如果你们没空也没关系,我也一样感谢。如果分不够可以再开贴给分。我说用点歌系统做例子只是我比较熟悉这个业务。如果有其它例子也可以的。

总之谢谢你们。 :)
...全文
109 96 打赏 收藏 转发到动态 举报
写回复
用AI写文章
96 条回复
切换为时间正序
请发表友善的回复…
发表回复
lx47 2003-11-24
  • 打赏
  • 举报
回复
听课,做笔记,活活。
PrettyMurphy 2003-09-01
  • 打赏
  • 举报
回复
面向对象,首先就是考虑面向的“对象”是什么,自己面向的对象都不明确,

怎么在一个项目里面有针对性地作为?重点不明确,没有核心,会造成一种混乱。

把对象树立好了,再谈面向。如果对象树立不正确,再谈面向同样是空谈。

点,是通俗的说法,也就是说作出一种选择。当东西多了的时候,选择还是比较困难的。但是我们选择之后要做什么呢?播放,对,实质其实还是播放歌曲。所以我在点歌上面写下了,播放。哦,好了,我们所有的工作其实是为了播放而作的。

=======================================================================
哪个是对象哦?越来越糊涂了。(真的不好意思)
reallike 2003-09-01
  • 打赏
  • 举报
回复
我说的这些话好像没有人看:


我只是针对楼顶的对项目的分析的一些不恰当做法提出我的一些看法。

面向对象,首先就是考虑面向的“对象”是什么,自己面向的对象都不明确,

怎么在一个项目里面有针对性地作为?重点不明确,没有核心,会造成一种混乱。

把对象树立好了,再谈面向。如果对象树立不正确,再谈面向同样是空谈。

围绕对象来操作,才是面向对象的一个本质。

之后才是使用软件工程之类的技巧和经验。

对于这个问题,我打个比方,打个大一点的比方。可能FS从来没有想,但是我想了。

我们的人生,我们的人生所要面向的对象,也就是我们的人生目标你明确了没有?

人生目标明确再说逐步实施的细节,里面可能有坎坷,可能有幸福。但是都是细节

都是为我们的目标而服务的。但是大前提,就是找到对象。

再打一个比方,最近FS失恋,我就拿这个来打比方。

FS你是否考虑你的对象——嘿嘿,还真是对象——她到底是什么形象?什么素质?

你有没有目标,也就是对象?你是否真地树立了合理的对象?

假如你树立好了,中间任何不择手段的方法,仅仅是手段。:〉

好,咱们回到他的点歌系统,既然是点歌系统,那就要从点歌入手。

尽管看上去点歌确实简单,好像不值得做似的。但是它是核心。它才是最重要的。

因为要做的是“点”歌。而不是“管”歌,不是歌库,更不是点歌按钮……

如果从界面,从歌曲入手,那就出现实质性的失误,他们仅仅是细节,

尽管从技术含量来说好像比点歌来的困难,但是要分清主次。

好了,明确目标我再和FS讨论具体的实现。


既然没有人看,那也就算了。
PrettyMurphy 2003-09-01
  • 打赏
  • 举报
回复
:(

我又说错了什么?
reallike 2003-09-01
  • 打赏
  • 举报
回复
好吧,既然是这么想,点歌是那么实现的。你就那么做好了。

我看我的cpp primer去了哦。

:〉
reallike 2003-09-01
  • 打赏
  • 举报
回复
好吧,既然是这么想,点歌是那么实现的。你就那么做好了。

我看我的cpp primer去了哦。

:〉
PrettyMurphy 2003-09-01
  • 打赏
  • 举报
回复
reallike(认真学习Cpp用Cpp考虑delphi)

别罗。再讨论讨论罗。教别人同时也是在提高自已嘛。

:)
PrettyMurphy 2003-09-01
  • 打赏
  • 举报
回复
其实所有的问题都可以用面向对象的方法来分解吧?就如同我的标题一样。

不管是不是多余或者其它。只想用面向对象的观点来做就好。

那如果是“T歌曲类”不要的话。在哪里得到分类歌曲的数据?在“T单曲类”里面提供这种方法?好像不太好吧?放到公共模块里?那是不是有违面向对象的观点?

PrettyMurphy 2003-09-01
  • 打赏
  • 举报
回复
to reallike(认真学习Cpp用Cpp考虑delphi)


但是你这种做法合适吗?效率有吗?我不知道你用类管理歌曲有什么意义。

我看不出任何意义,你分一个目录,然后用getdir找到它,然后把文件加载到播放器就可以了。

甚至可以把建立好的路径放到数据库里面,然后通过检索找到合适的。
====================================================================
分类的结果是必须要显示出来的。因为用户只会去选择分类歌曲中的一首歌曲。
而且为了方便以后维护,每个歌曲文件不会固定存放哪个目录,只需与数据库中路径相对应即可。
用getdir找就等于在数据库里找。找出来的结果RECORDSET是必须要显示给用户看的。
这样的话,分类找记录的函数或过程应该放在哪里?做成公用模块?那样也可以完全不要创建类哇。

既然你的目的是点歌,那你就说点歌。可是你到现在都没有作任何点歌的措施。
==================================================================
我想,点歌的方法应该在“T单曲类”里面的方法里得到体现。包括播放及其它操作。

to ZyxIp(绝望中...)

我觉得还是不对头,你的 T单曲 并不是 T歌曲 的扩展,根本就不是继承关系,现实的这种“包含”并不对应类的层次 ,面向对象中“归类”是重要步骤,类描述了具有相似性质的一组对象。
===============================================================================
我想我是错了,ZyxIp(绝望中...) 说的对,T歌曲 只是单曲的组合已经,不是继承。

但是又回到了同to reallike(认真学习Cpp用Cpp考虑delphi) 一样的结论?

找出来的结果RECORDSET是必须要显示给用户看的。
这样的话,分类找记录的函数或过程应该放在哪里?做成公用模块?
ZyxIp 2003-09-01
  • 打赏
  • 举报
回复
给歌曲分类根本就不用TXXX的,而且也不用每一次用户选择分类方式的时候你才用SQL分类.

在给数据库录完数据后一次就分好了,将各种分类的结果保存起来。如用XML文件描述是这样子。
<按歌手分>
<歌手1>
<第1首 名字="给用户显示的名称" 位置="路径或数据库中记录的编程">
<第2首 名字="" 位置="">
</歌手1>
<歌手2>
<第1首 名字="" 位置="">
<第2首 名字="" 位置="">
</歌手2>
<歌手3>
<第1首 名字="" 位置="">
<第2首 名字="" 位置="">
</歌手3>
</按歌手分>
<按字数分>
<1字歌>
<第1首 名字="" 位置="">
<第2首 名字="" 位置="">

</1字歌>
<2字歌>
<第1首 名字="" 位置="">
<第2首 名字="" 位置="">
</2字歌>
<3字歌>
<第1首 名字="" 位置="">
<第2首 名字="" 位置="">
</3字歌>

</按字数分>
................

这样是冗于,但比你每次到数据库中查要快,而且就算你有10万首歌给用户提供10种分类方式,你查找时先在10个分类中找出对应的分类,然后将下面的数据顺序显示就可以了。
点歌系统太小了,我看根本体现不出面向对象编程的好处,它的难点在于技术上如何调用多种解码器来显示。在系统结构分析上就没有什么东西。
reallike 2003-09-01
  • 打赏
  • 举报
回复
如果这样说就是你们认为的面向对象的话,我退出吧。

因为讨论下去没意义。我实在不明白你们再想什么。我看书去了。
reallike 2003-09-01
  • 打赏
  • 举报
回复
唉,ZyxIp(绝望中...)

我稍一没有讲为什么不做选择,而是用派生类,你不理解…… 你果然也这么做。

用Case,你以为我没有想?我早就想到了,但是不合适。那不是多态!

用Case也提高不了效率,而且会把代码弄得冗长,还得分出许多Play的过程来。

我总是从效率入手。效率在我眼里是第一位的。

reallike 2003-09-01
  • 打赏
  • 举报
回复
既然你的目的是点歌,那你就说点歌。可是你到现在都没有作任何点歌的措施。
ZyxIp 2003-09-01
  • 打赏
  • 举报
回复
to reallike(认真学习Cpp用Cpp考虑delphi)

你的: 全局变量的使用与面向对象的讨论。 一直在看呀。

你上面的TChooseDVDSongs = Class(TChooseSongs)也看了,我觉得要只是放出声的话分到单曲也行了,用一个Play放所有类型
Case SongStyle of
DVD:;
VCD:;
MP3:;
.....
end;
如果每一种格式不只是Play 的方式不同,还有其它的更多的不同的可以将这个类分的更细一些,但也要充分利用多态性。

To PrettyMurphy(土豆) 你的
T歌曲=class
T单曲=class(T歌曲)

我觉得还是不对头,你的 T单曲 并不是 T歌曲 的扩展,根本就不是继承关系,现实的这种“包含”并不对应类的层次 ,面向对象中“归类”是重要步骤,类描述了具有相似性质的一组对象。

你的 T歌曲=class 只是一个单曲集合,如下定义会更明白一些。

T歌曲Item=Class
...
end;
如有必要可能给每个类型的歌定义一个类
TMP3歌曲=Class(T歌曲Item)
...
end;
TDVD歌曲=Class(T歌曲Item)
...
end;

下面是管理所有歌的类

T歌曲Items=Class
Private
FItems:Array of T歌曲Item;
public
property Items[Index:integer]: T歌曲Item +Ctrl_Shift_c;
end;
reallike 2003-09-01
  • 打赏
  • 举报
回复
晕,给歌曲分类还用得着类吗?没错,你做得没有错。

但是你这种做法合适吗?效率有吗?我不知道你用类管理歌曲有什么意义。

我看不出任何意义,你分一个目录,然后用getdir找到它,然后把文件加载到播放器就可以了。

甚至可以把建立好的路径放到数据库里面,然后通过检索找到合适的。

T歌曲,有意义吗?我现在问你。不能说用高射炮打蚊子,真的是大材小用。。。
reallike 2003-09-01
  • 打赏
  • 举报
回复
晕,给歌曲分类还用得着类吗?没错,你做得没有错。

但是你这种做法合适吗?效率有吗?我不知道你用类管理歌曲有什么意义。

我看不出任何意义,你分一个目录,然后用getdir找到它,然后把文件加载到播放器就可以了。

甚至可以把建立好的路径放到数据库里面,然后通过检索找到合适的。

T歌曲,有意义吗?我现在问你。不能说用高射炮打蚊子,真的是大材小用。。。
PrettyMurphy 2003-09-01
  • 打赏
  • 举报
回复
哦,那个按钮类去了也行。也有其它控件可以代替的。
PrettyMurphy 2003-09-01
  • 打赏
  • 举报
回复
其实更多的你只是着重去怎么实现,而我想知道怎么样去归类?

是,歌曲的分类在数据库里面有相应的字段去描述。选择怎么样的分类只是SQL语句的不同。

同样,播放只需要调用简单的API,对卡的操作也已经全部封装起来。

这些都不是我要关心的,我只是想为什么要这样分类?
reallike 2003-09-01
  • 打赏
  • 举报
回复
楼顶的,你别去关心什么界面。界面那就是小事情,把主要的弄好再说。

你先把你的按钮类给放一放。普通按钮先能用作点歌再说。

不久是换换按钮嘛。主要的不去做,反而做界面…… 不知道你想什么。
PrettyMurphy 2003-09-01
  • 打赏
  • 举报
回复
to reallike(认真学习Cpp用Cpp考虑delphi)

好,咱们回到他的点歌系统,既然是点歌系统,那就要从点歌入手。
尽管看上去点歌确实简单,好像不值得做似的。但是它是核心。它才是最重要的。
因为要做的是“点”歌。而不是“管”歌,不是歌库,更不是点歌按钮……
如果从界面,从歌曲入手,那就出现实质性的失误,他们仅仅是细节,
尽管从技术含量来说好像比点歌来的困难,但是要分清主次。

点,是通俗的说法,也就是说作出一种选择。当东西多了的时候,选择还是比较困难的。但是我们选择之后要做什么呢?播放,对,实质其实还是播放歌曲。所以我在点歌上面写下了,播放。哦,好了,我们所有的工作其实是为了播放而作的。

所以,我要建立一个抽象的基类,我在点歌左边写下了TChooseSongs
哦,他的第一个过程一定是个public的,因为它就是最重要的播放。
Procedure PlaySongs(FileName: String);Boolean; virtual; abstract;

为什么是虚函数后面会解释。
哦,文件名应该是被保护的,所以FFileName应该在private里面所以简单的基类建立了。如果有其他的功能扩充再说。

TChooseSongs = class
private
FFileName: string;
public
Procedure PlaySongs(FileName: String);Boolean; virtual; abstract;
end;

哦?如何访问FFileName呢?嗯,对了,我们需要一个方法,一个函数来传递FFileName。OK,我们就用Template Method来建立这个类,去得到FFileName。还需要一个过程来得到FFileName,不能直接来用。

TChooseSongs = class
private
FFileName: string;
protected
procedure DoLoadFile(FileName: string); Virtual; abstract;
private
Procedure LoadFile(FileName: string);
Procedure GetFileName; string;
Procedure PlaySongs(FileName: String);Boolean; virtual; abstract;
end;

template mothed就是如此了,很简单的LoadFile的代码实现。

Procedure TChooseSongsLoadFile(FileName: string);
begin
FFileName := FileName; //把得到的放到他该去的地方
if FileName <> '' then
begin
DoLoadFile(FileName);
end;
end;

Procedure TChooseSongs.GetFileName; string;
begin
Result := FFileName;
end;
各种歌曲文件的格式迥异,无法一下子说明表达。Mepg4的,DVD的,MP3的,real格式的,还有微软发布的一些格式。等等等。这个真得有点麻烦,而且还有其他的麻烦,比如说管理方面。嘿嘿,不怕,我们有派生继承这些,然后具体实现。

假设是DVD点歌那很简单,就是

TChooseDVDSongs = Class(TChooseSongs)
protected
DoLoadFile(FileName: string); override;
public
procedure PlaySongs(FileName: string): boolean; override;
end;

然后,实现具体的有关DVD形式歌曲的的播放,如果有其他的就扩展加入。

嗯,好了,到现在,实现了播放。但是,还有选择呢。嘿嘿,基类、派生类都在不断的完善,上面写的仅仅是个初稿。

既然叫choose song仅仅有Play song那还不叫choose,既然叫选择,那就明确目标,问问自己:

选择什么?选择歌曲。
为什么要选择?播放呗。
如何作出选择? …… 哈哈,问到点子上了,好,关键是如何作出选择。

歌曲多着呢,管理困难吗?不困难,我们有强大的数据库,合理的子目录。在乎这个?我说:NO!

上面所说的给歌曲加上类?T歌曲 = class?我不敢用……哈,不敢苟同,不是什么事情都需要类的,那会效率低下何必呢?建好数据库来管理,是很轻松的事情。

=================================================================================
我真的有认真看你回复的贴子,只是我太笨了,还请谅解,我觉得对点歌系统这个业务来说,你和ZyxIp(绝望中...) 对于类的划分思想大致是一样的吧?(有不同吗?能指出来吗?)

我只是觉得我

T歌曲=class
T单曲=class(T歌曲)

这样划分为什么不好哦?就是这点不明白。我这样分是不是有违面向对象的观点?还是可以这样分只是多余?我觉得T歌曲类做T歌曲类做的事,T单曲类做T单曲类做的事。还是我对面向对象的观点又错了?(或许你们已经回答了这些问题,但是能不能再通俗一点的讲一下?因为,我比较笨)

ZyxIp(绝望中...) 说:
分类只是一个索引一样的东西,T单曲才是最终是操作的实体。单曲的存在与分类,如何分类并没有什么关系,所以T单曲和T分类歌曲根本就不是一类,并不存在什么继承关系
=================================================================================
我觉得T歌曲类并不仅仅是一个索引一样的东西哇,它有好多事要做呢。T单曲是T歌曲众多歌曲里面的一首歌曲哇?对于单曲来讲必须要做自已独特的事情(播放暂停等等),为什么不存在什么继承关系呢?

加载更多回复(76)

5,386

社区成员

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

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