computer 版 (精华区)
发信人: remember (学海无涯·回头是岸), 信区: program
标 题: 关于抽象
发信站: 听涛站 (2001年12月09日03:23:51 星期天), 站内信件
也许,大家知道什么叫类,但是对如何编写程序总觉得有点
无法操控的感觉。诚然,我本科阶段也一直没有领悟好如何叫面
向对象,总觉得自己写出来的程序貌似而神非,这学期的课让我
获益菲浅——其实以前我也没有见过这些书,这堆书的中文翻译
还是最近1年出的。
题目有了,我们应该如何抽象,如何安排类,如何利用类完
成我们的工作?还有,当程序需要扩展的时候,我们的程序如何
才有足够好的可重用性?
毕竟,我也刚入门了2个月而已,可能见解不一定正确。就
我认识和大家探讨探讨吧。
首先,毋庸置疑,我们需要定下来我们需要做什么。我们应
当以软件、程序的用户的角度去分析问题:这个软件究竟有什么
用?就这次的作业而言,有以下几点:
1.读文件; 2.判断字符是否左右括号; 3.压栈;
4.退栈; 5.判断字符是否匹配; 6.报错
接下来,我们应该根据软件需要实现的功能中抽取我们需要
解决的问题中的主要实体,也就是主要的名词:
1.文件; 2.字符; 3.栈; 4.错误;
还有其中涉及的一些协同的操作:主要指控制流。
好,就这些名词分别分析其功能,看看是否有重合的地方,
本例中似乎没有。
下一步看来应该编写我们的类的架构了——还不是具体的
程序,只是架构,就接口,简单说就是public函数。
1.文件:读,就是read之类的函数;
2.字符:给字符赋值;判断字符是否左右括号;判断字符
是否和另一字符成为括号对;
3.栈:建立栈空间;压栈;退栈;查看栈顶元素;
4.错误:设定错误内容;显示错误;
接下来我们应该看看是否已经有现有的类可以使用:这个
也是面向对象程序中重要一环,重用代码。
显然,我们可以知道,标准库提供了ifstream以供读文件;
char作为字符类型;stack作为栈这种数据结构的实现;string
可以用作记录错误内容字串。
我们决定文件和栈类直接使用标准库,字符类因为需要完
成一些我们特定的操作,我们自己编写。错误类也只能自己编
写了。
自己编写字符类,到底应该如何编写?是从char继承(先
不讨论char是否可以继承),还是使用char?同样,错误类应
该使用string,还是继承string(也不讨论string是否可以继
承)?
看情况,不能一概而论,原则上,一种东西是另一种东西
的话,公开继承很适合表现这一关系,例如公鸡是一种鸡,那
么要实现公鸡类时,从鸡类继承就很合理。但是,这里我们发
现字符的特点和char有较大差别:我们需要判断是否匹配,而
不在乎它是否一个字符。同样,错误也不只是一个string,还
包含了其他string所不具有的特性,而这特性不适合用继承塑
造——至少我这么认为。
ok,说到这,框架大体也出来了,我写一下我认为合适的
类体声明吧:
class CToken {
public:
int Setchar(char c); //设定字符
int IsOpenToken() const; //判断是否左括号
int IsCloseToken() const; //判断是否右括号
int IsCorresponding(CToken t) const; //判断是否匹配
private:
char _c; //或用int c_index; 这个部分我就不讨论了
};
class CError {
public:
int SetErrorString(string &s); //设定错误提示
virtual void display(); //显示错误
private:
string _s;
};
当然,我们的CToken类可以考虑使用模版来提高可重用性。
我们的CError中的display函数设为需函数也便于重载。
不知道大家对这个分析有没有意见?
--
洛阳亲友如相问 一片冰心在玉壶
※ 来源:·听涛站 tingtao.dhs.org·[FROM: 匿名天使的家]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:0.950毫秒