23 May 2011
SourceMate 是 Flash Builder 的添加产品,它能够提供许多高级编码工具并且能够将各种强大功能赋予Flex和ActionScript 开发人员。 SourceMate 具有众多功能,但通过自动操作和简化许多令人心烦意乱任务的其中一个任务(而作为开发人员,我们从来不喜欢这些任务),常常只有一种功能可以消除一天的单调乏味的编码工作。 本文引入SourceMate概念并且描述许多SourceMate添加到Flash Builder 4.5中的常用代码生成、重构、全局化和本地化功能。 关于SourceMate 提供的所有重要功能的列表信息,请参见ElementRiver网站的SourceMate 产品页面。
本节描述的三个功能-生成事件类、获取界面以及获取方法-仅仅让你体验一下SourceMate 提供的全重构和代码生成功能。 目前问世的重构方式很多,其中包括 Change Method Signature、Extract Variable、Inline Method 或Variable以及 Disable/Remove trace() 语句等。
你需要派发你自己的自定义事件吗? 创建一个事件类在开始时似乎非常简单,但这里有很多细节和缺陷容易遗忘。 你曾经将你的事件类型声明为常数吗? 你确认你的只读事件属性不是可变的吗? 你创建过一个toString()方法吗? 最重要的事情是,你记得覆盖clone()吗? 当你创建你自己的自定义事件类时,这些是你必须做的所有事情,并且相应的细节能够使得这些事件类难以进行编码。
SourceMate的Event Class向导(参见图1)将为你考虑这些细节。 该向导与其它的Flash Builder类向导类似,但它可以提供两个附加选项。 首先,它提供一个表格将你的自定义事件类型声明为常数。 其次,它提供另一个表格声明你的事件属性。 当你点击 Finish时,SourceMate 将生成必需的事件类,其中包括所有重要的细节。 一个构造器将被创建,它允许你在事件属性中进行传递。 每个属性将接收一个getter函数而不是一个setter函数,这样能够确保属性不是可变的。 此外,系统将为你生成一个适当的toString()和clone()方法。 现在,创建一个事件类变得易如反掌。
下面是由SourceMate生成的一个事件类:
package
{
import flash.events.Event;
public class CustomerEvent extends Event
{
public static const CUSTOMER_ADDED:String = "customerAdded";
public static const CUSTOMER_REMOVED:String = "customerRemoved";
public static const CUSTOMER_MODIFIED:String = "customerModified";
private var _customer:Customer;
private var _modifiedFields:Array;
public function CustomerEvent(type:String, customer:Customer, modifiedFields:Array=null)
{
super(type,false,false);
this._customer = customer;
this._modifiedFields = modifiedFields;
}
public function get customer():Customer
{
return _customer;
}
public function get modifiedFields():Array
{
return _modifiedFields;
}
public override function clone():Event
{
return new CustomerEvent(type,customer,modifiedFields);
}
public override function toString():String
{
return formatToString("CustomerEvent","customer","modifiedFields");
}
}
}
优秀架构的两个关键基石是封装(encapsulation)和多态(polymorphism)。 界面在支持这两个概念方面扮演重要的角色。 然而,开发人员在编写很多代码之前通常没有机会将优秀架构放置于正确的位置。 通过界面,通常在已经编写完一个实体类之后才知道相应的细节应该藏匿于一个界面之后。 在其它情形下,开发人员可能会注意到满足一个类似角色的其它类,并且需要创建一个共用界面。
当你遇到这些情形时,你需要进行更多操作,而不能只创建本身的界面类。 你还需要改变该实体类,以便它能够实现该界面。 更有意义的事情是,你需要仔细检查调用代码并且将指向实体类的引用改变为指向你创建的新的界面类。 特别地,这一操作可能引起麻烦。
当使用 SourceMate的Extract Interface功能时(参见图2),所有建立任务的界面均已经为你创建完毕。 SourceMate 将生成基于选中的实体类的方法的界面。 然后,它将修改实体类以便实现该界面。 最后,它将检查你的整个项目并且利用界面名称替换指向实体类的任何引用。 你可以使用SourceMate自动进行操作,而不需要心烦意乱地检查你的项目代码、搜寻指向你的类的引用以及进行手工更新等。
Extract Method重构(参见图3)是日常编码最有用的 SourceMate 功能之一。 Extract Method 从现有的方法中获取大量代码并且将其移植到自己的方法中。 当你识别具有自己的utility方法的一段共用代码时,你可以使用该功能。 当然,你可以手工完成这一任务,但你需要弄清楚该方法需要哪些参数、确认该方法的返回类型以及利用对新方法的调用替换原方法的代码。 SourceMate 能够帮助你完成这些步骤。 在将你希望获取的代码行选中并且放入新方法之后,SourceMate将解析这些代码、确定新方法的必要参数、推算出要求的返回类型、创建utility方法以及最后利用对该新方法的调用替换选中代码的所有实例。 这些操作简单又快捷。
为了能够看到该功能是如何工作的,在编写该功能时以及在调用Extract Method之前,应该考虑使用函数loadCustomers():
public function loadCustomers(customers:Array):void
{
for (var i:int = 0; i < customers.length; i++)
{
var customer:Customer = customers[i];
var isValid:Boolean = true;
if (customer.name == null)
isValid = false;
if (customer.email == null)
isValid = false;
if (customer.location == null)
isValid = false;
if (!isValid)
continue;
//load customer
}
}
开发人员应该将下列代码选中以作为重构的目标:
var isValid:Boolean = true;
if (customer.name == null)
isValid = false;
if (customer.email == null)
isValid = false;
if (customer.location == null)
isValid = false;
在Extract Method之后,将选中的代码移植到另一个名称为 isCustomerValid() 的函数中:
public function loadCustomers(customers:Array):void
{
for (var i:int = 0; i < customers.length; i++)
{
var customer:Customer = customers[i];
var isValid:Boolean = isCustomerValid(customer);
if (!isValid)
continue;
//load customer
}
}
private function isCustomerValid(customer:Customer):Boolean
{
var isValid:Boolean = true;
if (customer.name == null)
isValid = false;
if (customer.email == null)
isValid = false;
if (customer.location == null)
isValid = false;
return isValid;
}
SourceMate 3.0 Enterprise Edition 包含一组本地化功能,这些功能对于企业创建大型多语言Flex应用程序特别有价值。 对Flex应用程序进行完全本地化是一项令人畏缩的任务。 你必须完成一系列步骤以便你的应用程序能够接受新的变换并且这些变换并不都是显而易见和易于牢记的。 也许最困难的任务是在资源属性文件中利用查找字符串的方式替换你的所有硬编码的字符串。 特别是当字符串是串联表达式的一部分时(例如,"Showing " + count + " items" ),这一操作更令人厌烦。 当对应用程序进行本地化时,这一任务通常占用大量开发时间。 非常幸运的是SourceMate能够自动为你完成这一任务。
你可以使用 SourceMate的Externalize Strings功能(参见图4)将硬编码的字符串从一个类中提取出来,然后将它们放置于一个Flex 资源属性文件中。 然后,利用对 Flex ResourceManager类的调用替换代码中的硬编码字符串,以便从正确的属性文件中检索它们。 在大型项目中(它们通常是需要翻译的项目),人工完成这一过程可能需要花费数日或数周的令人心烦意乱的人工更改操作。 这应该不是任何开发人员期望编写的代码类型。 通过使用SourceMate,你可以将这一时长降到几乎最小程度,并且回到编写精彩有趣的代码工作中。
当然,对你的硬编码字符串进行外化并不是你需要完成的唯一本地化任务。 你仍然需要为每个不同地区创建不同的属性文件。 此外,如果你需要处理现有的属性文件,也许因为你正在运行一个已经本地化的应用程序的更新版本,则你必须管理好现有的数据并且确保它们仍然正确有效。 当在一段时间内处理许多不同属性时,很容易碰到遗漏翻译、缺失关键字、无引用或孤立的字符串及其它各种问题。 SourceMate的Resource Bundle Editor 能够提供帮助处理这些问题的功能,因此,你不必通过无数属性文件进行搜寻以便找到并且解决这些问题。
通过安装SourceMate,当你打开属性文件时,Resource Bundle Editor将自动启动。 Resource Bundle Editor的最基本功能是从你的所有地区收集所有相关属性文件,并且将它们作为一个逻辑实体进行处理。 总之,对于每个关键字,你在应用程序中只有一个逻辑字符串,该字符串在不同地区具有不同翻译。 在 Resource Bundle Editor中,你可以看到你的字符串对应的关键字,并且在值的栅格中,你可以看到在不同地区文件中的每个字符串的不同翻译(参见图5)。 这一分组操作使得处理多属性文件更为简便,但它是该编辑器真正闪亮的高级功能。
Resource Bundle Editor具有下列4个高级功能:
查找未用关键字(Find Unused Keys)功能能够将你的属性文件中的关键字与你的代码中的ResourceManager调用进行比较。 它能够将存在于你的属性文件中、但在你的项目代码中无法查到的任何关键字进行标记。
显示缺失的关键字和带有空值的关键字(Show Missing Keys and Keys with Empty Values)功能可以提供类似的功能。 该功能可以将存在于你的一些属性文件中、但在你的其它属性文件中不存在的关键字,或存在类似的但不带有任何值的关键字进行标记。 这将会帮助你查找遗漏的翻译。
查找复制的关键字(Find Duplicate Keys) 功能能够在每个地区文件中生成一份所有复制关键字的报告。
顾名思义,创建新的地区文件(Create New Locale File)功能可以创建新的属性文件(如果需要还创建一个地区文件夹)。 新的地区文件将包含现有的关键字并且具有通过使用Google Translate随意自动翻译的值。 Google Translate等机器翻译程序不会在你的最终应用程序中生成你期望的翻译,但它们的确能够创建有用的伪翻译(pseudo-translations)。 伪翻译是临时翻译,它们可以用于测试应用程序接受和正确显示翻译数据的能力。 伪翻译能够帮助在相应的处理过程中及早暴露本地化问题。 其中最常见的一个问题是文本截短,因为翻译之后的字符串可能比其原来的文本长数倍。 伪翻译的真正优点在于你可以启动你的本地化测试,而无需等待来自翻译程序的最终结果。
除了上述的功能之外,如有必要,SourceMate 还能够帮助配置你的Flex项目。 在对字符串进行外化的同时,SourceMate 将对你的项目属性进行扫描并且对配置进行必要的改变以便支持本地化。 例如,按照惯例,本地化的项目应该包含一个用于特定地区资源的独立源路径。 该源路径的名称通常为locale/{locale},它带有用于替换当前地区的{locale} 关键字。 如果你的项目没有该附加源路径,SourceMate 将为你添加该源路径。 类似地,在创建新的地区文件的同时,如果Flex SDK没有包含该新地区的框架资源,则SourceMate可以通过copylocale工具为你创建这些资源。 如果没有SourceMate,你必须手工运行这一命令行工具 ,并且当你需要运行该工具时,它不总是显而易见的。 通过使用SourceMate,你能够在Flash Builder中获得一个带有运行该工具的选项的提示。
对不带SourceMate功能的Flex 应用程序进行本地化是令人乏味的并且易于产生错误。 通过使用SourceMate功能,相同的任务变得极为简单并且相应的执行速度获得极大的提升。
利用SourceMate,即使消除一项单调乏味的编码任务,也可能节省数天的枯燥工作和故障排除工作量。 当你开始使用SourceMate带给 Flash Builder的其它优秀功能时,你将会感觉到自己正处于兴奋的编码状态。
SourceMate具有30天的免费试用期。 你可以从这里下载这一免费试用软件。