最近看了一遍文章<复杂是软件的死敌>http://news.csdn.net/a/20110424/296461.html,而自己刚好在整合flash, ppt, image, video播放器的逻辑处理,且程序写了大半。原来只有video play方面的功能,若在当时要是先看到这遍文章,估计会再三考虑是否要做整合方面的工作。
Thinkvd软件播放结构简单如下图:
此播放模式以PlayUI为核心,是界面基本的逻辑操作,如play的start, pause, resume, stop, snapshot等。它对下操作具体控制的逻辑处理接口(或者说调用方法),对上就是界面业务的需要,实现不同的布局。分离业务逻辑与界面逻辑以利于将来扩展。如将来想支持pdf,且只需要在control上加上pdf方面的控制处理及UI布局,它不会影响先前的video, flash等模块。
如flash的播放方式与ppt的不同,需要实现不同的逻辑来处理。
此次整合,把原来的video与PlayUI分离了,新的play control接口更新如下:
class ImPlayBase : public QObject
{
public:
ImPlayBase (lpShareMemData data, QObject *parent=0)
: QObject(parent)
, m_parent(parent)
, m_lpSMD(data){
m_atTimer = new QTimer(this);
m_atTimer->setInterval(40);
};
virtual ~ImPlayBase ()
{
}
virtual int init() = 0;
virtual int open() = 0;
virtual int start() = 0;
virtual int pause() = 0;
virtual int resume() = 0;
virtual int stop() = 0;
virtual int close() = 0;
virtual int seek(int pos) = 0;
virtual int shotsnap() = 0;
virtual void render() = 0;
virtual void renderFresh() = 0;
virtual void setVolume() = 0;
virtual int getVolume() = 0;
virtual int isRunning() = 0;
virtual void changeAudio(int pos) = 0;
virtual void next(){;}
virtual void prev(){;};
void setData(lpShareMemData data){ m_lpSMD = data; }
lpShareMemData getData(){ return m_lpSMD; }
void setListItem(ImListTreeItem *item) { m_listItem=item; }
ImListTreeItem *getListItem() { return m_listItem; }
public:
lpShareMemData m_lpSMD;
QTimer *m_atTimer;
protected:
/* data */
QObject *m_parent;
ImListTreeItem *m_listItem;
};
在此过程中,也遇到不少问题,从逻辑关系上来说,主要把原来的继承关系改成组合关系, 并把原来的功能按业务逻辑拆分。