我感到非常害怕,在项目结束之前,我可能最终会处理非常多的领域 – 对于每个领域,我都必须确保它们遵循非常类似的约束和行为(例如,我希望他们在最小和最大值之间有界限;我想要能够区分“基本价值”和“临时奖金”;我想要能够增加和减少两者,而不需要通过一个设定者和吸烟者) .突然间,对于每个领域,我需要一个(两个)吸气剂和四个设置器,也可能需要几个重新设置!即使是10个领域,这意味着很多方法都是一样的,eek.
对于DRYness,我已经开始封装了在Field类中混乱这些统计信息的逻辑,所以我可以编写如intel.applyBonus(10)或者hitpoints.get()这样的代码(它关心返回值在范围内)等等我甚至已经走了这么长的一段时间来组建这些领域的课程,但现在不是这样.
现在,我在“插入”字段到GameCharacter时遇到这个问题:大多数Java教科书都说每个类都应该有公共的getter和setter的私有字段.这在理论上听起来不错,而且我已经围绕int构建了一个整个类;然而,当你发现自己叫一个吸气剂来获得一个吸气剂时,这个想法听起来不是那么坚实:
thisCharacter.getIntelligence().get() //eeek
我更喜欢直接访问该字段.也许这是我的Python / VB [1]“背景”,但对我来说,它更干净,更清晰,更直接:
thisCharacter.intelligence.get()
公共领域的(理论)问题是我放弃了所有的控制;例如在代码库中的某个其他位置,由于不幸,可能会发生以下情况:
thisCharacter.intelligence = somethingThatReallyIsNull;
听起来像一个微妙的错误…但是我的意思是,我真的要担心吗?我从来没有计划直接分配领域[2],我已经在Javadoc中记录到这不是应该做的事情,但是我仍然是新的,所以我有点被撕毁了.
所以我想听听你对这个话题的看法.封装的优点如此之大,以至于我应该继续前进,吸烟者和吸烟者等等,或者我应该采取健康措施的封装,并将该领域作为公共领域?
[1]是的,我知道.我一直在努力忘记.但是最近我们刚刚看到一些C#和人,不是物质甜美.好吧.
解决方法
例如,具有从键到值的属性映射.
提供公共电话来获取和设置属性,但不要让所有人使用它们(或确保它们不).相反,创建类来表示您感兴趣的每个属性,该类提供了用于操作该属性的所有功能.例如,如果你有强度,你可以有一个“StrengthManipulation”类被初始化为一个特定的Player对象,然后提供getter,setter(所有与适当的验证和例外),或许像计算强度与奖金等.
其中一个优点是您可以将您的属性与播放器类的使用分开.所以如果你现在添加一个Intelligence属性,你不需要处理和重新编译所有只有强度的操作.
对于直接访问字段,这是一个坏主意.当您访问VB中的一个字段(至少在旧的VB中)时,通常调用一个属性getter和setter,VB会为你隐藏()调用.我的观点是你必须适应你所使用的语言惯例.在C,C,Java等中,你有字段,你有方法.调用一个方法应该总是有()来清楚它是一个调用,其他的事情可能会发生(例如,你可能会得到一个例外).无论哪种方式,Java的一个好处就是它的语法和风格更加精确.
VB到Java或C就像Texting研究生科学写作.