2.14 隐藏变量
Android游戏开发详解
注意,到目前位置,我们能够以两种不同的方式来修改Phone对象的状态。我们能够使用点运算符直接访问其变量,并且分配显式的值;还能够使用Phone对象提供的行为来间接地修改Phone对象的状态。
如果能够直接深入到myPhone对象,取出其信息并修改,我们说对象的变量是暴露的。从现在开始,我们将禁止暴露变量,基于很多原因,暴露变量可能会有问题。
例如,如果某人试图给一个变量分配一个非法的(或者不符合逻辑的)值,会怎么样呢?如下的代码对Java程序来说可能是可以接受的,但是,随后如果我们想要扩展这一程序的话,它可能会引发问题,并且这些值真的可能会影响到一些其他的功能。
myPhone.androidVersionNumber = -10; // Version should be positive
myPhone.poweredOn = false; // This is fine
myPhone.playingMusic = true; // Shouldn’t play music while phone is off
暴露变量可能会引发问题,另一个原因在于,我们可能需要处理敏感信息。如果要运行一个本章开头所讨论的视频共享站点,我们可能不想让用户访问User对象的password变量,它应该总是隐藏起来的。在这里,安全性是一个问题。
我们想要隐藏变量的第三个原因,是为了可维护性和可扩展性。当我们随后有更加复杂的程序和游戏,它们带有众多不同类型的、彼此交互的对象,这时我们想要尽可能地减少依赖性(即那些严重依赖于特定交互的功能)。我们需要记住,程序和游戏可能会改变。你可能选择删除类并创建新的类,但是,你不想让这样的情况发生:即不得不重新编写整个应用程序来处理一处小小的修改。
例如,我们假设你有一个Enemy类,它与Player类和GameLevel类交互得很好。稍后,你决定要删除Enemy类,并且用一个SuperZombieOrangutan类来替代它。如果在Enemy、Player和GameLevel类之间有太多的依赖性,你可能需要重写这些类以处理新的敌人类型,你将要创建3个新的类而不是一个。这可能会变成一种恶意的模式。如果这需要花费很多的时间,你可能确定这一修改并不值得,这意味着你的游戏将会少一种僵尸怪兽。这绝不是好事情。
简而言之,你想要能够为游戏添加想要的功能,又不必担心修改已有的代码会成为可怕的梦魇。这意味着,我们想要让类尽可能地保持独立,而隐藏变量是朝着正确方向迈进的一步。我们将在后面的一章中更深入地讨论这一概念。