界面开发的三层境界

关键词:GUI框架,UI编辑器,界面引擎,MVC

第一层境界:代码写死
笔者大学时候开始学习的语言是C/C++,学习完基本的概念后,后面想开发有界面的应用程序接触的是win32,你会发现创建一个窗口或者一个button控件要写好多代码,例如配置标题,位置,大小,背景颜色,icon等等各种属性,api接口一大堆参数。

win32创建窗口api
HWND CreateWindow(
LPCTSTR lpClassName, //窗口类型名称
LPCTSTR lpWindowName, //窗口名称
DWORD dwStyle, //窗口类型
int x, //窗口的左上角X坐边
int y, //窗口的左上角X坐边
int nWidth, //窗口的宽度
int nHeight, //窗口的高度
HWND hWndParent, //父窗口句柄
HMENU hMenu, //窗口菜单句柄
HANDLE hInstance, //应用程序的实例句柄
LPVOID lpParam //创建的参数,一般为NULL);

创建一个窗口的伪代码

HWND   hWnd = CreateWindow( lpClassName, "我是个窗口",
        WS_OVERLAPPEDWINDOW,  0, 0, 500, 300,  NULL,NULL, hInstance, NULL );

创建一个按钮的伪代码

 HWND hButton = CreateWindow(L"Button", L"我是个按钮!", 
                          WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,  
                          35, 45, 160, 65, hwnd, NULL, hg_app, NULL);  

在这个阶段你会发现开发的界面不但巨丑,而且好像有看不完的api和各种奇怪的参数,生怕设置错了参数导致程序崩溃。例如最简单的要改变一个按钮或者图片显示的位置,你要不断的设置位置坐标直到满意为止,改变一次就要重新编译一次运行看看,这个过程非常繁琐耗时。

第二层境界:自动生成代码
用第一阶段的方式来开发复杂些的应用界面,你会发现效率很低。因为当你在创建控件,写好那些配置参数的那一刻就把代码写死了,后面要重新调整界面或者大改界面时候,很多代码要重新写过。如果代码是自己写的还好,如果接手项目的新同事要读懂到修改则是个痛苦的过程。工作后才发现有一种叫ui编辑器的东西,有点规模的公司一般都会有自己开发的ui编辑器,由1-2个人来开发维护。ui编辑器就是个界面的配置系统,大多数都使用结构化的配置文件来保存界面配置信息,如xml格式。像andorid,ios原生开发环境自带的界面开发都有ui编辑器,qt,unity3d,cocos2d-x这些都也有。

例如qt的界面ui编辑器

显示界面,只要ui解析器加载一个xml配置文件就可以,不需要写一堆配置控件属性的代码,ui解析器会根据xml配置文件自动生成类似第一层境界的代码,类似伪代码如下:

ui_parser.load("xxx_view.xml")

在这个阶段你会发现客户端ui界面开发瞬间变得轻松很多,界面的控件和参数在ui编辑器里配置好,程序里加载一下ui的配置文件,甚至一行代码都不用写,界面就出来了。如果boss不满意界面,使用ui编辑器修改轻松很多,不需要改很多代码。
细心的读者会发现,这不就是MVC三层模式里的界面View和逻辑代码(Model,Controller)分离的过程吗。是的,界面的显示和逻辑代码不再耦合在一起了,这样我们会更加专注于写逻辑代码。

在第二层境界,大部分有经验的程序猿可以相对轻松的开发界面了。但是真正商业级的产品会给你提无数乱七八糟的需求,而这变化的需求不是一个通用控件可以搞定的,你会发现用xml配置那些写好的控件,到底还是太麻烦或满足不了你的需求。例如策划想游戏里面活动相关的按钮周围有酷炫的动画显示或者粒子效果,吸引玩家的注意力,或者这个按钮有可以按照某个轨迹移动的属性等等。

这时候,你可能会为了快速完成工作任务,新建一个XXX_Button类,继承原有的button基类或者直接修改button控件基类,添加新的动画属性、粒子效果属性,移动属性,然后ui编辑器添加相应配置的属性。下次有新的需求,再类似这样修改。如果不只是button控件要添加这些属性,策划还想下拉框、单选框、列表、文本等控件,也有各种需求,原有的控件不能满足,而有些控件添加相同的属性,这时候该怎么办呢?

如果你使用的这个ui编辑器和ui解析器不是开源的,例如android,ios原生开发工具,qt designer等,当原有的控件不能再满足策划的需求,通过继承原有控件基类或自己重新自定义新的控件类型方式开发,这时候闭源的ui编辑器不能自适应新的控件类型,你又会倒退回第一层境界的方式来开发gui,开发效率又变低了。

第三层境界:抽象的层次和组合
在第二层境界,笔者也想了好久,怎样的ui框架或者ui编辑器可以适应各种需求变化,更方便开发,参考了其他各种ui框架和ui编辑器。

最终发现,当你的思维观念中还执着于传统的ui控件体系,还执着于ui框架和ui编辑器的时候,很难再往上提高,需要有勇气去打破原有的思维观念,这对其他编程概念也是一样

后来笔者在迅雷bolt的界面引擎和html+css+js找到新的思路,不是一上来就用传统的控件体系开发界面,而是把控件共同的属性抽象成更小粒度的元素,比控件层更高一层次抽象,例如迅雷的各种原子控件或者html里各种的基础元素,通过不能再拆分最小元素自由组合拼装成更适合你的控件。你会发现web前端总是不断有各种酷炫新的ui框架出来,开发界面速度比客户端用原生的开发工具要快, 是因为这种模式更容易定制你想要的ui控件。慢慢你开始定制自己的UI框架,而不是使用别人开发的。再配合脚本语言(如js,lua)的粘合,ui编辑器里也可以轻易编写控件的交互逻辑,不单单只是配置控件属性。

如qt里的qml语法格式非常像CSS,但又支持javascript形式的编程控制。

unity3d的组件方式也是用这种元素+组合的方式,但它是把一切都抽象成object, 提供各种组件,你需要什么功能在object上添加组件就好,例如添加个label组件就变成文本控件。

第二层境界扩展控件方式

第三层境界编写控件方式

读者再来看个html、css、jq制作的一个简洁的音乐播放器的例子

你会发现用html和css代码很少,却很容易做出简单酷炫的界面,同时css的代码可以被复用。

界面开发是个很广大领域,有很多相关的概念没有涉及到,笔者写这篇文章也算是对过往开发的一个经验总结吧。

分类: 编程思想

时间: 2024-08-03 15:23:45

界面开发的三层境界的相关文章

Java 图形界面开发--图文并茂建立学生管理系统

图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作. 这是本人在学习java图形界面开发阶段一步一步实现的超级简易的学生管理系统.虽然说不入大神法眼,但这确实是费了自己不少心血.对于我这样的菜鸟来说,考虑不周到,一不小心就Exception,然后就是自己调呀调.在此分享出来希望对和我一样的菜鸟有帮助. 程序完整代码下载地址见: https://github.com/chaohuangtianjie994/The-Sys

C++/SDK界面开发总结

对于不习惯用MFC的程序员来说,写界面应该是一个头疼的事情了.调用duilib等开源界面库的不讨论,本文主要说说Windows的原生界面功能开发,作为一篇总结,帮助新手入门. 1.窗口 主要通过新建资源窗口实现布局,调用就通过 DialogBox 和 CreateDialog 实现界面的显示.其中 DialogBox 为模态窗口, CreateDialog 为非模态窗口,简要说说区别: 模态窗口:在没有父窗口的时候,调用 DialogBox 实现显示窗口.系统在 DialogBox 这儿卡住,直

ios 界面开发中的常见元素

界面开发中的 CGPoint.CGSize.CGRect.CGRectMake.window(窗口).视图(view)简单记录 定义 /* Points. */ struct CGPoint { CGFloat x; CGFloat y; }; typedef struct CGPoint CGPoint; /* Sizes. */ struct CGSize { CGFloat width; CGFloat height; }; typedef struct CGSize CGSize; /*

ExtJs是当今最主流的前端界面开发工具之一

摘要:ExtJs是当今最主流的前端界面开发工具之一,功能强大,外观绚丽.虽然网上的开发文档很多,但是在实际应用中仍然会遇到很多问题,本文结合企业信息化.SAP ERP等实际项目开发经验,对使用ExtJs开发做了一个梳理和总结,特别对开发中遇到的重点问题进行了详细阐述,希望能够为大家提供一些帮助.    关键词:ExtJs  IMS  RIA 作用域 id冲突 风格统一1 引言    随着互联网技术的不断发展,网站的互动性越来越强,软件从C/S到B/S,又到了B/S结构的C/S界面体验,伴随着大量

WWDC 2014 Session笔记 - iOS界面开发的大一统

本文是我的 WWDC 2014 笔记 中的一篇,涉及的 Session 有 What's New in Cocoa Touch Building Adaptive Apps with UIKit What's New in Interface Builder View Controller Advancements in iOS 8 A Look Inside Presentation Controllers iOS 8 和 OS X 10.10 中一个被强调了多次的主题就是大一统,Apple

界面开发与底层开发到底哪个有技术含量

今天是换部门的第一天,从之前的格式转换部门到了图像处理部门.刚刚接触图像处理,很多最基本的概念都不懂,也就做了最基本的图像处理方面的一些练习.就算是入门了吧.说说自己这些天来的感受以及对于微软和软件开发的吐槽. 记得大学做毕业设计的时候,毕设用的还是命令行界面.答辩的时候,出现了以下的对话: 老师:你是用C++写的么, 我:是啊. 老师:怎么不是图形界面.(黑框框是我对命令行界面的称呼) 我:##¥¥@@**&&& 当时我就凌乱了.好吧,如果是外行人觉得C++ == VC++ ==

基于Qt的类QQ气泡聊天的界面开发

最近在写IM 聊天界面,想设计出一个类似QQ气泡聊天的样式 使用了几种办法 1:使用Qt下面的QListview来实现QQ类似效果,差强人意 2:使用QWebview加载html css样式来完成,发现效果不错,但是毕竟webview占用巨大的内存 3:使用QTextBrower加载css,但是好像只支持css2.1版本,css3完全不支持,这样的话,花哨的样式应该是无法实现 基于以上三种思路 最后发现还是QML实现比较好,但是qml基于文本与动画图片混合显示没找到好的办法,有好的办法的希望可以

简单java web实现界面开发

有关javaweb的一个简单的登陆界面开发 这里使用的工具是eclipse.sql 2016.tomcat8 开发前需要在eclipse中完成tomcat和SQL的连接配置,这里tomcat在web项目运行时会自动的启动,下边介绍开发步骤 一.web项目的建立 打开eclipse点解File->New->Dynamic Web Project 进入以下界面,输入项目名称 点击next 再点击next,进入下一界面 将箭头指向的位置选中,点击finish及完成Web项目的创建 三.数据库建表 打

MVC 界面开发

1.什么是设计模式 mvc只是其中一种,对某一类具体问题,总结出来的一套最优的解决方案 1.MVC: 1.Model(模型)     View(视图)    Controller(控制器) 的缩写 Model:程序中处理数据逻辑  (数据存储.业务逻辑.多线程.网络传输.文件存储) View:程序中处理数据显示 Controller:View和Model的媒介 2.优点: 1.耦合性低 2.重用性高 3.可维护性高   (结构清晰.可重用.方便维护) ***1.对引用数据类型,在保证在第一次访问