面向对象 之 封装带来的好处

本文介绍了一种用于比较DataObj对象的方法,通过封装简化了不同类型之间的比较操作。原先的方法涉及大量重复代码,改进后的方法更加简洁高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


DataObj支持int float double三种类型,现在要设计一个less than函数,比较两个DataObj,并将结果存入到result中。一种实现:

inline void lt_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { (this->*lt_call_table[index])(obj1, obj2, result); } inline int lt_int_int_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { int64_t int1,int2; obj1.get_int(int1); obj2.get_int(int2); return result.set_int(int1 < int2); } inline int lt_int_float_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { int64_t int1; float float2; obj1.get_int(int1); obj2.get_float(float2); return result.set_int(int1 < float2); } inline int lt_int_double_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { int64_t int1; double double2; obj1.get_int(int1); obj2.get_double(double2); return result.set_int(int1 < double2); } inline int lt_float_int_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { float float1; int64_t int2; obj2.get_float(float1); obj1.get_int(int2); return result.set_int(float1 < int2); } inline int lt_float_float_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { float float1; float float2; obj2.get_float(float1); obj1.get_float(float2); return result.set_int(float1 < int2); } inline int lt_float_double_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { float float1; double double2; obj2.get_float(float1); obj1.get_double(double2); return result.set_int(float1 < double2); } inline int lt_double_int_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { double double1; int64_t int2; obj1.get_double(double1); obj2.get_int(int2); return result.set_int(double1 < int2); } inline int lt_double_float_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { double double1; float float2; obj1.get_double(double1); obj2.get_float(float2); return result.set_int(double1 < float2); } inline int lt_double_double_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { double double1; double double2; obj1.get_double(double1); obj2.get_double(double2); return result.set_int(double1 < double2); }

还好只有三种类型,只写了3*3中组合,如果还有更多类型,那就累死了!如何改进这个过程?封装。


inline int lt_(const DataObj &obj1, const DataObj &obj2, DataObj &result) { int err = ERR_SUCCESS; bool val; if (obj1.can_compare(obj2)) { val = (obj1 < obj2); result.set_int((int64_t)val); } else { err = ERR_INVALID_ARGUMENT; } return err; }


只要DataObj内部实现比较函数即可。

bool DataDataj::operator < (const DataDataj &that_obj) const { bool result = false; int err = DATA_SUCCESS; _DatajValue this_value; _DatajValue that_value; DataDatajType type = get_type(); switch (type) { case DataIntType: err = get_int(this_value.int_val); if (DATA_SUCCESS == err) { err = that_obj.get_int(that_value.int_val); if (DATA_SUCCESS == err) { result = this_value.int_val < that_value.int_val; } } break; case DataVarcharType: err = get_varchar(this_value.varchar_val); if (DATA_SUCCESS == err) { err = that_obj.get_varchar(that_value.varchar_val); if (DATA_SUCCESS == err) { result = this_value.varchar_val < that_value.varchar_val; } } break; case DataFloatType: err = get_float(this_value.float_val); if (DATA_SUCCESS == err) { err = that_obj.get_float(that_value.float_val); if (DATA_SUCCESS == err) { result = this_value.float_val < that_value.float_val; } } break; case DataDoubleType: err = get_double(this_value.double_val); if (DATA_SUCCESS == err) { err = that_obj.get_double(that_value.double_val); if (DATA_SUCCESS == err) { result = this_value.double_val < that_value.double_val; } } break; } return result; }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值