作为一名多年的iOS开发人员,多次触发我思酌“GUI编程与CLI编程”各自的优劣,尤其是在当我为界面交互花费大占比时间时,时常怀疑自己的工作性质,我终究还是为互联网工作的码农,而不是让互联网为我所用的明智人士。(容我把偏GUI编程看成是取悦他人,把偏CLI编程看成是取悦自己。)

-----前言

  • GUI = 功能逻辑 + 用户交互逻辑
  • CLI = 功能逻辑

支持CLI的意见:(摘抄)

1. 写GUI程序,不光要编写功能逻辑代码,还要用某个UI引擎编写一个和谐美化的界面展示给用户,如果还有很多的用户交互,功能逻辑和交互逻辑代码耦合在一起,那么代码量和代码复杂程度也会成倍增加。因为任何一个UI引擎的代码量都远远超出你要写的软件的功能逻辑代码的几十倍了,外加熟悉掌握UI引擎的用法,然后再去写界面的交互逻辑代码,这工作量也是翻几倍的。

举个简单的例子,让你做一个电子表格,比如类似于Excel的完成特定格式的数据的录入和保存,写个CLI的程序,才能有多少代码量,然而如果你要做成GUI形式的程序,代码量起码是CLI的几千倍了。

2. GUI的好处是“所见即所得”,缺点是“所见即全部所得”。

3. GUI环境通常受限于它们的设计者想要提供的能力。如果你需要超越设计者提供的模型,你大概不会那么走运,而且很多时候你确实需要超越这些模型。

4. 首先是编程方便,很复杂的功能对于GUI来说,在处理交互上可能要花费一个月时间,编写相同功能CLI的话可能只会用几天。

其次,也是最重要的是可组合:可以简单地将小程序组合起来实现各自所需要的复杂大功能。而且也方面GUI等程序在别处调用。

再次,就是跨平台。CLI不需要考虑太多平台相关的东西。而且还可以在它之上包装GUI。

还有一点就是,CLI方便远程执行,一行ssh命令就能做到。

5. CLI可以说是人机界面的远祖,哪怕是远古时期的纸带式计算机,也同样需要使用“命令行”方式工作。可以说命令行是最符合计算机工作方式的操作方式。

由于主要使用文本作为界面,CLI软件对计算机的要求也低得多,在同等配置的机器上也要比GUI软件的性能好得多。也正因此,CLI软件得以在广大的服务器系统上大行其道,在这些系统上,性能是最重要的。同时,由于具备了比GUI软件好得多的可伸缩性,CLI的使用范围也远比GUI广泛,在很多嵌入式平台上,我们甚至只能看到CLI的身影。

6. CLI的身上,带有编程的“影子”。

7.  尽管GUI提供了良好的易用性,极大地填补了人机对话的鸿沟,但在另一方面看来,实际上增加了软件开发的成本,缩小了软件的适用范围,同时降低了软件的工作性能。

支持GUI的意见:(摘抄)

1. 说句实话,如果用户都接受CLI程序的话,都会用CLI程序的话,还会有哪个Windows程序员吃饱了撑着,花百倍的工作量去做UI呢?

如果把Word或者Excel都做成命令行形式,那世界上得多增加多少Word或Excel的培训机构了?

如果把各种游戏比如《王者荣耀》做成命令行形式,那还能赚钱吗?

2. 说CLI用起来不舒服,至少对记忆力差又粗心大意的家伙是这样的。

3. GUI能呈现各种多媒体数据,而CLI基本只能呈现文本。

4. GUI由于采用了大量的图形元素,界面会更显得具有艺术性,富有人性化。相对于枯燥的文本来说,精致且合理的图形大大增加了界面的易用性。简洁明了的图形控件使得软件操作起来更为直观。

相较于GUI而言,CLI通常就不具备什么美观程度了。为了提高性能,CLI通常采用纯文本方式工作。

5. 快捷键取材于CLI,实质上是一种直接向系统发送指令的操作方式,但由于依赖于GUI,我把它归为GUI的工作元素,并视为提高工作效率而向CLI所作的折中。

6. 但毕竟人不是计算机,符合计算机的工作方式的同时也就意味着不那么人性化。

7. 另外,对于CLI软件来说,执行结果往往并不是那么清晰的。用户常常不得不面对满屏滚动的反馈信息,体验黑客帝国一般的快感,或者是仿效真正的黑客一般从浩瀚的log海洋中寻觅那条丝毫不起眼的提示信息。

8. 有人把CLI软件的工作方式称为“所想即所得”。这种方式的特点在于,虽然没有直观地反应出执行结果,但却能保证执行结果可以和你的意图一样。从某种程度上来说,这种说法是正确的,因为用户的意图总是以“命令 + 参数”的方式精确地传递给系统,最后虽然不能直观地看到执行结果,却总能发现系统已经出色并严格地完成了工作。但从某种意义上来说,这种说法是不准确的,因为当面对着长长的参数手册时,用户往往已经搞不清自己的意图到底是什么了。

9. GUI软件可以通过使用大量的图形元素和图形特效,从根本上改变软件的表现形式,“美观”和“人性化”渐渐成为软件界面设计的讨论主题。随着计算机处理能力的发展,我们甚至能够以3D的形式来呈现和操作软件。大量GUI软件的出现大大降低了学习和使用计算机的门槛,赏心悦目的操作界面吸引了各行各业的人投入其中。如果说CLI适应了各种各样的计算机,GUI则适应了各种各样的人。

10. 以操作系统开发商为例,可以说,如今做能坚守一易用性阵地的当属苹果公司。尽管其产品同样存在一些瑕疵,但直到今天,苹果公司仍然坚持发展人机界面设计学,其创造的GUI软件大都是艺术性和易用性结合的典范。

中立态度:(摘抄)

1. 因为两者面向的用户不同,初中也不同。今天看了《程序员修炼之道》这本书,可谓是有了更深入的了解。GUI侧重于易用,CLI则侧重于效率。

2. 现在几乎所有人都没办法离开GUI,对于程序员等专业用户来说不可能离开CLI。

GUI编程与CLI编程的更多相关文章

  1. Atitit 函数式编程与命令式编程的区别attilax总结  qbf

    Atitit 函数式编程与命令式编程的区别attilax总结  qbf 1.1. 函数式程序就是一个表达式.命令式程序就是一个冯诺依曼机的指令序列. 命令式编程是面向计算机硬件的抽象,有变量(对应着存 ...

  2. .net 系列:并发编程之一 并发编程的初步理论

    一.关于并发编程的几个误解 1)并发就是多线程 实际上多线程只是并发编程的一种形式而已,在C#中还有很多其他的并发编程技术,包括异步编程,并行编程,TPL数据流,响应式编程等.  2)只有大型服务器才 ...

  3. (46)LINUX应用编程和网络编程之一Linux应用编程框架

    3.1.1.应用编程框架介绍 3.1.1.1.什么是应用编程 (1)整个嵌入式linux核心课程包括5个点,按照学习顺序依次是:裸机.C高级.uboot和系统移植.linux应用编程和网络编程.驱动. ...

  4. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  5. 物联网网络编程、Web编程综述

    本文是基于嵌入式物联网研发工程师的视觉对网络编程和web编程进行阐述.对于专注J2EE后端服务开发的童鞋们来说,这篇文章可能稍显简单.但是网络编程和web编程对于绝大部分嵌入式物联网工程师来说是一块真 ...

  6. RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大、最高效的方法之一。它为在分布式计算环境中运行的几乎所有应用程序提供基础。

    RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大.最高效的方法之一.它为在分布式计算环境中运行的几乎所有应用程序提供基础.本文介绍 RPC 客户机和服务器之间基本的事件流 ...

  7. Python编程和 Lua编程的比较

    Python编程和 Lua编程的比较 2016.4.21 定义函数: python: def functionname( parameters ): "函数_文档字符串" func ...

  8. 【憩园】C#并发编程之异步编程(一)

    写在前面 C#5.0中,对异步编程进行了一次革命性的重构,引入了async和await这两个关键字,使得开发人员在不需要深刻了解异步编程的底层原理,就可以写出十分优美而又代码量极少的代码.如果使用得当 ...

  9. 如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇)(1) - 目录

    昨天发表了<如何用ABP框架快速完成项目 - 自动化测试 - 前端angular e2e protractor>后,大家十分热情,几个小时内就收到了不少问题,包括: 对于ui自动化测试这方 ...

随机推荐

  1. plsql 导出oracle数据库

    plsql 导出数据库有两个问题,一个是只导出结构,一个是导出表结构加数据这样的,首先人家让我导成sql语句 这不是简单,首先打开PLSQL 一.导出结构 1.然后tools->Export U ...

  2. Nuxt项目文件目录结构解释

    |-- .nuxt // Nuxt自动生成,临时的用于编辑的文件,build |-- assets // 用于组织未编译的静态资源入LESS.SASS 或 JavaScript |-- compone ...

  3. 【音乐欣赏】《Sunflower》 - Post Malone / Swae Lee

    曲名:Sunflower 作者:Post Malone.Swae Lee [00:02.29]Ayy, ayy, ayy, ayy (ooh) [00:09.49]Ooh, ooh, ooh, ohh ...

  4. Day1 面向对象编程与Java核心类

    this变量 在方法内部,可以使用一个隐含的变量this,它始终指向当前实例.如果没有命名冲突,可以省略this. 但是,如果有局部变量和字段重名,那么局部变量优先级更高,就必须加上this. 构造方 ...

  5. ssm框架整合,配置文件中的配置内容

    转自:https://www.cnblogs.com/dong-dong-1/p/8724127.html 使用idea工具开发,用maven进行管理. 最近在写毕业设计,因为对ssm框架一直半解,常 ...

  6. 获取目标字符串在字符串中第N次出现的位置

    /** * 获取目标字符串在字符串中第N次出现的位置 * @file name * @author xiehongwei * @date 2017-8-2 下午3:29:09 * @param sou ...

  7. 【C语言】将输入的10个整数逆序输出

    代码1: #include <stdio.h> int main() { ], b[]; int i,j; printf("请输入10个整数:\n"); ; i < ...

  8. ajax请求ashx跨域问题解决办法

    ajax请求ashx跨域问题解决办法 https://blog.csdn.net/windowsliusheng/article/details/51583566 翻译windowsliusheng  ...

  9. 记一次深坑,dubbo暴露的服务无法注册到zookeeper的原因

    项目用的架构,springboot,dubbo,zookeeper dubbo的provider作为服务单独使用,里面的service实现类使用了@Transactional注解,想集成spring的 ...

  10. P1428

    AC: #include <stdio.h> #define rep(i, a, b) for(int i = a; i <= b; i++) #define min(a, b) ( ...