代码味道和FME高尔夫

原文发布时间:2015/7/8  9:31:51

作者:乱马

原文地址:http://blog.safe.com/2015/06/fmeevangelist136/

我最近老是被问到制作FME模版(工作空间)有哪些准则

正如你可能知道,我们有一些针对FME的最佳实践;(我们提供了)关于如何才能制作工作空间--一个好的工作空间的概念。

在我们的培训中包括了3章关于最佳实践的内容。它提到了注释、书签、调试、项目组织和其他更多内容。我们同样提供了一个案例工程,用来测试我们的认证候选者。这个例子提供了针对一个工程应该是什么样子的,包括了工作空间和相关的文档。

所以,我可以告诉你如何制作一个好的工作空间(模版),但是这里可能很难说如何制作一个差的工作空间。我的意思是,如果一个工作空间运行到结束,并产生了你要的结果,它是否就不差,或者还是差的? 

代码的味道

 当我寻找一种方法来辨识差的代码的时候,我发现没有一种统一的答案。相反,你不得不找到一种被维基百科称为代码味道的标识:

代码味道通常不是bug,他们不是技术上的错误,而且也不会阻止程序运行。但是,它们表明了在设计上的缺陷,这个可能会导致降低开发速度或者增加在将来出现bug或者失误的风险。

对FME而言,你的工作空间在运行,它产生你需要的输出,但是…更多的编辑可能会导致它更差,即使现在工作空间能正常运行,但是也许将来会失败。

所以,是否我能找到一些标识来建议一个FME的工作空间更好闻?

重复

重复是所有红旗(可能出现问题)中最大的一个。

在工作空间中的对象重复自己就像FME的蓝色奶酪(一种味道尖锐的香气,能感染任何接触他们的东西)。

<<" ><>

以下是比较典型的坏的重复:

· 相同的转换器或者“更差”的成组转换器,重复多次但是只有微小的差异

· 多个要素类型 全部都连接到一个相同的转换器

· 多个读模块读取相同格式的数据(其实一个读模块可以读取多个数据集的)

这些不是经常的错误--有时你是真的需要重复--但是他们表示你的设计可能是脆弱的。 

复杂性

我发现了另外一段文字,这个我想应该算是伟大的,因为如何评价一个准备认证的工作空间是很难的:

对于代码来说,一种方式是使得的它如此简单,而很明显没有任何的缺陷;另外一种方式是使得它如此复杂,而没有任何显著的缺陷。(one way [to code] is to make it so simple that there are obviously no deficiencies; the other way is to make it so complicated that there are no obvious deficiencies)

一个好的工作空间并不需要特别的复杂。它可以通过简单的方法来执行复杂的处理过程。但是有时我看一个工作空间需要花费很长时间来判断是否它没有任何缺陷,或者只是这些缺陷隐藏的非常深。

这里有一些可能会导致问题的线索:

· 低层次复杂:在工作空间使用FME的函数和工厂,或者过量的Python脚本

· 多个工作空间复杂:多个工作空间之间相互调用,并且使用Python来调用其他工作空间

· 多连接:当你的连接线很密以至于都形成了一个云纹图案了,那是该重新评估你的工作空间了

· 过度的调试:当你的每个转换器都关联到日志、Inspector和断点上

再强调一次,复杂并不总是错误;有时(其实我很赞同)是因为FME本身的限制,会形成这样的复杂性。但是没有上述情况是好的兆头。

防弹

防弹的意思是指你在制作一个工作空间的时候,对于那些可能会出现的错误进行一些假设,因此你可以建立一些方法来防止错误。我想,在程序开发中这个定义应该称为错误捕获。

通常防弹只要是添加一些测试或者过滤转换器就可以找到错误要素--通常要在他们到达一个引起错误的点之前。

但是说起来容易做起来难,真的要发现应该在哪里添加防弹是比较难的。这里是FME的湿狗,你必须把你的鼻子使劲贴近并努力吸气来发现气味,我将多次检查我的工作空间,针对以下情况:

 转换器的参数需要接受属性值,如果这些属性存在空值(null)或者丢失值会如何?

· 转换器或者数据格式接受的几何类型有限,那么对于不被接受的几何类型将会出现什么情况?

· 源数据带有集合类型(aggregate),不是所有的转换器都支持集合类型

· 当工作空间会部署在不同的操作系统中,文件路径会成为一个错误因素

· 当工作空间会部署在FME Server或者FME Cloud上,所有用户资源是否可以被访问

在一定程度上,当我们为转换器添加了<rejected>端口后,问题出现的少了,但是我认为这仍然需要进一步研讨。当数据并不是你自己创建的,或者这些数据经过可信的修改,但是又没有通知你,例如你需要处理上传到FME  Server上面的数据,那么防弹就是非常值得关注的事情了。

如果你不知道什么数据将会到来时,你最好做好最坏的打算。

为工作空间除臭

同样的方式,你可能会认为你的海鲜午餐有着海洋的微妙香气,除了格外的清香,让您感知你的工作空间是其他任何事物都是很难的。解决问题的方法都是一样的:你需要一个好朋友来指出错误之处。

在Safe公司,当开发人员的工作没有被其他同事进行代码级检查,是不会告诉把这个成果集成到FME产品中去的。这也是我要建议的你要尝试的,尤其是:

· 直到使用FME的同事对你的工作空间进行了检查,否则不要发布你的项目;

· 制作一个检查清单进行检查,可以针对我上述提到的问题;

· 制作一个正式的流程,如必须记录你的检查项,这样防止忘记或者回避了问题。

当然,我们没有那么正式,都穿着医生的白色制服进行代码检查。你可以通过简单的交流或者邮件形式。

当项目足够大或者足够复杂,或者是错误会带来不成比例的投入时,就会需要组织团队进行代码检查的会议。

这个很值得做,对于检查者和被检查者都有可能学到了他们以前没有意识到的技术。

FME Golf

另外一个有意思的话题是调查代码质量,也称之为代码高尔夫。

与传统的高尔夫一样,参与者是努力用最少的杆数来赢得一轮,代码高尔夫是程序开发者使用最少的代码来解决一个问题。看下面的一段代码:

!(y%100<1&&y%400||y%4)

这段代码是Javascript的,用来判断给定的年份是否是闰年,应该说没有比它更短的代码了。

这里,我将提出一个有意思的挑战,我将设置一个任务,并提供数据,你力争创建最小的工作空间来执行它。

挑战是:下载CSV的原始文件,并制作一个工作空间,完成以下工作;

· 读取公共艺术作品的CSV文件

· 对每个纪录创建点要素

· 丢弃Name字段为空、丢失、空格等的要素

· 找到每个艺术作品坐落于哪个区域(区域在kml文件中)

· 排序艺术作品要素,以字母顺序的方式,用区域的Name字段和艺术作品的Title字段进行排序

· 把数据写成shape 格式,他们要带有属性字段neighborhood name, artwork title, artwork name

以下是文件:

· 艺术作品的数据

· 区域的数据集

· 我的工作空间

当然他们有些规则:

· 要求工作空间的文件尽量的小(字节数),不仅仅是转换器的数量最少;

· 只能使用FME Workbench。不能手工编辑fmw文件,不能用文本编辑器直接打开fmw文件进行编辑

· Python 和TCL脚本是不允许的,必须是纯粹的FME转换器功能,当然如果你愿意,可以使用FME 的函数

· 在使用FME读取源数据之前,你不能编辑或者操作源数据的任何内容

· 需要使用FME 2015.0及以上版本

我的工作空间执行任务的方式可能不是你希望的那样。它有68kb(69,411bytes)。你可以做一个工作空间比它还小,同时还能得到相同 结果么?我渴望看到一些使用新的转换器的经验,甚至是新的读模块,来看看你如何使用这些规则(非常小心地去读取数据)而不是打破这些规则。

你可以把你的创新成果发邮件给我(我马上要休假了,)。我不承诺一定有奖励,但是,

结论

FME高尔夫的主意有些好玩,但是制作一个形式良好的工作空间并不是笑话。一个差的工作空间会很慢而且低效,它将很难维护,或者无法证明以后不导致错误发生。Safe提出的建议是:

 

更多的成本是在发现错误后的维护上。请尽早维护或者经常维护。

这一点也很难解释。

Mark Ireland

猜你喜欢

转载自blog.csdn.net/fmechina/article/details/81381878