从Win32到Cocoa:Windows用户将要转到Mac OS X

十年前的这段时间(2008年4月至6月),我们无畏的微软大师彼得布莱特显然有身份危机。这个终身的PC用户真的被推到了边缘吗?他是否考虑切换到... Mac OS?!?尽管我们的员工心怀感激的经历了一个今年的略带压力的纪念日,但整个周末我们正在对这三部分系列进行重新设计,这一系列可能会成为2008年左右存在的操作系统难题。第三部分于2008年6月1日发布,下文未经编辑。

我已经描述过不幸和困难是如何使苹果公司摆脱传统限制蜕变为的新操作系统平台的; 而且我还讨论过微软如何不这样做,而是选择过多的遗留包袱来阻碍它的新操作系统的出现。

现在,我们来看看为什么我要考虑这个大转变:苹果用它的平台做了什么让它变得如此吸引人?当然,如果你已经在为Mac编写软件,那么我不会告诉你任何你已经不知道的东西。但所有这些对我来说都是新鲜事物,因为直到我对Windows彻底失望之后,才真正开始认真对待Mac提供的东西。

NeXT连接

首先,让我们简要回顾一下苹果在收购NeXT时得到的结果,以及今天依然活着的NeXT技术的一些重要部分。当苹果购买NeXT时,它正继承了许多方面相当不寻常的操作系统的血脉。大多数操作系统都是用C语言编写的,并用C术语定义OS的所有API和扩展点。这是因为C的简单性意味着几乎所有的编程语言都可以调用C 的API而没有太多困难。C是非常通用的语言的编程语言 - 将操作系统功能暴露给应用程序是适当的,但不完善的。NeXTstep是(现在仍然)不寻常,因为NeXTstep逆转了这一趋势。NeXTstep并没有完全避开C,事实上,许多低级特性确实使用C API--它使用BSD UNIX去确保定义的很多功能的实现,因为UNIX和C可以协同使用,但它也使用了动态的,适用于很多事情的面向对象的语言,如Objective-C。

Obj-C是C和Smalltalk语言之间的一种混合体。Smalltalk是一种从未被广泛使用过的小众语言,但它特别强大地支持一种面向对象编程的方法,称为消息传递。在消息传递OO中,对象互相发送消息以执行操作。当一个对象收到一条消息时,它可以检查它并选择响应,忽略它,或者将它转发到其他地方。在程序实际运行之前,对象是否知道如何处理消息是未知的。开发人员编写的程序代码不需要包含哪些消息发送到哪些对象的任何特定限制,事实上,当程序运行时,对象可能响应的消息也可能会有所不同。尽管这种动态行为在脚本语言中并不特别,在系统编程语言中很少见。消息传递的方法在面向对象的世界中是非常罕见的; 大多数OO语言(包括所有常见的语言:C ++,Java,C#)为其OO工具使用不同的模型,其中一种基于Simula语言。这种方法更严格; 程序编译时确定是否可以在给定对象上调用特定函数,而不是在运行时确定。

Obj-C的Smalltalk-inspired面向对象部分完全独立于C部分。任何C程序都可以由Obj-C编译器编译; 在Obj-C程序中使用C 的API是微不足道的,因为Obj-C可以完成C可以完成的所有工作。许多语言根本不具备Obj-C认为理所当然的功能,尤其是当涉及到一些更复杂的功能时。

模型 - 视图 - 控制器

和这种不寻常的编程语言一起的是利用该语言独特属性的API。API被分成许多“框架”,每个“框架”都涵盖了一个特定的功能区域。尽管这些框架随着时间的推移而不断发展(NeXTstep的历史比我在这里描述的要复杂得多,而且这个历史对API的开发有相当大的影响),但有两个特别重要,因为它们是组成Cocoa。

Cocoa API有两部分; “基础套件”和“应用套件”。Foundation Kit提供几乎所有程序的基本功能:字符串操作,容器/集合类,XML解析,文件I / O等等。Application Kit是提供GUI编程功能的应用程序包。就在这里,Mac OS X(和之前的NeXTstep)将自己与Win32等平台区分开来。

开发Smalltalk的人也设计了一种编写称为“模型视图控制器”(MVC)的GUI应用程序的设计方法。MVC的想法是将应用程序分成三部分; 模型,代表应用程序实际关心的事物(例如文本编辑器中的文档); 包含应用程序中数据的可视表示的视图,例如按钮和文本框; 和控制器,它们将两者连接起来,并确保其中的更改能够正确传播给另一方。该模型对所有视图都是通用的,每个视图代表不同的部分,每个视图都有一个相应的控制器。尽管这种书写应用程序的使用模式非常广泛,但它对于Application Kit尤其重要。应用程序工具包烘焙了许多MVC功能,

这意味着今天

Cocoa应用程序只是凭借Cocoa应用程序就能免费获得许多东西。预定义的模型,视图和控制器提供了可由软件使用和扩展的强大的内置功能。例如,类NSTextView提供了一致的多行文本编辑视图,其中包含多种字体,字体大小和文本颜色,以及带有无限制撤消/重做的拼写和语法错误下划线的红色和绿色波纹。随着新功能被添加到NSTextView类中,使用它的软件可以自动获取这些功能。

NSTextView并不是一些单一且不灵活的类,它将不同的责任区域交给其他类。例如,文本在NSTextView中流动的方式由名为NSTextContainer的类进行管理,该类执行换行和类似任务。但是,如果NSTextContainer没有做到你想做的事(也许你希望能够将任意形状的对象放入文本中并让文字重新排列),那么你可以用自己的类替换它。只要它对相同的消息作出响应,它就可以作为可代替的直接替换使用。

Apple提供的类的自定义机制强烈依赖于Obj-C功能。虽然大多数面向对象语言中的子类化方法是一种选择,但并不是唯一的方法。Obj-C可以轻松地将消息转发给不同的对象意味着委派(一个对象将行为的责任传递给另一个对象)很容易表达和支持。与Java或C ++不同,委托对象不需要实现任何特定的接口或扩展任何特定的基类; 它可以只听它感兴趣的单个消息并忽略其他所有内容。这使得单个操作的更换或修改变得快速和简单。

为了充分利用这个框架,你还需要看看Apple的开发工具,特别是Interface Builder,这是Apple的用于构建用户界面的应用程序。Interface Builder是另一个NeXT控件; 它的出现最终可追溯到20世纪80年代,并且是第一个允许使用拖放和鼠标构建用户界面的开发工具之一。在Interface Builder中,Views对象可以排列并连接在一起,为应用程序构建一个接口。一旦拥有View对象,您就可以添加一个Controller来将View与您的模型绑定,以将更改从一个传播到另一个。最后,将各个字段放入各自的视图中,并将按钮和其他交互元素连接到操作,以便在使用UI时实际发生的事情

Interface Builder使得将用户界面放在一起非常容易。如果你完全没有设计技巧,你可能不会得到一件艺术品,这是事实。但同样,它不太可能看起来很糟糕。系统附带的视图是操作系统中其他地方使用的视图,它们带来很多行为。出现适当的指南是为了帮助用户以正确的方式排列物体,并且遵循这些指南应该防止任何可怕的事情。

  • 发表于:
  • 原文链接:https://arstechnica.com/gadgets/2018/05/microsoft-learn-from-apple-iii

扫码关注云+社区

领取腾讯云代金券