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毫秒