zoukankan      html  css  js  c++  java
  • Effective C++ 学习之宁以nonmember,nonfriend替换member函数

    C++中资源是按照对象的方式来管理的。就拿我们正在使用的Browser来说,他管理各种各样的资源,其中包括cache,浏览记录,下载的历史记录,Cookies记录以及一些webapp的本地记录。我有个习惯就是会定期的清理一下这些资源。现在就来看看Effective C++中给的一些设计建议吧。

    我们可以不假思索的写出以下的类来:

    class WebBrowser {
    public:
            ......      
        void clearCache();
        void clearHistory();
        void clearCookies();    
            .....
    };

    恩,这就简单实现了一下资源的封装,为了更进一步的封装我们可能会写一个WBManagement类来间接的操作管理WebBrowser里的资源。

    class WBManagement {
        void clearWebBrowser(WebBrowser& wb)
        {
        wb.clearCache();
        wb.clearHistory();
        wb.clearCookies();
        }
    };

    嗯,对资源的封装来说这也是一个不错的方法,在实际工作采取的更多的也是这种方法。不过,C++提供了一个使用起来更顺手的一个东西就是命名空间:

    namespace WebBroserStuff {
    class WebBrowser {
    public:
        void clearCache();
        void clearHistory();
        void clearCookies();    
        };
        void clearWebBrowser(WebBrowser &wb);
    }

    注意了命名空间后面可不像class一样后面后那个分号的呃。

    以上的方法不由得使我想到了C++之父那本书上第十章给出的一些忠告:

      1.只将那些需要直接访问类的表示的函数作为成员函数

      2.使用命名空间,使类与协助函数之间的关系更明确

    如果将类的协助函数放到类中会引来另外两个问题:

      1.使类的界面复杂化,我们在实际的开发中也会遇到别人将接口定义的很复杂的情况,而且给你一大堆的函数让你自己组装。这会浪费掉很多的开发时间,自己写的类然后给别人提供尽可能简单明了的接口是必须的。

      2.当你的类内部发生变化的时候你需要检查的函数就会变多,这让你整个类的弹性就大大的降低

    将协助函数放到namespace 而不是Management中还有一个优点就是,我们可以将namespace 分拆到好几个文件中而class没有这个特性。

  • 相关阅读:
    C语言源代码——计算任何一天是星期几
    计算任意一天是星期几
    wpf利用线程制作初始界面和关闭窗体特效
    实用的 集合工具类 和 String工具类
    从“关于Java堆与栈的思考”一帖看错误信息的传播
    web.xml 配置中classpath: 与classpath*:的区别
    git的安装-环境变量配置
    解决Oracle安装时报错“SID已在使用”办法
    ORACLE日期时间函数
    Java 开发环境配置
  • 原文地址:https://www.cnblogs.com/lzh2nix/p/3080757.html
Copyright © 2011-2022 走看看