当前位置: 首页 > 科技观察

API是这样设计的?等程序挂了!

时间:2023-03-12 23:54:56 科技观察

本文转载自微信公众号《编程珠玑》,作者守望老师。转载本文请联系编程诸暨公众号。假设提供的接口的输入参数比较复杂,有些人可能会考虑使用结构体作为输入参数。一想到这样做,灾难就接踵而至……例子://来源:公众号【编程珠玑】//作者:看守先生//api.h#includestructParam{intnum;std::stringstr;};voidTestFun(constParam¶m);//api.cc#include"api.h"voidTestFun(constParam¶m){std::cout<<"num:"<structParam{intnum;std::stringstr;std::stringext;};voidTestFun(constParam¶m);//api.cc#include"api.h"voidTestFun(constParam¶m){std::cout<<"num:"<#includeclassParam{public:voidSetNum(intnum);intGetNum()const;voidSetStr(conststd::string&str);std::stringGetStr()const;voidSetExt(conststd::string&str);std::stringGetExt()const;Param();private:classParamImpl;std::unique_ptrparam_impl_;};voidTestFun(constParam¶m);这里的头文件中只提供了setter和getter,完全没有暴露成员。具体成员的设置在ParamImpl中实现://api.cc//来源:公众号编程明珠//作者:守望先生#include"api.h"classParam::ParamImpl{public:intnum;std::stringstr;std::stringext;};Param::Param(){param_impl_.reset(newParamImpl);}//析构函数必须有Param::~Param()=default;voidParam::SetNum(intnum){param_impl_->num=num;}intParam::GetNum()const{returnparam_impl_->num;}voidParam::SetStr(conststd::string&str){param_impl_->str=str;}voidParam::SetExt(conststd::string&ext){param_impl_->ext=ext;}std::stringParam::GetStr()const{returnparam_impl_->str;}std::stringParam::GetExt()const{returnparam_impl_->ext;}voidTestFun(constParam¶m){std::cout<<"num:"<