![]() |
1
8
我的经验是在你需要 许多 在字段中,字段的数量、性质、命名和类型非常灵活,在项目的整个生命周期中都可能发生变化,因此您可能需要某种类型的映射而不是字段。 例如,具有从键到值的属性映射。 提供获取和设置属性的公共调用,但不要让每个人都使用它们(或确保它们不使用)。相反,创建类来表示您感兴趣的每个属性,该类提供了操作该属性的所有函数。例如,如果你有力量,你可以有一个“强化hManipulation”类,它被初始化为一个特定的玩家对象,然后提供getter、setter(所有都有适当的验证和异常),也许还有一些东西,比如用奖金计算力量等等。 这样做的一个好处是,可以将属性的使用与播放器类分离开来。所以,如果你现在添加了一个智能属性,你不需要处理和重新编译所有只处理强度的东西。 至于直接访问字段,这是个坏主意。当您访问vb中的字段(至少在旧vbs中)时,通常调用属性getter和setter,而vb只是为您隐藏()调用。我的观点是你必须适应你所使用语言的惯例。在C、C++、Java等中,你有字段,并且有方法。调用一个方法应该始终具有(),以明确它是一个调用,并且可能会发生其他事情(例如,您可能会得到一个异常)。无论哪种方式,Java的好处之一就是其更精确的语法和风格。 VB到JAVA或C++就像是发短信给研究生院的科学写作。 顺便说一句:一些可用性研究表明,最好不要给构造函数设置参数,如果需要的话,最好构造并调用所有的setter。 |
![]() |
2
18
听起来你在考虑
|
![]() |
3
4
Steve Yegge有一篇非常有趣(如果很长)的博客文章,涵盖了这些问题: The Universal Design Pattern . |
![]() |
4
2
在我看来,“这个角色”很可能有一个处理幕后情报的“情报”对象,但我怀疑这是否应该公开。您应该只公开thischaracter.applyint和thischaracter.getint,而不是处理它的对象。不要这样暴露您的实现。 |
![]() |
5
2
保持你的领域隐私!您永远不想公开太多的API。在将来的发行版中,您可以始终将私有的内容公开,但不能反过来公开。 想一想,就好像你要进入下一个MMORPG。你会有很大的空间去发现错误,错误和不必要的邪恶。确保不可变属性为最终属性。 想想一个DVD播放器,它的迷你界面(播放,停止,菜单),但里面的技术性。你会想隐藏程序中所有不重要的东西。 |
![]() |
6
1
听起来你的主要抱怨不是太多关于setter/getter方法的抽象,而是关于使用它们的语言语法。例如,您更喜欢C样式的属性。 如果是这种情况,那么Java语言就没有多少可以提供给你了。直接字段访问是可以的,直到您需要切换到getter或setter,然后您将有一些重构(如果控制整个代码库,可能是可以的)。 当然,如果Java平台是一个需求,但语言不是,那么还有其他的选择。例如,scala有一个非常好的属性语法,以及许多其他对此类项目有用的特性。最重要的是,它运行在JVM上,所以您仍然可以通过Java语言编写相同的可移植性。:) |
![]() |
7
1
这里显示的是复合模型的单层。 您可能希望添加方法,将抽象添加到模型中,而不仅仅将其作为一组较低级别的模型。
这些字段应该是最终字段,因此即使您公开了它们,也不能意外地分配
“get”前缀适用于所有getter,因此它可能更多是初始外观,而不是新问题。 |
![]() |
8
1
在我看来,封装与围绕私有字段包装getter/setter无关。在小剂量的情况下,或者在编写通用库时,这种权衡是可以接受的。但如果在你描述的系统中不加检查,它将是一个 antipattern . getter/setter的问题在于,它们在对象与这些方法和系统其余部分之间创建了过度紧密的耦合。 真正封装的一个优点是它减少了对getter和setter的需求,从而将对象与流程中的其他系统分离开来。 为什么不给游戏角色一个更好地反映其在游戏系统中角色的界面,而不是用setintelligence公开游戏角色的实现? 例如,而不是:
为什么不试试这个?:
甚至更好:
换句话说,游戏角色可以抓取游戏对象。每个游戏角色抓取同一个游戏对象的效果可能(并且应该)不同,但细节完全封装在每个游戏角色实现中。 注意游戏角色现在如何处理自己的智能更新(范围检查等),例如,当它抓取游戏对象时,可能会发生这种情况。设定者(以及你注意到的复杂情况)已经消失了。根据具体情况,您可能可以完全免除getIntelligence方法。Allen Holub将这个想法 logical conclusion 但这种方法似乎并不常见。 |
![]() |
9
0
除了URI的答案(我完全支持这个答案),我建议您考虑在数据中定义属性映射。这将使您的程序非常灵活,并且会产生许多您甚至没有意识到不需要的代码。 例如,属性可以知道它在屏幕上绑定到什么字段,它在数据库中绑定到什么字段,当属性更改时要执行的操作列表(重新计算命中百分比可能同时应用于强度和dex…) 这样做,您就没有每个属性的代码来将类写到数据库或显示在屏幕上。您只需迭代属性并使用存储在其中的信息。 同样的事情也适用于技能——事实上,属性和技能可能来自同一个基类。 沿着这条路走下去之后,您可能会发现自己有一个相当严肃的文本文件来定义属性和技能,但是添加一个新的技能将非常容易:
在某种程度上,添加这样的技能将不需要任何代码更改,它可以很容易地在数据中完成,并且所有数据都存储在附加到类的单个skill对象中。当然,您可以用相同的方式定义操作:
尽管这个例子相当高级,但是您应该能够可视化地看到在完全没有代码的情况下如何完成它。想象一下,如果您的“属性/技能”实际上是成员变量,那么在没有代码的情况下做类似的事情是多么困难。 |
![]() |
overexchange · 客户端锁定是否违反了同步策略的封装? 7 年前 |
|
mangochaser · java——具有多态性和封装的几何形状 7 年前 |
![]() |
LBaelish · 安全/正确使用指针[关闭] 9 年前 |
![]() |
Petr Marek · Javascript类封装行为 9 年前 |