假设我的任务是编码某种角色扮演游戏.这意味着,例如,我想跟踪一个角色游戏字符和其统计信息,如智能,伤害奖金或命中点.

我感到非常害怕,在项目结束之前,我可能最终会处理非常多的领域 – 对于每个领域,我都必须确保它们遵循非常类似的约束和行为(例如,我希望他们在最小和最大值之间有界限;我想要能够区分“基本价值”和“临时奖金”;我想要能够增加和减少两者,而不需要通过一个设定者和吸烟者) .突然间,对于每个领域,我需要一个(两个)吸气剂和四个设置器,也可能需要几个重新设置!即使是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#和人,不是物质甜美.好吧.

[2]除了构造函数!一个吸气剂不会让我从一个错误的构造函数中解救出来.

解决方法

我的经验是,在需要大量领域的情况下,字段的数量,性质,命名和类型非常灵活,并且可能会在项目的整个生命周期内发生变化,因此您可能需要某种地图而不是字段.

例如,具有从键到值的属性映射.

提供公共电话来获取和设置属性,但不要让所有人使用它们(或确保它们不).相反,创建类来表示您感兴趣的每个属性,该类提供了用于操作该属性的所有功能.例如,如果你有强度,你可以有一个“StrengthManipulation”类被初始化为一个特定的Player对象,然后提供getter,setter(所有与适当的验证和例外),或许像计算强度与奖金等.

其中一个优点是您可以将您的属性与播放器类的使用分开.所以如果你现在添加一个Intelligence属性,你不需要处理和重新编译所有只有强度的操作.

对于直接访问字段,这是一个坏主意.当您访问VB中的一个字段(至少在旧的VB中)时,通常调用一个属性getter和setter,VB会为你隐藏()调用.我的观点是你必须适应你所使用的语言惯例.在C,C,Java等中,你有字段,你有方法.调用一个方法应该总是有()来清楚它是一个调用,其他的事情可能会发生(例如,你可能会得到一个例外).无论哪种方式,Java的一个好处就是它的语法和风格更加精确.

VB到Java或C就像Texting研究生科学写作.

BTW:一些可用性研究表明,如果需要它们,最好不要给构造函数添加参数,而是构造并调用所有的setter.

Java:如何处理一大堆字段及其封装干净?的更多相关文章

  1. Xcode C开发,需要澄清

    我非常喜欢Xcode提供对该语言可能的成员函数的深入了解的方式,并且更喜欢相对于文本伙伴使用它,如果不是因为我今天注意到的奇怪.当strings=“Teststring”时;唯一可用的substr签名如图所示但据我所知,签名应该是什么iseeonline确实s.substr(1,2);既被理解也适用于Xcode.当我尝试方法完成时为什么不显示?

  2. xamarin.ios – 没有找到ViewController ::.ctor(System.IntPtr)的构造函数

    我有一个问题,我的Monotouch应用程序有时在收到内存警告后才会崩溃.请参见下面的堆栈跟踪.堆栈跟踪是正确的,因为指定的类缺少构造函数获取IntPtr参数.但是这是有意的,因为我在应用程序中根本不使用InterfaceBuilder.那为什么会这样呢?

  3. ios – Swift – NSURL错误

    尝试使用下面的NSURL类时出错,下面的代码实际上是试图将我从Facebook拉入的图像存储到imageView中.错误如下:不知道为什么会这样,帮忙!解决方法你正在调用的NSURL构造函数有这个签名:?表示构造函数可能不返回值,因此它被视为可选.NSData构造函数也是如此:快速解决方法是:最好的解决方案是检查(解包)这些选项,即使您确定它们包含值!

  4. 如何在Xcode中追踪“libc abi.dylib:纯虚函数!”

    我有一个多线程OSX应用程序,它使用C,Objective-C和Swift的混合.当我的应用程序关闭时,我在Xcode调试器窗口中看到了这一点:我知道这个错误通常是由对C类构造函数或析构函数中的虚函数的调用引起的.有没有一种简单的方法可以找到它的位置?

  5. Swift实现对象归档

    Swift实现对象归档时有几个注意点要继承NSCoding,实现两个方法extension是一个分类,分类不允许有存储能力,所以协议方法不能写在分类中协议中的init(coderdecoder:NSCoder)函数会覆盖原始的构造函数,所以类中至少还要有另一个init方法如果不指定键名,会使用属性名称作为key,基本数据类型,需要指定key

  6. 【Swift初见】Swift构造过程

    构造过程是通过构造器来实现的,其实每个构造器就可以看作是一个函数,只是这个函数是为了执行初始化的。每个类都必须拥有一个指定构造器。

  7. swift的struct结构体类型介绍使用

  8. swift struct

    //:Playground-noun:aplacewherepeoplecanplayimportCocoavarstr="Hello,playground"structpoint{varx=0;vary=init(x:Int,y:Int){self.x=x;y=y;println("init");}funcgetCenter()->Int{return(x+y)/2;}mutatingfunca

  9. 《The Swift Programming Language》2.0版之自动引用计数

    Swift1.0文档翻译:TimothyYeSwift1.0文档校对:HawsteinSwift2.0文档校对及翻译润色:ChannePS:之前1.0版中文版看不懂地方在对比英文版后就懂了,还是之前翻译的不够准确啊。,而不是Person),它们的值会被自动初始化为nil,目前还不会引用到Person类的实例。由于Person类的新实例被赋值给了reference1变量,所以reference1到Person类的新实例之间建立了一个强引用。在你将john和number73赋值为nil后,强引用关系如下图:P

  10. swift #6 类

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部