最近成果

好久没写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

 

下面是软件截图:

主界面,具有动态效果

最近成果_第1张图片

 

 

 

最近成果_第2张图片

你可能感兴趣的:(设计模式,mvc,socket,String,mfc,扩展)