CS193P第十八堂课摘要及心得笔记

在这一堂课程中,我们将看到 OCUnit 这套 Objective-C 的 Unit testing framework,还有看到 Objective-C 一些有趣的使用方式,可以帮助我们深入研究 Cocoa Touch 中 framework 的内部结构,最后还会提到如何帮应用程式设计多国语言版本,以下是笔者的一些整理,还请多多指教!

Unit Testing

Unit Testing 是近年来很热门的一种测试方法,特点有:

伴随着 Unit Testing,Test-Driven Development也逐渐的受大家瞩目、採用,TDD 顾名思义,就是在开发程式之前先行撰写测试的 cases,并且随着开发一一通过这些预先撰写的 cases。

用个比喻,编译器是用来检查程式的语法正确性,而 unit test 则是检查语意是否正确。因此,许多 unit testing 的 framework 会在每次编译完成后进行测试,以确保程式的开发顺利。而这样的框架在 Python 平台有 PyUnit、Java 平台有 JUnit,同样的,在 Cocoa 的平台上也有 OCUnit 来帮助我们撰写各种 cases 并且进行 unit testing。而 OCUnit 跟 XCode 也做了完美的结合,可以自动在每次 build 完成后进行测试,并且显示错误。

虽然听起来有点奇怪,不过 OCUnit 在 Cocoa 中是被称作 SenTest,所以如果你在文件中看到任何 SenTest 有关的类别,其实就是 OCUnit 测试框架的一部份。

那我们要如何开始撰写测试程式呢?首先我们必须先建立一个 SenTestCase 的子类别,而这个子类别中所有以 test 开头的方法都会自动被执行进行测试,而在那些方法中,我们可以使用 SenTestCase.h 中所定义好的 Macros,像是 STAssertNotNil; 可以检查某物件是否并非为 nil,若为 nil 则显示第二个参数的字串。

此外 SenTestCase 还提供了 - setUp 和 - tearDown 两个方法可以重载,而这两个方法分别会在每个 test 方法的执行前和执行后被呼叫。也就是说,我们可以在这两个方法中建立新的物件,这样就可以确定每个测试方法之间所使用的物件不会互相干扰。

在课程影片以及投影片的第 14 到第 20 张中有简单的测试範例,有兴趣的读者还请自行参考。

Objetive-C 的乐趣

Objetive-C 本身是个相当有趣的语言,或许读者在刚刚阅读前一部分的时候曾经感到疑惑,为什幺 SenTestCase 可以找到所有以 test 开头的方法呢?还是有什幺其他有趣的技巧呢?

在学习这些技巧之前,我们得先看看电脑中的 /usr/include/objc 目录,这里面包含了 Objetive-C 中的许多定义标头档,包含以下:

而这里面最有趣的莫过于 runtime.h,里面包含了以下检视类别和方法的函式:

而得到了这些资讯之后,我们甚至可以修改内容:

你可能会很好奇,那为什幺不用 Category 来加入、修改方法就好了呢?背后的原因是,Category 先天上就限制了我们只能做有限的修改,假使我们想要呼叫类别原本所拥有的方法,在 Category 上是无法做到的。

然而,Apple 建议大家尽量不要使用以上这些技巧在公开发布的软体当中。事实上,这些修改会影响整个程式的执行,假使你使用了其他人所撰写的类别方法,你所作的修改很有可能也会影响到那些由他人撰写的程式码,而造成一些难以理解的 bugs 产生。

多国语系

大家都知道 iPhone OS 本身就是一个多国语言的作业系统,我们可以轻易的在设定中切换所想要使用的语言,而整个系统中的内建应用程式也会随之改变,而对于应用程式开发者而言,我们也可以透过同样的机制处理。

要注意的是,iPhone OS 会自动的帮我们判断在取用多国语系的资源时所要使用的语言,在做后续的操作时都不需要另外做去指定语言。

多国语言化的整个过程可以分成两个步骤:

在 iPhone OS 上,我们可以所需要处理的部份仅制于使用者端的显示元素,这些元素可能会是字串、图片或是 Nib 等。

以字串来讲,对于那些使用者介面上的文字,我们可以将其另外存成.strings 档案,这档案透过 UTF-16 编码纪录了一组组 key-value 的值。而我们可以透过下列方法来取用这些字串:

// 读取 Localizable.strings 中的字串 NSLocalizedString; // 读取特定某个 table 的字串,本例为 Greetings.strings NSLocalizedStringFromTable;

而为了方便我们能够快速的建立这些 strings 档,我们可以在终端机下面使用 genstrings 这个指令,会自动的扫描我们的.m 档并且产生出.strings 的档案。

CS193P第十八堂课摘要及心得笔记
至于对于其他的图片、nib 档这类资源而言,我们则是可以透过 XCode 中的下列选项建立多重语系的版本:
CS193P第十八堂课摘要及心得笔记
而在之后我们就可以在 XCode 中看到同一个资源拥有了多个版本:
结论

我们逐渐走向了课程的尾声,不知道大家是不是也跟我一样从 CS193P 的一系列课程中学到很多呢?在下一次,也就是最后一次的正课中,我们将看到如何在 iPhone 平台上使用 OpenGL ES 建立 3D 应用程式,还请各位读者继续指教。

参考资源