身边有些年轻同事曾经向我表达过这种困扰:尽管完成日常工作没有任何问题,但是还想更进一步,把代码写得更好些,做到精益求精。现在写的代码能实现功能,但是不知道可以怎样写得更好。

除了阅读优秀的开源库开源框架,一点一滴积累之外,Jerry的一个建议是大家可以多琢磨琢磨每天工作使用到的一些工具,研究下这些工具里自己感兴趣的那些功能的实现原理。想一想这个功能如果让自己实现,该怎样去设计和编码,琢磨完之后再去看工具的实现,和自己心中所想进行比较。这样一来,既学习了这些工作优秀的设计和实现,又进一步熟悉了工作本身,可以提高平时编码和调试的效率,一举两得。

SAP的前端UI给大家提供了各式各样的诊断工具,这些工具能方便大家调试,或是提供一些辅助技术信息,提高排错效率。

比如CRM WebClient UI的Ctrl+Alt+F2:

SAP Cloud for Customer的Ctrl+鼠标左键:

以及SAP UI5的两组诊断工具:

  • Ctrl+Alt+Shift+P

  • Ctrl+Alt+Shift+S

今天,就由SAP成都研究院的菜园子小哥王聪给大家聊聊他是如何专研第二组工具的。

和梁山好汉菜园子张青在大树坡开店之前的职业一样,王聪的一大爱好也是种菜。

据王聪的老板Mint介绍,王聪的厨艺也不错,喜欢烹饪。不过,各位单身妹纸们,遗憾的是,王聪已经结婚了,如今是一位模范丈夫。

躬耕于田间之余,王聪也时常文艺一把。请通过下面的连接,欣赏王聪3分30秒的吉他演奏:《我的歌声里》。

http://compaign.tudou.com/v/611489926.html?from=timeline&isappinstalled=0

试想一个春雨绵绵的午后,王聪置身于满园苍翠欲滴的田间,一人一吉他一台笔记本电脑。吉他弹奏,电脑编程,这画面太美,依稀有几分陶渊明“采菊东篱下,悠然见南山”的风雅。

王聪除了种菜之外,另一个技能就是德语。大家点击这篇文章尾部的"阅读原文", 就能看到这篇文章的英语和德语版本。Jerry是不懂德语的,所以也不知道文章里德语运用的水平如何。不过Jerry认识一位在德国SAP圈打拼了20多年的资深留德华,林峋博士。去年Jerry和林博士去Walldorf镇上的商店买床垫,听他和卖床小妹德语对话那个流利,羡慕极了。好事的Jerry把王聪的这篇文章给林博士过目,让他帮忙品评下王聪的德语水平,得到了林博士的赞誉。

王聪的SAP Community上的博客都是下面这种风格的,这些是Jerry达不到的水平:

这就是王聪,一个能写代码能种菜能玩音乐的非典型程序猿。下面是王聪的正文。


大家好我是王聪,目前在SAP成都研究院Revenue Cloud团队负责话唠和捧场王的角色。以前年轻的时候还喜欢摄摄影听听音乐啥的,可慢慢的我却在通往"油腻中年"的路上渐行渐远,不再"面朝大海春暖花开",而开始"关心粮食和蔬菜"。做饭和种菜成了我现在的爱好,我成了一个真正的"马农"(颠着大马勺的农民)。

前段时间承蒙汪主编赏脸约稿,让我写一写工作中用到的一些工具。心中激动之余冲入脑子的第一感觉就是标题的这几个大字。一般来说拿审题后的第一印象当题目总是有那么点不负责任,但想来村上春树写出来的书名不也就是长这个样子,所以心中也就无所谓了。

以汪主编的风格,在技术正餐之前总得来点三国水浒金庸古龙之类的小零嘴先垫吧垫吧。今天我想谈谈刀,但我谈的不是武侠的刀,而是小巧现代的瑞士军刀。

我人生中的第一把瑞士军刀是我08年考上大学时我妈妈的一个同事阿姨送的。当时她问我报的什么专业,我怕“通信工程”在她们看来不太好理解,就索性说自己是学“电脑”的。然后她就特地挑了一把有很多改锥的CyberTool系列的瑞士军刀送给我,并真诚的叮嘱我好好学习,以后修电脑的时候一定用得到。这把刀伴随了我很多年,却在我之后的一次疏忽中易主给了机场的安检大哥。再加上毕业之后我并没有开个小店修电脑,想来当真辜负了阿姨的期冀。

之后我又有过一些其他的瑞士军刀,但到头来手里只剩一把Waiter系列的小刀。因为用来用去会发现很多花哨的功能几乎永远都不会被用到。除了偶尔拿来开瓶啤酒剔剔牙之外,只有那片锋利好用的主刀才是我一次次把它摸出口袋的理由。

在去年初识UI5的时候我就被强大的UI5诊断工具震惊了,功能丰富简单易用随唤随出活好不粘人,简直是一把出色的瑞士军刀。但慢慢的新鲜感褪去,于我来说Control Tree模块就是那片百用不腻的主刀。

Control Tree了解一下?

这里我们用一个简单的例子认识一下Control Tree,在页面上显示一个sap.m.Text文本。通过Shift+Ctrl+Alt+S呼出UI5诊断工具,然后在Control Tree标签下我们可以清楚的看到整个页面的控件树形结构,点击Text节点,我们就可以看到如下行为:

  • 相应的属性被展示出来,用户可以动态修改,也可在相应属性的Get/Set方法中加断点——这边打个勾,运行时执行到Get/Set方法后断点就自动触发了,如此神奇。怎么做到的?这实际上是面向切片编程思想的一个应用。细节参看汪主编博客:https://blogs.sap.com/2016/05/16/a-small-tip-i-learn-from-ui5-diagnostics-tool-a-practice-of-aop-programming/

  • 可以在查看控件相关的绑定信息

  • 可以在控件的所有方法中加断点 (原理同第一条后半段)

  • 相应控件被高亮一秒钟

这里我们对其中的部分行为debug下去,看看其背后的逻辑。

属性列表是哪来的?

首先我们通过万能的在EventProvider.js的229行加断点方式定位到sap/ui/core/support/plugins/ControlTree.js文件,并找到目标方法getControlProperties。众所周知一切UI5控件都是派生自sap.ui.core.Element。而我们也注意到了这样的一个while循环。而这也就解释了为什么属性列表会按照BaseType加以划分,并会一直划分到Element一层。

而在遍历的过程中,每一个BaseType的各项属性以及aggregation都被整理成方便后续渲染列表的格式。进而在renderPropertiesTab方法中逐级渲染出DOM段落。

如何通过修改属性列表中的值去修改控件的属性?

我们在属性列表当中可以直接去实时地修改某一项属性,这又是如何做到的呢?想来这个过程最终一定是调用到了控件本身的set方法,我们就在sap.m.Text的setText方法中打一个断点,然后在调用栈中向上追溯,发现了目标方法onsapUiSupportControlTreeChangeProperty。原来是在控件的Metadata中存有各个属性所对应的Set方法的名称,在通过简单的校验之后用户所输入的值就通过setText方法被赋值进去了。

虽然绿色的高亮很丑,但我想知道它是怎么来的?

我们继续尝试在EventProvider中寻求突破口。进而定位到了Selector.js中的onsapUiSupportSelectorHighlight方法。在这里我们发现所谓的高亮其实并不是元素本身的行为,而是在元素上面覆盖一层绿色的“遮罩”(div)。

绿色“遮罩”

然后会根据被高亮的控件的宽度高度来调整“遮罩”的大小,并将其显示在控件的位置,以达到高亮的效果。

快速在Control Tree中定位元素

如果一个页面非常复杂,想在其中靠层级结构找到元素将变得困难。而Control Tree则提供了一个通过Ctrl+Alt+Shift+鼠标点击快速定位元素的功能,好用得让人无法自拔。

这里我们可以看到当UI5诊断工具处于打开状态时,mousedown事件的处理方法会增加一个,便是Selector的_fSelectHandler方法。而在这里将会判断如果三个修饰键同时被按下,则帮助用户在Control Tree中选中相应的元素节点。

以上就是我对于UI5诊断工具中Control Tree模块部分功能的理解。希望你也能和我一样爱上这个工具。

更多阅读

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

SAP成都研究院非典型程序猿,菜园子小哥:当我用UI5诊断工具时我用些什么的更多相关文章

  1. SAP成都研究院2018年总共87篇技术文章合集

    2018年很快就要结束了.Jerry在2017年年底准备开始写这个公众号时,给自己定的目标是:2018年至少保证每周发布一篇高质量的文章.如今2018年就快过去了,高质量与否需要大家来反馈,至少从量上 ...

  2. SAP成都研究院李三郎:SCP Application Router简介

    今天的文章来自李贝宁(Ben),SAP成都研究院的资深程序猿和架构师. 作为成都研究院里同时精通Java, JavaScript和ABAP这三门编程语言的数位同事之一,Ben曾经先后担任了成都CRM ...

  3. SAP成都研究院DevOps那些事

    今天的文章来自我的同事平静静,SAP成都研究院一位程序媛.平静静2010年加入SAP,熟悉她的人一般都叫她平静.在她待过的每个小组,平静静都不是最引人瞩目的开发人员,然而她总是能一如既往,保质保量地完 ...

  4. SAP成都研究院飞机哥:程序猿和飞机的不解之缘

    今天的文章来自Jerry的老同事张航. 张航和Jerry一样于2007年毕业后加入SAP成都研究院工作至今.进入SAP后的第一个开发部门是SAP Business by Design Infrastr ...

  5. SAP成都研究院大卫哥:SAP C4C中国本地化之微信小程序集成

    今天的文章来自Wu David,SAP成都研究院C4C开发团队的架构师,在加入团队之前曾经在SAP上海研究院工作,组内同事习惯亲切地称呼他为大卫哥. 大卫哥身高据Jerry目测有1米8以上,是成都C4 ...

  6. SAP成都研究院飞机哥: SAP C4C中国本地化之微信聊天机器人的集成

    今天的文章仍然来自Jerry的老同事,SAP成都研究院的张航(Zhang Harry).关于他的背景介绍,请参考张航之前的文章:SAP成都研究院飞机哥:程序猿和飞机的不解之缘.下面是他的正文. 大家好 ...

  7. 汶川大地震中的SAP成都研究院

    5·12汶川地震,发生于北京时间(UTC+8)2008年5月12日(星期一)14时28分04秒,此次地震的面波震级 里氏震级达8.0Ms.矩震级达8.3Mw,地震烈度达到11度.地震波及大半个中国及亚 ...

  8. SAP成都研究院35岁以上的开发人员都去哪儿了?

    2006年成立的SAP成都研究院,位于天府软件园B区.如今,因为研究院发展的不断壮大, 已经搬迁到天府软件园E区了,因此,发生在图片building各种充满悲欢离合的故事,已经成为一部分小伙伴脑海中难 ...

  9. SAP成都研究院廖婧:SAP C4C社交媒体集成概述

    曾经有朋友在知乎上向我提问,咨询在SAP成都研究院工作的体验. 当时,我的回答提到一点,SAP注重工作与生活的平衡,这也是SAP中国官网强调的一点. https://www.sap.com/china ...

随机推荐

  1. 用cmd命令来 启动和关闭 SqlServer

    cmd命令 启动and关闭 sql数据库服务 (1)先用以管理员身份打开你的cmd窗口. (2)后输入以下对应的命名. 如下: 启动SQLSERVER NET START MSSQLSERVER 暂停 ...

  2. Kipmi0 占用CPU 100%

    查看当前正在运行的进程发现kipmi0进程占用率达到100% kipmi -% of the CPUs, %/% comes when the machine is idle? A second is ...

  3. EasyTouch3.16 初步使用

  4. Java多线程与并发——线程生命周期和线程池

    线程生命周期:  线程池:是预先创建线程的一种技术.线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中,然后对这些资源进行复用.减少频繁的创建和销毁对象. java里面线程池的顶级接口是E ...

  5. (转) Linux命令学习手册-arp命令

    arp 原文:http://blog.chinaunix.net/uid-9525959-id-3318814.html [功能] 管理系统的arp缓存. [描述] 用来管理系统的arp缓存,常用的命 ...

  6. Hive 基本语法操练(五):Hive 的 JOIN 用法

    Hive 的 JOIN 用法 hive只支持等连接,外连接,左半连接.hive不支持非相等的join条件(通过其他方式实现,如left outer join),因为它很难在map/reduce中实现这 ...

  7. android 开发-AsyncTask异步任务的实现

     AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过 ...

  8. 性能测试学习第四天_Loadrunner概述

    1.Loadrunner的组成部分 ·脚本生成器VuGen:virtual user generator ·压力控制器Controller,License主要在这里控制 ·结果分析软件Analysis ...

  9. Chapter 18 MySQL NDB Cluster 7.3 and NDB Cluster 7.4渣翻

    Table of Contents 18.1 NDB Cluster Overview      18.2 NDB Cluster Installation      18.3 Configurati ...

  10. 在 Angularjs 中 ui-sref 和 $state.go 如何传递单个多个参数和将对象作为参数

    一: 如何传递单个参数 首先,要在目标页面定义接受的参数: 传参, 接收参数, 在目标页面的controller里注入$stateParams,然后 "$stateParams.参数名&qu ...