开发区域

先进与MATLAB软件开发

逆你内心的控制狂!

Arvind的最近的帖子有我的思考。虽然检查他概述了只是为了便于说明,实际上它的一个例子显示强国,易用性和MATLAB的连通性。我想加入,能够展示一两个软件设计模式。今天我想继续Arvind曲流的校对者的例子有点控制反转的话题。

控制反转有时被称为好莱坞原则:

“别给我们打电话,我们会打电话给你!”

它是构建软件的技术,鼓励创造抽象,避免直接依赖于组件和服务,使软件的工作。当第一次遇到它可以有点违反直觉,但它促进灵活性和模块化像没人管!大外卖是组件应该避免工作本身,而是依赖合作者能实现的抽象。明白了吗?不是真的吗?让我展示的例子。看看解释清楚构造函数从去年开始的帖子:

函数解释清楚obj =(变长度输入宗量)%提供Jazzy MATLAB进口com.mathworks.spellcheck。*;%设置一个默认的语言。obj。字典= (“en_USx.dic”);%的默认%创建一个奔放的校对者obj。处理解释清楚= ();obj.Handle.setDictionary (obj.Dictionary);obj.Handle。verbose = true;结束

这个看起来无伤大雅,但不实践的原则。在这个构造函数代码片段设置字典产权明确,以及创建我们的拼写检查引擎(Jazzy)。这对小程序是可以的,但是这种方法使我们更大系统的刚度。校对者现在有具体依赖奔放的图书馆和这个特殊的字典。这意味着我们不能用拼写检查技术没有花哨的(像一个不同的拼写检查引擎,也许-nojvm模式),或在缺乏英语词典。

“当然!”你可能会说,“否则我们会做什么吗?”你可能会问。毕竟,我们需要调用这个代码在某处,在构造函数中为什么不?好吧,让我们删除其中一个很难看到它怎样做的依赖关系。今天我将展示这个字典文件,虽然相同的过程仍将适用于拼写检查引擎一样。

所需的方法是创建一个抽象,而不是硬编码哪一个字典在构造函数中,我们应该通过抽象。我们问我们的实例提供的创造者我们依赖,而不是自己创建一个具体的版本,我们依靠直接在构造函数中。不错的好处是,当我们问这个在构造函数中输入,提供更多的可能性在未来开放的东西可以通过的。周围随着世界的发展,我们看到,这将导致更大的灵活性和反应能力在环境变化和重用我们的软件不是设想建立之时。

对于我们的检查,我们删除的显式引用字典。第一步是创建一个抽象:

classdef字典< matlab.mixin.Heterogeneous属性(抽象)DictionaryFile结束结束

注意,我已经标记它异构因为我想利用MATLAB的基本数组大自然,但我想这样做不同的字典实现。

现在我们有了抽象的抽象我们可以操作要求,它被传递到构造函数:

函数检查程序=解释清楚(字典)%留住我们的字典检查程序。字典=字典;%创建jazzy校对者检查程序。处理= com.mathworks.spellcheck.SpellCheck ();checker.Handle.setDictionary (dictionary.DictionaryFile);checker.Handle。verbose = true;结束

这完全是微妙的!但是我喜欢看到这个。在我心中理想的构造函数是什么也没做,而是通过设置属性的值。如果我们做这个练习再次处理属性的我们也会通过的SpellCheckEngine或一些这样的所有构造函数会将设置这两个属性。

这是一个完整的简单版本供参考检查。(注意取决于小java代码开发几个帖子前)。

classdef解释清楚属性字典;结束属性(GetAccess =私人SetAccess =不可变)处理;结束方法函数检查程序=解释清楚(字典)%留住我们的字典检查程序。字典=字典;%创建jazzy校对者检查程序。处理= com.mathworks.spellcheck.SpellCheck ();checker.Handle.setDictionary (dictionary.DictionaryFile);checker.Handle。verbose = true;结束% %检查方法检查输入字符串函数检查(检查器,inputStr) checker.Handle.checkSpelling (inputStr);结束结束结束

无论如何,现在我们在这个抽象操作我们可以开始创建一些字典来完成:

classdefAmericanEnglishDictionary <字典属性DictionaryFile =“en_USx.dic”;结束结束
检查程序=解释清楚(AmericanEnglishDictionary);checker.check (“你说MALTAB吗?”);
输入:MALTAB建议:MATLAB

哦!事实上:

checker.check (“你说MATLAB ?”);

沉默是金。

但这并不工作:

checker.check (“你会说MATLAB ?”);
输入:你会说建议:印度手鼓

…也不应该,因为我们说不同的语言。没问题,让我们为西班牙语和我们做同样的事情是很好的:

classdefMexicanSpanishDictionary <字典属性DictionaryFile =“es_MXx.dic”;结束结束
检查程序=解释清楚(MexicanSpanishDictionary);checker.check (“你会说MATLAB ?”);

El silencio es奥罗。

好,现在我们正在全速前进但是我们希望我们可以把这个抽象。我们不再需要与个体语言文件,实现词典可以做任何事情,只要忠于它字典接口。例如,让我们看看我们是否可以使用这个照顾整个大陆,即北美。首先,我们需要两个字典的加拿大人,一个英语:

classdefCanadianEnglishDictionary <字典属性DictionaryFile =“en_CAx.dic”;结束结束

和一个法国字典。我的道歉法国加拿大人!我知道这是不正确的,但似乎我们展示这个概念的奔放的库没有fr_CAx。dic文件。抱歉,但幽默我这会让我们通过例子。

classdefCanadianFrenchDictionary <字典属性DictionaryFile =“fr_FRx.dic”;结束结束

到目前为止我们只能操作一个字典。然而,现在我们在外部操作抽象代码仍然使用这种抽象的实现完全不同。例如,现在没有什么阻止我们实现这个可重用的多语种词典构建的所有字典我们已经有了:

classdefMultiLingualDictionary <字典属性DictionaryFile;结束方法函数dict = MultiLingualDictionary(文件、词典)dict.DictionaryFile =文件;%打开字典文件并添加所有字典语言。需要%开放使用utf - 8编码,奔放的字典的格式。(文件标识,味精)= fopen(文件,' w ',“本地”,“utf - 8”);断言(文件标识> 0,味精);清洁= onCleanup(@()文件关闭("));idx = 1:元素个数(字典)流(文件标识,fileread(字典(idx) .DictionaryFile));结束结束结束结束

,马上我要用它来征服强大的北美拼写检查问题!

northAmericanDictionaries = [MexicanSpanishDictionary AmericanEnglishDictionary CanadianEnglishDictionary CanadianFrenchDictionary]
northAmericanDictionaries = 1 x4异构字典(MexicanSpanishDictionary, AmericanEnglishDictionary、CanadianEnglishDictionary…)数组没有属性。

现在让我们通过词典为我们的新数组MultiLingualDictionary我们好了。

检查程序=解释清楚(MultiLingualDictionary (“northAmerican.dic”northAmericanDictionaries));checker.check (“你会说MATLAB ?”);checker.check (“你说MATLAB ?”);checker.check (“Parlez-vous MATLAB ?”);checker.check (“你说MATLAB,嗯?”);

我有点想要最后一个对我大喊大叫。这是今天两个打击我的加拿大朋友。

好了,我们现在一个更灵活的系统,至少作为字典管理。我离开对你做同样的事情的锻炼拼写检查引擎。

你怎么认为?你相信吗?你是一个控制反转专家了吗?告诉我你如何在MATLAB应用这项技术。




发表与MATLAB®R2015b

|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。