日历
网志分类
展开全部
· ***    All     ***
· ***    Mood    ***
· ***    Life    ***
· *** Technology ***
· ***     Yc     ***
· ***  Cartoon   ***
· *** Collection ***
· ***  Unsorted  ***
媒体播放器

Get the Flash Player to see this player.
SkyDrive is currently not available.

站内搜索
友情链接
· 我的歪酷 非非共享界
· 风雨妖虹
· kingbeful@csdn
· 手心的太阳@瞬间十年
· Moment@Travis
· 江南麒麟居
· εз毛线团εз
· 乌拉的neverland
· 碾过的日子 闲也陶陶
· 狡兔三窟 *^.^*
· 橄榄林的风
· 水色の街
· Powerful and delicate, Life struggling
· 阿德咖吧
· 陷阱
· 风之华
· vkobe的Neverland@@
· 白日梦已死 · 伤越夜海
· 望天
· 空の軌跡
· 没什么好东西的空间
· 心情...咖啡屋
· 随风独自凉
· Some where i belong
· .★·°双晨·故事°☆ .
· BigWorld的记事本
· *Sara's*
· 人生若只如初见
· 宠辱不惊闲看庭前花开花落·去留无意漫随天外云卷云舒
· 我思我不在
· 飞扬飘雨
· lazy的猫猫
常用链接
· [Google]
· [Google Accounts]
· [IT Items]
· [Telnet@Yanxi]
· [Wikipedia]
· [Linux Manpages]
· [Mofile.com]
· [163888.net]
· [fm.qq.com]
· [Proxy]
· [Animepaper.net]
· [FreeproxySite]
· [gonwan@fc2]
· [skydrive.live.com]
· [gonwan@lifelogger]

订阅 RSS

0109802

歪酷博客

逆さまの蝶
In this Craziness
Uncertainy
一人一人の想いを
僕らは何処かに遺せるだろうか

In this Craziness
You gave me life
一つの想いを
僕らは何処まで守れるだろうか



« 上一篇: 困 下一篇: 额..无聊... »
丸子·酱 @ 2008-07-15 13:23

    最近在看的书, 公司的项目总是一阵一阵的, 唉... 就当记下笔记:

1. Make All of Your Platforms a Priority
    其实就是如果你要跨平台, 那么不要光支持windows这样的主流平台, 即使这个是盈利最多的. *nix, osx, bsd都要有相同的features, 不能删减. 所以对于一个新的feature, 所有平台的可行性都要先survey一下. 如果不行, 那么这个feature就不要加. 这样, 也便于修改bug.

2. Code from a Common Codebase
    主要是说要提供一个抽象层, 抽象OS相关的API, 然后就可以调用同一的抽象层API继续开发. 书上举了一个创建进程的例子, win32下是CreateProcess(), *nix下是exec*()系的函数, 我们要做的就是把这些函数抽象出来, 提供一个统一的API比如CommonCreateProcess()之类的东西.
    本个item提供了一种利用继承多态, Factory模式实现的例子, 似乎还不错, 但是我怎么觉得wxWidget的代码用的好像不是这种strategy啊- -...以后再说.
    对于platform-independent, 有一些方法:

1) 我们最容易想到的方法是用#ifdef之类的宏来区分:

int CommonCreateProcess()

{

#ifdef WIN32

    // win32 implementation

#endif

#ifdef LINUX

    // linux implementation

#endif

}

    可是, 如果所有的函数都这样写的话要累死的, 不是么? 而且debug也很累人的.
    于是怎么办呢?

2) 之后我们想到了OOP, 继承, 多态, 多好用啊:

class CProcess

{

    virtual int CreateProcess() = 0;

};

class CWindowsProcess  : public CProcess

{

    virtual int CreateProcess() {  /* windows implementation */  }

};

class CLinuxProcess  : public CProcess

{

    virtual int CreateProcess() {  /* linux implementation */  }

};

    调用的时候么, 很显然, 依然用#ifdef宏, 然后多态.

int main()

{

#ifdef WINDOWS

    CProcess* pProcess = new CWindowsProcess;

#endif

#ifdef LINUX

    CProcess* pProcess = new CLinuxProcess;

#endif

    // now you can use the pProcess pointer to do something.

    pProcess->CreateProcess();

    delete pProcess;

    return 0;

}

    好了好了, 至少比1)中的代码要好多了, 可是你依然看到了很多的#ifdef. 既然作为API, 我想这种东西是不应该出现的. 而且, 如果不光是CProcess这一个类, 如果还有其它的, 比如文件操作CFile类, 那么又是老长的一串#ifdef. 那怎么办呢?

3) 提供Factory类, 且多态支持:
    思路就是, 把所有的#ifdef都放到一个factory类中, 代码大概是这样的:

class CFactory

{

    virtual CFactory* GetInstance()

    {

        static CFactory* pFactory = 0;

        if (!pFactory)

        {

#ifdef WINDOWS

            pFactory = CWindowsFactory::GetInstance();

#endif

#ifdef LINUX

            pFactory = CLinuxFactory::GetInstance();

#endif

        }

        return pFactory;

    }

    virtual CProcess* NewProcess() = 0;

    virtual CFile* NewFile() = 0;

};

class CWindowsFactory  : public CFactory

{

    virtual CWindowsFactory* GetInstance()

    {

        static CWindowsFactory* pFactory = 0;

        if (!pFactory)

        {

            pFactory = new CWindowsFactory;

        }

        return pFactory;

    }

    virtual CProcess* NewProcess()

    {

        return new CWindowsProcess;

    }

    virtual CFile* NewFile()

    {

        return new CWindowsFile;

    }

};

class CLinuxFactory  : public CFactory

{

    virtual CLinuxFactory* GetInstance()

    {

        static CLinuxFactory* pFactory = 0;

        if (!pFactory)

        {

            pFactory = new CLinuxFactory;

        }

        return pFactory;

    }

    virtual CProcess* NewProcess()

    {

        return new CLinuxProcess;

    }

    virtual CFile* NewFile()

    {

        return new CLinuxFile;

    }

};

    好长的代码-.-.. 其中CProcess是CWindowsProcess和CLinuxProcess的父类, CFile是CWindowsFile和CLinuxFile的父类. 可以看到, #ifdef只出现在了一个地方, 我们要加新的类到各个platform的时候只要简单的加一个类, 并在factory类中加一行就好了. 调用的时候大概是这样的:

int main()

{

    CFactory* pFactory = CFactory::GetInstance();

    CProcess* pProcess = pFactory->NewProcess();

    pProcess->CreateProcess();

    delete pProcess;

    delete pFactory;

    return 0;

}

    呼.. 清爽了很多. 这件事情告诉我们, design pattern很好用.

    回顾一下吧, 我们一共做了3件事情: 1) 用#ifdef条件编译代码. 2) 多态继承提高代码逻辑. 3) factory模式提供统一接口减少#ifdef的使用.
    目前就看了这些东西, 可是我觉得所有的东西都要通过一个factory还是有些麻烦的, 不知道wxWidget之类的library是怎么弄的, 呵呵, 反正后面的章节讲了再说.

    还有个问题就是以上的做法适用于C++, C怎么办呢...额.....




评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定