// OOP =面向对象的编程
我过去曾经玩过Java,最近我一直深入研究和自学OOP。我目前正在创建一个基于文本的游戏,当我创建执行任务的方法时,我注意到如果我想我可以将方法转换为对象。
我不太了解运行时或节省资源,所以我不能考虑这些变量,但为了我的代码,它似乎可以在这里和那里清理一些空间。然而,另一方面,我将创建许多类,我觉得可能会混乱我的目录。
~~ 例如,我创建了一个单独的类来为播放器创建配置文件。其中,它有3个重要方法。一个用于处理玩家的名字选择,一个用于处理玩家的班级选择,一个用于最终确定玩家的决定。
我可以为这些方法创建3个对象,并通过这个类调用它们,这可能会清除代码中的空间,或者我可以留下它们。
创建单独的对象或者留下它们会更明智吗?
答案 0 :(得分:1)
最好的方法是使代码最容易维护,理解和扩展。你描述的三种方法可能已经在正确的位置,但它取决于类本身应该代表什么。
您将其描述为播放器的配置文件,并且您描述的三种方法都操纵该配置文件独有的数据,因此到目前为止您的方法听起来不错。
最重要的是:保持编码。不要挂在这样的细节上。它们通常与教科书或课堂演示中的重要性一样重要,而且它们与那些偏爱一种方法而不是所有其他方式的狂热者一样重要并不会让你相信。代码可以(几乎)总是被重构,并且(通常)从来没有完全纠正过第一次。
如果有人告诉你他们的方式是最好的方式"或者正确的方式"当涉及到这样的问题时,忽略它们并寻求别人的建议。
答案 1 :(得分:0)
如果你不必创建很多对象实例,或者你可以很好地处理它,那么它不一定会改变你的代码风格,除非你必须在小组中工作并达成协议。
另外,我想你最好通过这个link来澄清什么是“类”和“对象”。基本上,一个对象是从一个类创建的,包含状态和方法。
在你的例子中,我看到了类而不是对象的控制器视图,你听说过MVC吗?如果不这样做,请检查link,因为它可以帮助您澄清比您对“课程”和“模型”更多的想法
我希望我没有让你想到更糟,但重要的是要知道发生了什么。
答案 2 :(得分:0)
记住KISS("保持简单,愚蠢")。你不需要不断地将所有内容提取到接口,超类,多种方法等中。重构很有好处,但是当你的代码做了一些简单的事情时,它也应该看起来很简单。
答案 3 :(得分:0)
通过阅读您的问题和其他答案,我建议使用单个配置文件类,它将处理与配置文件相关的所有内容。虽然更多信息可以提供帮助,但请随时发布您的代码。
小心选择单词,可能会让人感到困惑。当我说Profile类时,我指的是一个包含Profile类的Profile.java文件,以及相关的方法和变量。
您假设的Profile.java类将包含相关变量,例如配置文件名称,类,可能是一个布尔值,表示决定已经完成。或者你可以让构造函数在提示用户之后在开始时获取所有数据一次?
此外,您可以拥有所有这些方法(例如处理名称选择,类选择,getter和setter),您当前已将这些方法分成3个不同的文件。这有望帮助简化事情,因此您可以将所有内容放在一处。
答案 4 :(得分:0)
答案取决于它。
在OOP中,类(实例化时是对象)用于促进封装和抽象。有关详细信息,请参阅此SO post。
抽象是对象共享共同特征的想法,这些特征通过类层次结构(IS-A
b关系)和类组成(HAS-A
b关系)来证明。< / p>
封装是指共同状态及其交互应被视为具有明确定义的输入和输出的单个单元(或类),其中内部隐藏在表示它的类中。< / p>
在一天结束时,OOP旨在让程序员更容易编码。这意味着尝试确定程序内的交互,以及明显更清晰,更易于理解的代码,这意味着更少的心理开销。
案例研究
在您的情况下,您有一个处理播放器配置文件创建的类,我们称之为PlayerProfileManager
。根据封装,与创建播放器配置文件直接相关的所有行为(即方法)应该在PlayerProfileManager
中。
看抽象是事情变得有趣的地方。
PlayerProfileManager
创建玩家个人资料并在某处存储该信息。创建一个包含玩家个人资料所有数据的PlayerProfile
类,然后让PlayerProfileManager
在内部存储PlayerProfile
个对象的集合可能是有意义的。称他们为其管理的档案。
PlayerProfileManager HAS-A PlayerProfile
您与经理进行互动,以完成所有获取和设置个人资料数据,并且经理将该数据存储在个人资料对象中。
但你有其他类型的个人资料吗?
如果是这样,您可能需要一个Profile
类,其中包含任何配置文件所需的所有配置文件信息。然后PlayerProfile
继承自Profile
,添加所有播放器特定数据。
PlayerProfile IS-A 个人资料
然后您可能需要一个ProfileManager
类,它具有管理通用配置文件数据的通用方法。
PlayerProfileManager IS-A ProfileManager
现在我们可以利用polymorphism,这是OOP中的关键技术。
如果您想对所有配置文件数据执行某些操作,则可以非常好地使用多态,因为它都继承自Profile
类。阅读链接了解更多详情。
但请记住,抽象只有在使代码更易于使用时才有意义。如果你只有一种类型的配置文件(并且只计划有一种类型),添加额外的层是没有意义的,因为它们会使代码混乱,而不是减少它。
<强>结论
没有正确的答案,只要代码是干净的,并且属于一起的东西在一起(与separation of concerns相关)。
我鼓励您使用不同级别的抽象来找出太多或太少的优点和缺陷。