您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

为什么微软力推XML?而谷歌则力推代码描述界面“kotlin”?

时间:2022-08-21 13:54:49  来源:  作者:沈洛书馆

其实微软当年的MFC更接近于“代码描述界面”,Delphi等反而是通过专门的配置文件.DFM来描述窗体……

比如,这个来自CSDN的截图就是一个典型.DFM文件内容:

Delphi项目构成之窗体文件(Form Files).DFM_weixin_33904756的博客-CSDN博客

 

事实上,这并不应该叫“代码描述界面”,而是“窗体布局独立于程序设计”。

把窗体布局独立出来有极多好处。

1、集中管理,方便用程序自动维护,从而可以“所见即所得”。

相比之下,MFC经常一开始还是可以用窗体编辑器维护界面的;但做着做着……代码中到处改吧。

反之,如果窗体编辑器可以一直保持跟踪,而且允许你随时随地的想改代码改代码、想改布局改布局,会不会好很多?

但,如果代码和布局混合,实现起来就太麻烦了……

尤其是,当时的各种编程语言并不普遍支持现在烂大街的嵌套声明类/函数,也大多没有闭包、lambda等概念。这就使得代码结构天然和窗体结构不同;这种状况下,想要维护窗体之间的关系,实在太难。

2、窗体布局和程序设计脱耦。

于是,设计窗体的可以专心设计窗体、修改视觉表现;写程序的专注程序逻辑——将来只要按照约定,比如文本框输入框名字吻合,程序就能正常运行。

3、窗体布局文件独立。

更进一步的,还可以把窗体布局文件都独立出来、甚至在运行时加载——这就支持了“换肤”。

事实上,只要你懂开发、只要你的应用不是太小太垃圾,哪怕仅仅“脱耦”一个好处,就值得你投资这项技术了。

因此,并不仅仅是微软,业界绝大多数的GUI框架,从微软的WPF到Qt的QML、GTK的Glade XML,以及Android早期的界面描述文件,全都是独立的。而且大都采用了XML格式。

早期的确有一些采用了文本格式,如ini或其他格式。但做过界面的都知道,这玩意儿就是一层套一层来回套;可ini或者别的格式,包括json,想要清晰的表达这种嵌套关系,那就麻烦的很了。

而XML格式虽然繁琐,但它的格式足够规范,拿来表示这种嵌套关系,那是简单明了、一目了然。

那么,既然XML布局文件这么好,现在为何又回归了呢?

1、一直没有XML布局标准

这就使得,每一种编程语言、每一套GUI库,就有一套自己的XML格式约定。

它们自带的XML布局图形编辑器……只能说是差强人意。

简单说,你不可能不借助Photoshop/gimp之类东西,就搞定一个漂亮的界面;然后,哪怕已经有了photoshop做的漂亮界面图片,你要把它做成符合要求的、可缩放的、能够直接放程序中使用的XML布局描述……慢慢学习吧。

遗憾的是,绝大多数的界面设计师并不会编程。让他学会使用当前团队使用的某种语言的界面布局编辑器,这是个很难的任务……

换句话说,最终,界面布局还是得程序员做,很难做到“UI设计师和程序员分工合作,一个提供XML布局文件、一个专注程序设计”。

如果有XML界面布局标准规范,那么或许Photoshop或别的公司不介意做一个支持xml布局的、标准的图形工具;UI设计师只需学会使用这个工具,就可以和任何团队配合无间。

很遗憾。做不到。他必须为配合每个团队从头学习不同的界面设计工具,而这显然是不可能的——尤其是,他还得保持不同版本界面中输入框/文本框之类组件名称的对应关系,哪怕差一个字符都不行。

很遗憾,和被迫染上了“变量名/函数名必须规范”强迫症的程序员不同,UI设计师真没有这个习惯。

2、编译器设计水平提升

和早期C++标准难产多年不同,现在编译器设计已经走向成熟。

IDE中,你敲一个字符,它做一遍语法分析成为可能;同时,编程语言的发展,使得嵌套声明被普遍支持——于是,窗体布局和代码结构就很自然的对应起来了。

你看,不需要把布局文件独立出来,一样可以实现“所见即所得”。

如此一来,和xml布局强迫性的“文件和代码相分离”相比,反而更清晰、更方便也更灵活了。

 

事实上,无论是微软的WPF还是Qt、GTK或者其他,它们都允许程序员直接用程序生成窗体。

而且,这些GUI库本身其实也是按照XML里面的声明、自动调用API生成了窗体。

既然编译器已经可以支持,既然UI设计师和程序逻辑分头各自开发并不现实——那么,为何不合并起来呢?

程序员直接用代码生成窗体——或者,UI编辑器直接拖放产生代码(而不是先生成XML、后把XML转换成代码)——不再需要一会儿看看XML、一会儿看看代码逻辑、生怕一个名字敲错引用了错误控件……这会不会更方便一些?

3、做出一个好的抽象,极难

总之,一切的核心,就是方便做事。怎么方便怎么来。

而不同的阶段、不同的技术、不同的计算能力,决定了具体的实现思路可行与否、难度/复杂度如何。

这也正是人们发明了无数种编程语言、试图从根本上解决某些工程难题的原因——如果你真的深入了解过、写过相关领域的典型应用,就会知道,那些看起来不起眼的“语言基础设施”,的的确确会改变工程思路、影响开发难度。

当然,这种“每种语言都有一技之长”的状况,只在二十年前明显;之后,随着计算能力的提升、编译器设计水平提高,几乎所有语言都相互汲取了其他语言的长处。

其中的典型,就是C++这种“特性泛滥”的语言。

这使得之后很多年里,除了性能和开发难度,所有语言看起来就没什么差别了。

毕竟大家互相抄,你有我有全都有。

但这种泛滥的特性其实只是一种堆砌。堆砌的极致就是C++,以至于后来业界的共识就是禁止在一个不大的项目里同时使用所有C++特性,而是根据业务范围选择其中部分子集,以免复杂度失控。

xml布局其实也是一种“所有语言都在堆砌”的特性;它和语言的结合并不好,两张皮,这带来了额外的复杂性、且很难达到宣称的效果。

kotlin其实是一种尝试,尝试把“界面布局”直接整合于语言中——这个特性不再是和其他部分毫无瓜葛的、可以剥离的特性,而是和语言其他成分水乳交融的一部分。

说的更抽象点:过去,各种特性的堆砌其实是“非正交”的,不同特性要么格格不入、谁都不碍谁;要么一旦产生了交互作用,那么你就必须动用类似placement new这样的“非常手段”——也就是封装发生了泄露。

而更理想的设计是,语言中的每一个特性都是独立的、可以和其他特性自然互动的。不至于两张皮一样。

比如,过去,你在程序中create了一个view,但没人知道、其他组件也无法和它自然交互。除非你主动通过某种奇怪的机制把这个view呈现出来,否则在程序执行到这个位置之前,这个view就不可见。也就是这个view和程序其他组件之间,是缺乏联系的,非正交的。你必须通过某些“泄露封装”的东西,把它显式的添加到某个窗口,否则这个view甚至都无法正常交互;不仅如此,你还需要通过独立的布局文件把它单独列出来,否则就无法可视化的编辑它。

而真正正交的、相容的设计里,你create一个view,这个view马上就可以呈现在可视化编辑器里;而且,它也可以很自然的被其他窗口/view使用——不需要复杂的、啰嗦的、奇特的语法或者布局文件帮助,而是简单的把它赋给另一个窗口/view中的某个变量,马上就能看到最终的效果了。

当然,作为一个用过很多蹩脚库的人,我知道很多这种设计只是取巧——其中的重灾区就是微软。

 

这种取巧,使得你在做一些简单、常见的工作时方便快捷;却会给稍微复杂一些工程带来巨大的麻烦、表现出库设计者的思维缺陷——它只能解决表面问题,看起来“很好很强大”,但根本就不是深思熟虑的结果。

嗯,举一个容易理解的典型案例吧:win10早期的网络控制面板隐藏了ip、子网掩码、网关、DNS等等配置信息;你想解决网络问题,它会告诉你“正在联网寻求解决方案”——网络不通了,它去联网寻找解决方案!

这就是典型的“看起来很美”的封装——对小白来说,现在你不需要自己手动配置ip、网关、dns了,微软可以自动帮你搞定,爽吧?

但当实际环境出现意料之外的问题时(对我来说,是win10的驱动无法正确驱动我的笔记本网卡),对专业人员来说,看一眼ip、gateway、dns配置,故障在哪就了解的七七八八了。

可为了避免“吓到小白”,它把这些信息藏了。藏在九曲十八弯的很多个分支之后;而一旦你选错了分支,它就“联网寻求解决方案”——锁死窗口,关都关不掉,一定要耗上若干分钟!

这就为专业人员寻找问题根源、彻底解决问题人为制造了极大的麻烦。

这个状况的根本原因是:它根本就没有完成“网络配置”这个任务的全部封装工作、做不到“自动解决一切问题”同时又“不掩盖一切必要的信息”;却又装的好像自己把问题解决了一样、不留“窥探内部”的机会(或者把窥探内部做的复杂而曲折)——换句话说,就是相关业务的所有逻辑回路尚未闭合,因此,这种方案能解决80%的问题,但却使得另外20%的问题更加的难以解决、甚至彻底无法解决。

很显然,“完美的封装”要求对相关领域的“完美掌控”;要对这个领域的一切业务完美支持——无论是简单的、小白的业务,还是复杂的、专业的业务,都要用同一个思路一揽子解决,都要一视同仁的提供便利。

而这,并不是微软的长项。

就好像MFC时代,微软就率先给出了一个很烂但能用的、被人讥讽为“没有封装”的“封装”一样。

不过,同时代,能给出漂亮封装的并不多,也就Borland做的最成功。

在无数次失败之后,业界才找到了MVC这个近乎完美的架构

所以,我一点都不奇怪微软不去引领架构设计/编程语言发展的方向。它并不擅长这个。

至于google……这个倒是符合它的一贯形象;但能否成功,还得看实践效果——看它能不能在开发任意复杂的程序时、仍然保持界面开发的简洁性和直观性。



Tags:XML   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
.NET配置文件大揭秘:轻松读取JSON、XML、INI和环境变量
概述:.NET中的IConfiguration接口提供了一种多源读取配置信息的灵活机制,包括JSON、XML、INI文件和环境变量。通过示例,清晰演示了从这些不同源中读取配置的方法,使配置获取变得...【详细内容】
2023-12-28  Search: XML  点击:(92)  评论:(0)  加入收藏
XML验证是什么,以及在Java中如何进行XML验证?
XML验证是一种验证XML文档结构和内容是否符合特定规则和约束的过程。XML验证是为了确保XML文档的合法性和完整性,以便在使用和处理XML数据时能够准确和可靠地解析。在Java中,...【详细内容】
2023-10-27  Search: XML  点击:(269)  评论:(0)  加入收藏
程序开发中是使用XML还是使用JSON作为数据传输格式好?
在程序开发中,使用XML还是JSON作为传输对象是一个常见的问题。两者都是常用的数据交换格式,但在不同的情况下,使用XML或JSON可能会有不同的优势和适用性。XML(可扩展标记语言)是...【详细内容】
2023-10-24  Search: XML  点击:(25)  评论:(0)  加入收藏
程序开发中使用XML还是JSON作为数据传输格式好?
在程序开发中,使用XML还是JSON作为传输对象是一个常见的问题。两者都是常用的数据交换格式,但在不同的情况下,使用XML或JSON可能会有不同的优势和适用性。XML(可扩展标记语言)是...【详细内容】
2023-10-24  Search: XML  点击:(187)  评论:(0)  加入收藏
Java抓取前端Ajax的秘诀:andXML和XML
在当今互联网时代,前端技术的发展已经越来越快,越来越多的网站采用了Ajax技术来实现前端渲染。这种技术可以使得页面更加流畅,用户体验更好,但是它也给后端爬虫带来了很大的挑战...【详细内容】
2023-05-09  Search: XML  点击:(379)  评论:(0)  加入收藏
mybatis xml文件热加载实现
本文博主给大家带来一篇 mybatis xml 文件热加载的实现教程,自博主从事开发工作使用 Mybatis 以来,如果需要修改 xml 文件的内容,通常都需要重启项目,因为不重启的话,修改是不生...【详细内容】
2023-03-25  Search: XML  点击:(102)  评论:(0)  加入收藏
C#给xml文件添加带属性的父节点及子节点的方法
XML文件内容 xml操作代码示例:using System.Collections;using System.Data;using System.Xml;using System.Xml.XPath;namespace xmltest{ public partial class Form1 :...【详细内容】
2023-03-22  Search: XML  点击:(257)  评论:(0)  加入收藏
为什么微软力推XML?而谷歌则力推代码描述界面“kotlin”?
其实微软当年的MFC更接近于“代码描述界面”,Delphi等反而是通过专门的配置文件.DFM来描述窗体……比如,这个来自CSDN的截图就是一个典型.DFM文件内容:Delphi项目...【详细内容】
2022-08-21  Search: XML  点击:(320)  评论:(0)  加入收藏
Ajax 之战:XMLHttpRequest 与 Fetch API
Ajax 是大多数 web 应用程序背后的核心技术,它允许页面向 web 服务发出异步请求,因此数据可以不经过页面往返服务器无刷新显示数据。术语 Ajax 不是一种技术,相反,它指的是从客...【详细内容】
2022-05-06  Search: XML  点击:(298)  评论:(0)  加入收藏
Python解析库lxml与xpath用法总结
本文主要围绕以xpath和lxml库进行展开:一、xpath 概念、xpath节点、xpath语法、xpath轴、xpath运算符二、lxml的安装、lxml的使用、lxml案例 一、xpath1.xpath概念XPath 是一...【详细内容】
2022-03-10  Search: XML  点击:(243)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(2)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(7)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条