您的位置:首页 > 其它

最近成果

2009-04-30 22:17 351 查看
好久没写blog了,最近太忙了
因为一些项目发展和个人的事,搞到很多东西要想
因为项目经常需要演示,经常跑到电信研究院,呆上一天等领导看演示,搞到精神很累。
好久没认真学jxta,p2p,
没时间帮一个师兄做个小软件(sorry),
更没有时间去搞自己的小软件,
昨天早上项目有演示,演示完,感觉轻松一点,下午上了一下qq,看看新闻,突然感觉好久没见世面了,忍不住在qq上签名:“突然发现好耐无用电脑”(其实天天用电脑,但都在写代码,改代码)。
最近终于屏蔽一切其他外部因素,重写之前演示用的软件,因为原来设计上问题实在不能容忍了,代码臃肿,扩展性差,复用性不强,(所有这些都是面向对象所讨厌的),为了项目和实验室能在这个项目上继续发展下去,终于决定闭关去重构代码。这次重构,又对oo,设计模式,项目开发有一定深入了解。经过之前设计模式学习,对面向对象有点理解,再加上实践软件重构,看了一些关于基本的oo项目计划以及软件工程的知识,对这些知识有不少感悟,感觉软件设计真是博大精深,如果想在软件设计上学精,不仅仅是代码能力需要提升,设计能力更为重要,如何设计一个扩展性好,能对变化应对自如的软件结构,需要多加实践学习!!(重构,这是个很好实践机会)加油咯zhbh

大概讲一下我最近重写的代码吧,由于实验室项目原因,不能公开资料,只能谈下相关东西:
1)在网络编程块,设计了两个类,分别是CServerSocket以及CClientSocket类,分别对应服务端以及客户端
class CServerSocket
{
protected:
SOCKET server;
bool bRunThread;
int _port;
protected:
int startWSA();
int cleanResource();
public:
CServerSocket(int port);
int setSockOpt(int level,int optname,const char* optval,int optlen);
int close();
public:
virtual void beginThread() = 0;
virtual void stopThread() = 0;
virtual void onReceive() = 0;
virtual void onSend() = 0;
virtual void onClose() = 0;
int reserve(string strCmd);
virtual ~CServerSocket();
};

server抽象类有两个重要接口 beginThread以及stopThread 这两个接口主要负责开启线程,在它的继承类(CTCPServerSocket,CUDPServerSocket)中实现了
class  CClientSocket
{
protected:
string _IP;
int _Port;
SOCKET client;
protected:
int startWSA();
int cleanResource();
public:
CClientSocket(string ip,int port);
virtual int setIPAndPort(string ip,int port) = 0;
virtual int sendMsg(const char *sendBuf,int sendLen) = 0;
virtual int recvMsg(char *recBuf,int recMaxLen) = 0;
int setSockOpt(int level,int optname,const char* optval,int optlen);
int close();
int reserve(string strCmd);
virtual ~CClientSocket();
};

client类主要负责一些简单的收发操作
在socket类设计上,使用了select模型,本来目的是方便移植到linux系统上,现在还没做这部分工作,只设计了mfc的dll供调用
2)在服务上,由于暂时存在三种服务,媒体,列表,以及调用播放服务,为了以后服务的扩展(这个等下第4)还有东西要提到),将其分别设计服务端以及客户端,服务端主要通过继承CResponse(响应类)来实现。
class CCallPlayResp:public CResponse
{
private:
static string strType;
static string strInfo;

CAbstractControl *pMediaCtrl;        //用于响应操作
CTreeCtrl *pDevTree;         //用于查找当前设备
CAppConfig *pConfig;
public:
CCallPlayResp(CAbstractControl *pCtrl,CTreeCtrl *pTree,CAppConfig *pCon);
void response(string strRecvMsg,SOCKET *sock);       //CResponse纯虚函数
private:
void praseMsg(std::string strRecvMsg, std::string &strStoreDevID, std::string &strURL,std::string &strName);
int getDevIP(string strStoreDevID,string &strIP);

};

3)调用播放服务继承CResponse后,可以再CTCPServiceServer中加载以及卸载服务
class CTCPServiceServer:public CTCPServerSocket
{
private:
vector<CResponse*>vecResp;
public:
CTCPServiceServer(int port,int iMaxLinkNum = 64);
void loadService(CResponse *pResp);
void unloadService(string strType);
void unloadAllService();
void onReceive();
private:
CResponse* getInstance(string strType);
};

通过loadService来加载服务,参数为CResponse对象,易于扩展服务(其他服务也通过loadService来加载)
4)在考虑一下业务扩展,可能还需要对这个方式做一下修改,加载服务不单单是双方协议规定的服务,应该扩展到双方实际未协商的服务,这个服务机制简单考虑了一下,利用html做界面显示,利用soap协议做后台信息交互实现双方服务获取,这种方式应该可以比较容易做到,再考虑一下其它方法,有时间就做一个试试,扩展性,需要考虑的东西太多了。
5)在重构时,为了使用还没有用过的MVC模式的威力,就尝试使用(虽说不能为了用模式而用模式,但是对于初学者,感觉还是要硬是用一下,才能体现他的好,他的不好),在做服务客户端时,就用到mvc模式,Control用于获取用户操作消息,分发数据给model,model获取消息后,做网络处理,以及把响应消息发到view上,view去更新界面显示,这个
mvc感觉用得还是有点作用,至少可以将层次分开了,当我给师弟这个框架时,师弟也很容易使用这种框架,虽然还可能不大清楚底层是怎么一个机制(什么observer,什么strategy等)。
6)界面设计利用mfc设计,考虑采用加载皮肤的方式,可以随时更改皮肤界面,生成新的dll,在程序中,可以很容易的通过dll来获取接口,更新界面,非常简便。
7)程序基本使用c++标准库,没有使用什么mfc的库(除了一些线程函数,一些界面设计),所以相对来说很容易移植到wince,移植到linux上的,迟点有时间就会做这些版本出来
8)软件考虑先在实验室内部使用,算是一个公测吧?呵呵,如果有机会,可以分享到这里,供大家批点指正)

总结:
越来越对oo感兴趣,学习设计框架,学习面向对象设计软件。
以前的语法问题,到实际用时会莫名奇妙,因为不知原因...
现在感觉用起来有点得心应手,至少我知道为什么这样做...
软件设计不能急,不能拿到一份需求就立刻写代码,早几天看书对”每天写500行代码的人“有一番评价,不做设计直接写代码会造成项目很大危害,应该合理设计正确类,设计调用关系,模块化,提高程序复用,扩展性,当设计好之后,写代码是自然而然的事情,所以一个项目才会出现项目管理,架构师,系统分析师,程序员,测试人员这么一大堆,不然,只需要程序员就ok啦!而且经过详细设计后,写出来的bug也会少,也容易发现,因为都是模块调试嘛!

好了,祝大家5.1快乐,准备回宿舍了,bye

下面是软件截图:
主界面,具有动态效果



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: