免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: VIP_fuck
打印 上一主题 下一主题

[C++] 面向对象好在哪儿 [复制链接]

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
21 [报告]
发表于 2015-03-04 08:55 |只看该作者
回复 21# zdschinaunix


    教科书上有点看书就好啦~

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
22 [报告]
发表于 2015-03-04 09:20 |只看该作者
面向对象就是一个蹩脚的演员,在小舞台上可以让人娱乐,大舞台上问题多多。不过比过程性的还是稍微强一点。

论坛徽章:
0
23 [报告]
发表于 2015-03-04 11:00 |只看该作者
db1984 发表于 2015-02-28 11:11
好处是给你个虚拟的对象,缓解程序员生活中没对象的痛苦


好象很有道理啊

论坛徽章:
0
24 [报告]
发表于 2015-03-05 11:16 |只看该作者
koenig在C++沉思录中说他一般不提OOP,因为他的OOP是指使用继承和动态绑定的编程方法。
但OOP这个东西我认为是思想,无论你使用语言是否有继承,封装,多态的特性支持,你依然可以抽象后面向对象。
一个反例,来自C++沉思录序幕,koenig大师比较了什么是C++可以做好而C做不好的,C++和C作为所有程序员和编程爱好者都有了解的语言,我觉得是最好的范例。
大师写了一个简单的类,代码如下所示:
#include <stdio.h>
class Trace
{
    public:
        Trace() { noisy = 0; f = stdout;}
        Trace (FILE* ff) { noisy = 0; f = ff; }
        void print(char* s)
            {
                if(noisy)
                    fprintf(f, "%s" , s);
            }
        void on() {noisy = 1;}
        void off() {noisy = 0;}
    private:
        int noisy;
        FILE *f;
        
};
我们可以发现,一段简单的跟踪实现,包含了两个特性:可以打开或关闭跟踪输出,可以打印到控制台以外的输出设备上,比如文件。
大师给出了一个典型的C语言实现:

#include <stdio.h>
static int noisy = 1;
void trace(char* s)
{
    if(noisy)
        printf("%s\n",s);
}
void trace_on()
{
    noisy = 1;
}
void trace_off()
{
    noisy = 0;
}
很好,典型的C风格解决方案,第一个特性完美解决,但问题来了,如果我们想添加一个其他的输出方式,比如C++例子中的文件输出,应该对这些代码进行多大的改动呢?
在我想来典型的解决方案大概是这样的:
#include <stdio.h>
#include <stdlib.h>
static int noisy = 1;
enum OUT
{
    StdOut=0,
    File=1
};
void file_print(const char* s)
{
    FILE* pFile;
    pFile = fopen ( "myfile.txt" , "wb" );
    fwrite (s , sizeof(s), 1 , pFile);
    fclose (pFile);
}
void trace(const char* s,const enum Out out)
{
    if(noisy)
    {
     switch(out)
        {
           case StdOut:
                        printf("%s",s);
                        break;
           case File:
                        file_print(s);
                        break;
           default:
                        break;                  
        }
    }
}
void trace_on()
{
    noisy = 1;
}
void trace_off()
{
    noisy = 0;
}
嘛,看起来就不那么优雅了,但的确解决了功能问题。如果想要指定一个文件名,我们还需要加一个参数,或者加一个全局变量;
仔细对比,如果不关注 file_print 函数中开关文件具体的实现的话,我们干了什么事情?
为trace函数添加了一个参数,增加了trace函数中的判断。
如果我们main函数中正好使用file_print在向某一个文件输出,那么我们还可以随意使用trace_off切换开关状态嘛?如果我们想切换至标准输出呢?
于是我们就需要实现一个专门的trace_out函数用来切换输出状态,与此同时file_print也要加上循环检测,判断某参数表示的当前使用何种方式输出。
对于这一点,koenig大师的总结是,使用C带来的这些麻烦的根源在于,添加最开始情况下不需要的状态信息非常麻烦.......
但是我觉得麻烦的是手段(代码改动大),但如果思路清晰的话,使用函数指针,可变长数组等方法依然可以让你用面向对象的方法写程序,而不是把业务仅仅视作一个个逻辑过程,这样对于业务变动,会越来越难以维护.

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
25 [报告]
发表于 2015-03-06 15:14 |只看该作者
此前一直是做小模块的工作,没有从大局考虑的意识。所以体会不到OOP的优点或者缺点。

其实现在体会的也是不多。我在捉摸原因,想了很长时间也想不明白。写代码的时候还是按照第一步干什么,第二步干什么的思路解决。还是不会用C++的方式想问题。

后来看boost的示例,忽然有点儿,,顿悟,,的赶脚。

之所以不会用C++的思路,就是一直用C的,已经习惯了。所以设计模式这种东西虽然看得懂,但是不会用的原因也就找到了。

于是现在我开始学习用C++方式解决问题,做不到那么牛逼,先习惯它的工作方式再说。

这是最近一点工作和学习心得吧。

如果有什么想法,就继续来发帖吧。

感谢各位大牛参与讨论。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP