询问:功能到底如何设计才能复用?
如何抛开功能,设计一个能复用和容易扩展的类?
我设计了一个加密类。然后把加密方法作为类的成员方法; 然后又设计了一个解密类,把解密方法作为加密类的成员方法。 但是老大说这个不好复用。 我就不明白了,要用的时候直接包含这个类的头文件就好,为什么还是说不好复用呢?
究竟怎么样才算好复用?
//加密类
class CEncode
{
public:
//加密方法,这个方法提供给外部使用
bool Encode(const string& strOriginal, string& strEncoded, string& strErrorMsg);
private:
//判断是否为加密字符串,防止重复加密
bool IsEncodedString(const string& strToCheck, string& strErrorMsg);
//先用Base64编码方式加密
bool EncodeToBase64String(const string& strOriginal, string& strBase64, string& strErrorMsg);
//替换Base64字符串中的特殊字符
bool ReplaceSpecialCharacterInBase64String(const string& strBeforeReplaced, string& strAfterReplaced, string& strErrorMsg);
//把替换特殊字符后的字符串再次加密
bool EncryptBaseOnRepalceaString(const string& strAfterReplaced, string& strEncryptedAgain, string& strErrorMsg);
// 最后加上加密标识
bool AttachEncodeTag(const string& strAfterEncypted, string& strFinal, string& strErrorMsg);
}
我在设计类的时候找不到面向对象的感觉。完全是以功能为中心设计类的,非常痛苦,没有任何成员变量,就是把一些方法拼凑在一起,放在一个类中。
请各位高手指点指点?就针对这个类来说。 另外,如何是真正的功能复用?我不太明白。 我以为是设计一个类,然后哪里要用,就把这个类的.h文件和.cpp文件拷贝过去,然后用就好了。
[解决办法]
建议可以这样:从用户的起角度来看,用户只关注加,解密方向。并且输入必要的外部信息,这些外部信息在构造接口输入即可。
class CEncode
{
public:
//将替换Base64字符串中的特殊字符 ,此处可以放在构造接口,因为这是加解密必须要用的,
CEncode(string strbefore, string strafter)
//初充解密方向
bool Decode(const string &strEncoded, const string &strOriginal, string &strErrorMsg);
//加密方法,这个方法提供给外部使用
bool Encode(const string& strOriginal, string& strEncoded, string& strErrorMsg);
private:
//判断是否为加密字符串,防止重复加密
bool IsEncodedString(const string& strToCheck, string& strErrorMsg);
//先用Base64编码方式加密
bool EncodeToBase64String(const string& strOriginal, string& strBase64, string& strErrorMsg);
//把替换特殊字符后的字符串再次加密
bool EncryptBaseOnRepalceaString(const string& strAfterReplaced, string& strEncryptedAgain, string& strErrorMsg);
// 最后加上加密标识
bool AttachEncodeTag(const string& strAfterEncypted, string& strFinal, string& strErrorMsg);
}
[解决办法]
你的类设计有如下问题:
1.类没有保存任何信息,但是你要求用户生成一个类的实例,比如说CEncode ecode();ecode.Encode("orignal",……),既然类不保存任何信息,声明成static函数是不是更方便呢?CEncode::Encode("orignal",……)
2.既然设计成类,类应该保存一些必要的信息,方便用户使用,你的类需要用户外部传入的东西太多(你的函数是3个引用,用户需要在外部生成3个string对象),而且这些传入的引用在你个各个内部函数之间相互传送,这是完全没有必要的,string& strErrorMsg等完全可以作为类的一个成员变量,而不应该是在各个函数之间调用,弄得所有函数接口都错综复杂,别人看你的代码会很费力,如果我作为一个用户,我期望的方法是:
CEncode ecode();
if(edode.Encode("the string before encode")){
string result = ecode.getEncodeResult();
//基于result做一些其他操作
}else{
cout<<ecode.getErrorMsg();
}