6.3 一个更通用的API
一个更好的方法是使文本类更加通用。它的API应该只用基本的文本功能来定义,而不反映将用它来实现的更高层次的操作。例如,只需要两个方法来修改文本。
第一个方法是在文本中的任意位置插入一个任意字符串,第二个方法是删除大于或等于开始但小于结束位置的所有字符。这个API还使用了一个更通用的类型Position
而不是Cursor
,后者反映了一个特定的用户界面。文本类还应该提供通用的附加功能来操作文本中的位置,比如像下面这样:
该方法返回一个新的位置,该位置离给定的位置有一定数量的字符。如果numChars
参数为正数,则新的位置在文件中比position
靠后;如果numChars
为负数,则新位置在position
之前。该方法在必要时自动跳到下一行或前一行。有了这些方法,删除键可以用以下代码实现(假设cursor
变量持有当前光标位置):
同样地,退格键也可以用以下代码实现:
使用通用的文本API,实现删除和退格等用户界面功能的代码比原先使用专用的文本API的方法要长一些。然而,新的代码比旧的代码更易于理解。一个在用户界面模块工作的开发者可能会关心哪些字符会被退格键删除。在新的代码中,这一点很明显。而在旧的代码中,开发者必须到文本类中去阅读退格方法的文档和(或)代码来验证这个行为。此外,通用方法的代码总体上比专用方法少,因为它用较少的通用方法取代了文本类中大量的专用方法。
一个用通用接口实现的文本类除了用于交互式编辑器外,还有可能被用于其他用途。举个例子,假设你正在构建一个应用程序,通过将所有出现的特定字符串都替换为另一个字符串来修改一个指定文件。专用的文本类的方法,如backspace
和delete
,对这个应用程序没有什么价值。然而,通用的文本类已经有了新应用程序所需的大部分功能。所缺少的只是一个搜索给定字符串下一次出现位置的方法,例如:
当然,一个交互式的文本编辑器很可能有一个搜索和替换的机制,在这种情况下,文本类已经包含了此方法。
Last updated