这一篇,应该说是满满的诚意了。很早之前就有完成此篇的打算,奈何一直没有时间。要么是沉迷于编码无法自拔,要么就是执着于释放身心的游戏而偷偷爽快不已。今天,我们说说老牌软件的一个趋势,和对应的某些技术细节的实现点。可能有点长,看这写吧。过长可能会考虑分篇章。
首先我们可以认识到这个趋势,国内对于自主研发基础软件的形式欣欣向荣。等到基础软件开发到一定阶段,平台化是很多软件厂商选择的一个方向。谁能精心雕琢、浑然天成的先集成最优秀的软件模块到自己平台(不管是自己开发还是买买买),就有可能打造国内航母级的工业(云)软件平台。
我们就只谈谈技术方面吧。老牌的公司,有一些沉淀了,也有几款自己不错的基础软件,这时候就可能想到如何把自己已有的这些软件集成到一个平台上来。是类似应用商店的存在,但又不仅仅是应用商店。不仅支持应用的自主上下架发布、授权管理等等等等,应用还能支持数据上云、多应用间拓展交互等等(当然这也是平台化的好处和亮点)。
已有应用的平台化是需要的,但是非必须。对于平台的整体体验来说,一些公司应该会考虑到应用界面的统一管理,并且最大程度减少平台化开发工作量,避免应用重构,往往会选择在已有的应有基础上做最小的改动。这时候不得不考虑到已有应用界面嵌入到平台的问题了。
具体嵌入怎么实现?怎样保证嵌入的应用方式稳定?又怎样保证嵌入的应用能够优雅退出? 嵌入的应用异常崩溃如何能保证不影响平台客户端呢?这里面涉及到比较多的问题,经过这段时间的摸爬滚打,这一套处理博主基本已经得心应手~ 具体的实现后续再开一篇讲一下。
平台客户端的集成差不多都是这个套路。说到底目前都有两个绕不过的技术方案:
我们对成熟的平台软件分析,很容易得到一些技术上的启发。譬如wps,网页嵌入必然使用的是cef,当前部分页面的展示可能也用到了webkit。
应用上的嵌入,wps的excel、ppt 等很明显是独立应用,启动之后却能在一个客户端上展示,这里猜想无非有两种方式:一种是启动之后嵌入,另一种就是excel.exe 之类的只是触发了启动的请求,真正通知启动的还是平台(没有具体研究,但是觉得这种穿裤子差屁股的方式应该不会是。),所以启动后嵌入应用的可能性极大。
肚子饿了,干饭去。后续再聊~
随便贴点东西,啥dn说审核不过也不知道原因。
#include <windows.h>
class ActionDelayPolicy_NoWait;
class ActionBase // Only needed if you want to use polymorphically different actions
{
public:
virtual ~ActionBase() {}
virtual void run() = 0;
};
template < typename Command, typename DelayPolicy = ActionDelayPolicy_NoWait >
class Action : public DelayPolicy, public Command,public ActionBase
{
public:
virtual void run() {
DelayPolicy::wait(); // inherit wait from DelayPolicy
Command::execute(); // inherit command to execute
}
};
class Action2:public ActionBase{
public:
virtual void run(){
cout << "start running ." << endl;
}
};
// Real executed code can be written once (for each action to execute)
class CommandSalute
{
public:
void execute() { std::cout << "Hi!" << std::endl; }
};
class CommandSmile
{
public:
void execute() { std::cout << ":)" << std::endl; }
};
// And waiting behaviors can be defined separatedly:
class ActionDelayPolicy_NoWait
{
public:
void wait() const {}
};
// Note that as Action inherits from the policy, the public methods (if required)
// will be publicly available at the place of instantiation
class ActionDelayPolicy_WaitSeconds
{
public:
ActionDelayPolicy_WaitSeconds() : seconds_( 0 ) {}
void wait() const { ::Sleep( seconds_ ); }
void wait_period( int seconds ) { seconds_ = seconds; }
int wait_period() const { return seconds_; }
private:
int seconds_;
};
// Polimorphically execute the action
template <typename Action>
void execute_action( Action& action )
{
action.run();
}
// Now the usage:
int main()
{
// 基于模板函数实现的静态多态
Action< CommandSalute > salute_now;
execute_action( salute_now );
Action< CommandSmile, ActionDelayPolicy_WaitSeconds > smile_later;
smile_later.wait_period( 2000); // Accessible from the wait policy through inheritance
execute_action( smile_later );
}