Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
254 views
in Technique[技术] by (71.8m points)

一种GUI描述方法

程序设计百花齐放,可能有成千上万中程序设计语言,TOIBE有排名,列举了排名靠前的100种。凭什么GUI描述只能使用html/xml呢?

当然,使用html/xml有好处,有大量使用htmljs的网页设计师。但是,xml的缺点是显而易见的 --- 虽然看上去不复杂,用起来不难,但是给程序员和计算机带来的计算浪费、费的电恐怕要以亿万来记。

想一想,浏览器一天要解析多少次html?如果表达能力和html相当,但是程序解析更容易,哪怕每个网页节省1ms,给这个世界带来的电费的节省,恐怕都是难以计量的。

我所谓的节省,并不是程序设计水平高,写的程序更好,所以节省时间,而是因为html/xml规则本身的问题。

linus很久之前就对xml的批评,下面是我找到的一些翻译:

“XML 可能是设计的最糟糕的格式,作为一种文件格式,它真的没有扩展能力,它通常是一个完全的灾难。“
“XML 是胡扯。??解析 XML 对人类来说是??讨厌的,甚至对计算机来说也是一场灾难。没有理由让这个可怕垃圾存在。
“2014年3月6日

好了,现在谈谈我的GUI设计方法。如果吹嘘我的这种方法世界第一,不现实。但是对本人来说,确实最便于解析的。其实,我希望人们都设计并实现自己的GUI描述方案,甚至使用非html/xml浏览器。毕竟,这种费电的垃圾不应该继续存在。人们不得以使用,也只是因为没有更好的选择。

下文谈到的GUI库,起初只是想使用C/C++编写GUI程序时更容易、更加符合正常人的思维,而并非要取代html/xml。但是,我写这些时,一堆人劝我html好 xml好啊,是业界标准啊等一堆废话,我不得不批评一下这些业界垃圾。我批评没是什么说服力,于是找了linus的一段话。

与其在网上找一些开源的xml解析库,上万行代码,确实不如自己自创更加容易解析格式。这是我的观点,比如我的下文@gui格式,是专门为gui描述设计的,我用c++解析,300行代码,完成了最多1000行。程序代码规模缩小了10倍以上。程序解析效率,暂时还没比较,快10倍不敢保证,快2、3倍不在话下。

我相信,一个脑子正常、认真思考的人,都能设计出比xml/html更加便于解析而表达能力相当的语法。我的方案,也许是其中最差的一个;但是,即使我这个最差的设计,也要比html/xml好上10倍。

xml号称通用的格式,所谓的通用,意思是这也不行,那也不行 --- 人们对此要有认识。

如果说html格式解析困难,是垃圾。那么js垃圾不垃圾?node.js垃圾不垃圾?世界上这么多使用js的node的程序员是不是都是垃圾?

互联网五花八门,其中很多大公司既得利益者,其中并不少缺少一群走狗。他们习惯了一项技术,并从中受益,当然会为这些垄断技术背书。他们的无耻无知之处,在于他们对这种罪恶一无所知。假如它们幸运的看了我这段话,也许会醍醐灌顶,醒悟过来。

我想,多数都是勤恳工作学习的普通人,但是必须承认,html和js并非完美的。人们不能因使用的人多、大公司支持等等各种原因而拒绝改变,拒绝创新。而应该像陶渊明一样,不为五斗米而折腰。

最后,我还要批评html和xml所谓的“开放”格式 -- html真的是开放的吗?确实,人人都能使用。但是,说到底,他不过是一群垄断公司,出人出钱商量出来的玩意。与其说是开放,不如说是垄断。

大公司不在乎用户费电,准确来说,他们也许希望用户费电,希望用户换CPU,他们好扩大生产,更新换代。所以,如果微软、google以及各个浏览器厂支持html/xml恰恰证明了,这是错误的选择。毕竟,没有人相信,他们真的会为用户的利益着想。

; 变量定义

@var

a=12 b="helo world" c=12.5 d=true

; 图形界面描述
@gui

1 <WINDOW> name="first" click=firstclick title="测试" top=100 left=100 width=100 height=100 image="D:est 1.bmp"
  2 <DIV>
    3 <TEXT> name="t1" caption="My..."
  2 <WINDOW>
    3 <TEXT> caption=b
    3 <DIV>
      4 <TEXT> captiion="Hello world"

; 初始化函数
@init

; 调用C++/Python等各种程序设计语言的函数,返回值可以存进变量。 
a=cpp_fun1(12,"hello")  $first.title=a


; 控件的键盘、鼠标处理函数
@firstclick

$first.title="Changed Titile"

以上文件,包括4个部分:

一、变量定义 @var

这部分定义一些变量,变量在下文中可以直接使用,并赋值。下文中的Text的caption的值为"hello world":

    3 <TEXT> caption=b

二、图形界面描述。 @gui

这部分描述你的图形界面,上文是一个简单的描述。实际中,你的程序可能需要很多窗口。大致是这样的:

1 <WINDOW> name="first" click=firstclick title="测试" top=100 left=100 width=100 height=100 image="D:est 1.bmp"
  2 <DIV>
    3 <TEXT> name="t1" caption="My..."
  2 <WINDOW>
    3 <TEXT> caption=b
    3 <DIV>
      4 <TEXT> captiion="Hello world"
1 <WINDOW> name="option" 
  2 <panel>
    3 <checkbox>
    3 <TEXT> name="t1" caption="My..."

注意:以行为单位。也就是说:

    3 <TEXT> name="t1" caption="My..."

不能分几行来写。这么做的目的是为了方便程序员解析。

每一行开头的数字表示该控件的层次,1意为顶层窗口,n+1层表示绘制与N层中。不同的层次控件用空格缩进,这么做是为了美观,你能一眼就知道第二层在第一层控件里面绘制。

我们注意到上文中有两个1层窗口,我们的库默认只创建第一个窗口,其余的窗口可能在后文中的函数中创建并显示。

top left width height是分辨率单位,但是,一个良好的gui,应该指定百分比而不是分辨率。因为指定了百分比,只要精度可以,我们不需要知道屏幕的分辨率大小。

1 <WINDOW> name="first" click=firstclick title="测试" top=10% left=10% width=90% height=80% image="D:est 1.bmp"

三、@init函数

这是创建窗口后的初始化函数,在这里,你可以调用C++/Python等语言的函数,可以把返回值赋给变量,以便后面继续使用。

$first.title=a将更改name为"first"的控件的标题。

四、鼠标、键盘处理函数如下:

click:单击
dblclick:双击
mousedown:鼠标按下
mouseup:鼠标抬起
mouseover:鼠标悬浮
mouseout:鼠标离开
mousemove:鼠标移动
mouseenter:鼠标进入
mouseleave:鼠标离开

keydown:按键按下
keyup:按键抬起
keypress:按键按下抬起

以上是JavaScript的键盘鼠标处理函数。子控件的键盘鼠标处理函数将会覆盖父控件的处理函数。

用户应当在标签页属性中指定上述中的若干个事件处理函数,然后编写你的处理函数,比如@firstclick,就是name=“first”的<window>的单击事件处理函数。

在函数体中,你可以调用C++ Python等语言的函数。

总结:

到这里,一个简洁、优美的GUI编写方法就完成了。笔者毫不怀疑,这种编写GUI的设计方法超过目前所有的GUI库,特别是各种乌七八糟的面向对象库。但是,具体到具体的实现,我想也许我们可能避免不了使用一些OO GUI库。

如果你想在Python里实现这种,你可能要使用Python tkiner或者wxpython,总之一种OO GUI可能是少不了的。也许,这些GUI库,不够用,你可能要使用功能更加丰富的GTK,但是也许会使用Windows API或者xlib。

理论上,该方法不受操作系统、程序设计语言的限制。实际上,使用这种方法编写GUI程序的人,可能只有我一个。假如有同学觉得这种方法好,而且编程功利扎实,不但能实现上述文本分析,而且能编写各种控件....

你所需要做的只有两件事:

一、编写程序能解析这种GUI描述。这不是一项多么困难的工作,但是也不轻松。特别是@gui部分。你需要小心处理你的树形结构。增加节点,删除节点,遍历节点。我相信,多数程序设计者做过类似的工作。大致结构如下:

struct MyControl{
   struct MyControl *parent;  //父控件
   struct MyControl *child;  //子控件
   struct MyControl *bbrother; //兄弟控件,同一层次
}

以上,省略了每个节点具体的信息,简单给出了必须的父子兄弟指针,最终,我们得到一颗树颗结构。

二、小心编写你的控件代码。也就是各种控件标签的实现<window> <text> <div> <panel>....
这部分有点复杂,形形色色的控件,需要设计不同的属性。这部分可以参考html标签和各种GUI库控件。

最后,贴上我写的程序:

https://github.com/zhangyun00...

再重申一下逻辑:

html/xml复杂难以解析 -- 费CPU费电(也费人脑) -- 大公司希望用户费CPU,特别是Intel等CPU厂商,费电了人们就不用了?不是而是更新换代。

也就说说,大公司会故意把东西做的难用,难以解析,然后出升级版让用户掏钱。

小公司也是,程序员把某些东西写死,用户提需求,然后改一下,大笔的钞票到手了。

多数人认为chrome、firefox、ie...等等是竞争对手,实际上,它们也许是狼狈为奸。

实际上,C++也是垃圾,很可惜,上了贼船。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

你应该使用右上角的“写文章”或“记笔记”的功能来发布,这里是问答区,你写这些内容会被diss的。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...