C++小技巧——空对象
先看以下C++代码:
CLanguageHandler* pLanHander = getLanguageHandler(iLanCode); if(NULL != pLanHander) { pLanHander->translate(strText); } else { cout<<"Do not support this language!"<<endl; }
CLanguageHandler* CToolManager::getLanguageHandler(int iLanCode) { switch iLanCode { case LAN_CODE_CHN: { return m_pChnHandler; } case LAN_CODE_ENG: { return m_pEngHandler; } case LAN_CODE_JPN: { return m_pJpnHandler; } default: { return NULL; } } }
其中m_pChnHandler,m_pEngHandler等是CLanguageHandler各个子类的指针。红色部分代码,由于getLanguageHandler()方法对于不支持的语言类型返回NULL,就有了这块判空逻辑。看到if...else总是让我们眉头一皱,能不能把这块逻辑去掉,让代码更简洁,更优雅些呢?我们可以使用空对象来解决哦!空对象就是使用一个空的类,来封装空操作或者错误处理,达到简化代码逻辑的目的,以下是使用空对象后的代码:
CLanguageHandler* pLanHander = getLanguageHandler(iLanCode);
pLanHander->translate(strText);
CLanguageHandler* CToolManager::getLanguageHandler(int iLanCode) { switch iLanCode { case LAN_CODE_CHN: { return m_pChnHandler; } case LAN_CODE_ENG: { return m_pEngHandler; } case LAN_CODE_JPN: { return m_pJpnHandler; } default: { return m_pDefaultHandler; } } }
void CDefaultHandler::translate(const std::string& strOrigText) { cout<<"Do not support this language!"<<endl; return; }
可以看到,没有了判空逻辑,程序更加清爽,默认处理也被巧妙封装到虚函数中。相比起23种设计模式来说,空对象只能算是一种小技巧,但是确实非常易学好用,可以和工厂、享元等设计模式结合起来使用,以减少代码中的坏味道。