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
}
于是怎么办呢?
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 */ }
};
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;
}
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;
}
};
int main()
{
CFactory* pFactory = CFactory::GetInstance();
CProcess* pProcess = pFactory->NewProcess();
pProcess->CreateProcess();
delete pProcess;
delete pFactory;
return 0;
}
回顾一下吧, 我们一共做了3件事情: 1) 用#ifdef条件编译代码. 2) 多态继承提高代码逻辑. 3) factory模式提供统一接口减少#ifdef的使用.
目前就看了这些东西, 可是我觉得所有的东西都要通过一个factory还是有些麻烦的, 不知道wxWidget之类的library是怎么弄的, 呵呵, 反正后面的章节讲了再说.
还有个问题就是以上的做法适用于C++, C怎么办呢...额.....



