利用策略与工厂模式构建的闭源功能模型库,如何进行快捷的功能扩展与完善?

[复制链接]
查看11 | 回复10 | 2021-1-27 05:15:51 | 显示全部楼层 |阅读模式
利用策略与工厂模式,构建了某闭源的功能模型库,主要用于无人飞行器上的自主寻的制导。现将骨干程序抽离如下:首先定义了导引律接口(Interface),在C++中采用了纯虚函数来实现,然后采用公有继承的方法,实现了三种典型的导引律,包括:比例导引律(PN)、修正比例导引律(APN)和追踪法导引律(TPN)。相关代码如下图所示:
//导引律枚举
enumHOMINGLAW
{
PN,//比例导引律
APN,//修正比例导引律
TPN,//追踪法导引律
}
classGuidanceLaw
{
public:
GuidanceLaw();
virtual~GuidanceLaw();
public:
virtualBOOLInitialize()=0;
virtualvoidAdvance()=0;
//其它代码
…………
};
classPNGuidanceLaw:publicGuidanceLaw
{
//具体实现
BOOLInitialize();
voidAdvance();
};
classAPNGuidanceLaw:publicGuidanceLaw
{
//具体实现
BOOLInitialize();
voidAdvance();
};
classTPNGuidanceLaw:publicGuidanceLaw
{
//具体实现
BOOLInitialize();
voidAdvance();
};
在实现了上述三种典型的导引律基础上,采用策略与简单工厂模式,完成了自主寻的制导功能模型的开发,概述如下:
classGuidance
{
public:
Guidance():pGuidanceLaw(NULL)
{
}
Guidance(HOMINGLAWlaw)
{
switch(law)
{
casePN:
pGuidanceLaw=newPNGuidanceLaw;
break;
caseAPN:
pGuidanceLaw=newAPNGuidanceLaw;
break;
caseTPN;
pGuidanceLaw=newTPNGuidanceLaw;
break;
default:
pGuidanceLaw=newPNGuidanceLaw;//默认采用比例导引律
break;
}
}
virtual~Guidance();
//其它操作代码
…………
protected:
GuidanceLaw*pGuidanceLaw;
…………
};
在实际使用上述闭源模型过程中,用户提出需要新增一至两种导引律(也就是要增加GuidanceLaw的若干种具体实现)。因为提供的功能库仅为二进制形式,无法直接修改源码,造成了功能扩展的不便。那么,应该如何才能够便捷地实现上述功能呢?或者说,在设计功能模型时,应该如何优化实现方案,以便满足用户实际使用过程中的快捷功能扩展?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:15:51 | 显示全部楼层
这个世界上唯一不变的就是变化。要拥抱变化。
回复

使用道具 举报

千问 | 2021-1-27 05:15:51 | 显示全部楼层

//1.查询
voidword_input();//接受用户输入
//实现中可能需要根据输入语言产生分支(英译汉汉译英)
voidword_search(char*);//在数据库中查询
voidword_print();//显示查找结果
voidhistory_add();//新增查询历史
voidhistory_print();//显示查询历史
//2.测试
voidtest_mode();//选择测试模式
{
intidx;
cin>>idx;
switch(idx)
{
case1:
//给单词选含义
case2:
//给例句选单词
//...
default:
}
}
voidchoose_meaning();//给单词选含义
voidchoose_word();//给例句选单词
//...
//想法:被测试单词的选择依据其等级
//3.添加例句
voidsentence_locate();//定位生词
voidsentence_input();//输入例句
voidsentence_add();//添加例句
voidsentence_print();//显示例句
//4.单词分级
voidset_rank();//设置(调整)分级
voidauto_rank();//自动调整等级
voidmanu_rank();//手动调整等级
voidget_rank();//获取现有等级
/*
想法:分级方式:(根据艾宾浩斯)
0:生词,从未背过
1:今日学习
2:1天前
3:2天前
4:4天前
5:7天前
6:15天前
7:一个月前(之后不再安排复习)
等级改变规则:
复习通过,自动升级
复习未通过,根据情况清零为0,或降级,或平级
手动设置优先
问题:怎么保证手动设置优先?
*/

//5.调整记忆策略
voidset_strategy();//设置记忆策略
voidload_strategy();//载入记忆策略
voidreset_strategy();//重置记忆策略
voidget_strategy();//获取现有记忆策略
//可能的记忆策略
voiddaily_strg();//每天固定数量
voidddl_strg();//按截止日期
//...
//记忆策略下属规则
voiddaily_new();//每日新词
voiddaily_review();//每日复习
voidset_test();//安排测试
//...
//6.生词统计
voidread_file();//读取文本
voidword_input();//输入待统计单词
voidword_search(char*);//查找待统计单词
voidword_count(char*);//单词计数
voidprint_count();//显示统计结果

回复

使用道具 举报

千问 | 2021-1-27 05:15:51 | 显示全部楼层
你现在的架构好像做不到。
使用动态加载类,每种导引律实现提供单独的dll,主程序读取配置文件,加载相应dll,在该dll中获取getinstance的函数地址,调用生成导引律子类实例。要增加新的导引律只需要增加新的dll并修改配置文件。
回复

使用道具 举报

千问 | 2021-1-27 05:15:51 | 显示全部楼层
看看应该如何优化实现方案,以便满足用户实际使用过程中的快捷功能扩展
回复

使用道具 举报

千问 | 2021-1-27 05:15:51 | 显示全部楼层
hao很好非常好
回复

使用道具 举报

千问 | 2021-1-27 05:15:51 | 显示全部楼层
引用1楼zhao4zhong1的回复:这个世界上唯一不变的就是变化。要拥抱变化。
谢谢赵老师的回答。在系统地学习《C++API设计》这本书过程中,对其中的一个设计准则“对修改关闭,对扩展开放”一直不理解,直到遇到了上面的那个实际问题。我在想,这些设计准则的终极目标是不是都是为了应对“二级制模式下的修改完善”。这样一来,对闭源模型库的设计,就提出了非常高的要求。
回复

使用道具 举报

千问 | 2021-1-27 05:15:51 | 显示全部楼层
引用3楼face_t0_sea的回复:你现在的架构好像做不到。
使用动态加载类,每种导引律实现提供单独的dll,主程序读取配置文件,加载相应dll,在该dll中获取getinstance的函数地址,调用生成导引律子类实例。要增加新的导引律只需要增加新的dll并修改配置文件。

谢谢你的回复。
我理解,你的意思是不用提供Guidance这个“外观”类,而是将实现的多种导引律用DLL形式封装,并且提供GuidanceLaw这个抽象类(或者说“接口”)。这样一来,可以由用户在自己的主程序中自行确定导引律的具体样式。
这确实是一种解决方案,但在实现过程中可能有些问题,因为在Guidance外观类中,除了GuidanceLaw这个子类之外,还有非常多的功能子类。如果都由用户编写代码,会非常不便,不知道这种情况应该如何解决?
回复

使用道具 举报

千问 | 2021-1-27 05:15:51 | 显示全部楼层
顺序有关的代码。
用一个函数封装。
公共代码,用库封装
接口代码,用抽象类封装

回复

使用道具 举报

千问 | 2021-1-27 05:15:51 | 显示全部楼层
1.用dll做plugin是扩展的通常做法。不少sdk提供这种框架给用户做扩展,比方说Steinberg的VSTSDK,host和plugin的代码都有。
《C++API设计》讲的太笼统,没有细节,当然细节不好讲。
2.用户码和核心码区别对待,你的意图和GenerationGap的意图相似。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行