2017-02-21 50 views
2

我是一名一年级的计算机科学学生,试图解决一个大的应用程序。 我希望开发一款名为“权力的游戏”第二版的生活牌游戏,希望在此期间我将学习更多关于Java和最佳编程实践的知识。x是否使用filepath字符串将参数初始化为参数错误的编码练习?

我一直在努力的一件事是初始化卡片。我目前有一个包含卡片ArrayList的Deck类,并且在将Deck初始化为对象时,它将文件路径作为参数,例如然后

Deck deck = new Deck("C:/users/.../deck1.txt"); 

这将deck1.txt内变换的卡信息到卡对象,然后将其存储到甲板对象内的卡的ArrayList。

Card类以类似的方式工作,将文件路径String作为参数,例如

Card card1 = new Card("C:/users/.../Robb Stark(Core Set).txt"); 

为了加载唯一卡所需的信息。

这是一个愚蠢的方式来初始化卡对象?或者任何对象的事情?我不确定我会如何做到这一点。

+0

从性能的角度来看,我没有看到任何错误,尽管您可能想使用变量(可能是常量)作为构造函数的参数,而不是硬编码值。 –

+0

考虑使用属性文件来存储文件名/路径 –

+0

@TimBiegeleisen,你的意思是有变量,如卡成本,卡强度等成为卡构造函数的参数?如果是这样,我怎么能加载文件中的变量数据?我计划拥有一个包含所有包含这些变量信息的字符的文件夹。我已经有一些了,这就是我如何分配这些变量 – DivinePickle

回答

2

Single Responsibility Principle(SRP)是一个指导原则,指出一个类通常应该把重点放在做一件事,并建议分类类/模块之间的责任。甲板/卡片构造函数可能不应该从文件系统读取文件并从那里解析文件。

将信息从其他地方的文件中取出然后传递到Deck/Card构造函数可能会更好。这是我个人可能使用Factory来构建对象的地方。你可以通过一个文件对象,它知道如何从那里构造卡/甲板工厂方法:

class DeckFactory { 

    public static Deck createDeckFromFile(File deckFile) { 
     String fileString = readFileToString(deckFile); // not-shown helper method 

     // depending on how information is stored in string, get fields from string, i.e.: 
     String[] fields = fileString.split(":"); // if fields were delimited by : 
     String deckName = fields[0]; 
     // and other etc. fields... 

     // then construct your deck 
     return new Deck(deckName, deckSize, deckType); // and other properties... 
    } 
} 

这可能会从其他代码调用,如:

String deckFilepath = "C:\Users\...\decks\deck1.txt"; 
Deck myDeck = DeckFactory.createDeckFromFile(new File(deckFilePath)); 

的DeckFactory也可以有另一种方法可以通过传入字符串本身,或者从不同类型的对象或真正的任何东西来创建一个Deck。工厂有责任知道如何创建对象。使用CardFactory的Card可以做同样的事情。

此外,正如其他评论/答案所述,最好从属性/配置文件中读取卡片/卡片的文件路径字符串。这将防止在代码本身中对字符串进行硬编码。

+0

这是否使用工厂设计方法?听起来非常相似,我正在考虑使用它,因为我相信Ill最终会为卡片提供Character,Location,Event,Attatchment和Plot等几个子类 - 所有这些子类都有不同的属性和角色,但都被视为卡片。你能否提供一些关于属性和配置文件的可靠信息的链接?到目前为止,我从来没有听说过他们。感谢您提供任何其他信息,我会将其标记为解决主要问题的答案。 – DivinePickle

+0

可以肯定的是,一个小小的搜索引擎提供了:关于属性的Oracle文档 - https://docs.oracle.com/javase/tutorial/essential/environment/properties.html和Mkyong https://www.mkyong的实际解释.com/java/java-properties-file-examples/ –

+0

对于“工厂设计方法”问题,这在技术上是不同的模式 - 我刚才提到的实际上只是“工厂”模式。但是你也可以使用“Factory Method”模式 - 在上面的例子中,如果我们使用了CardFactory,而不是在最后调用返回新卡片(args),则可以调用一个静态方法,比如返回Card.createCard(args )代替。但是,createCard将根据给出的参数返回Card的子类(如CharacterCard,LocationCard等)而不是Card本身。有关示例,请参阅https://sourcemaking.com/design_patterns/factory_method。 –

-1

假设您的卡片是固定的,您可以将卡片与您的应用程序捆绑在一起。在资源文件夹中说。 然后创建一个指向此目录并加载所有卡的属性文件。 或者在属性文件中列出了所有卡片。

甲板似乎是用户特定的,所以它们可以在用户家中的特定位置或用户可指向的某个位置。

+0

这会比试图从txt文件加载数据更有效吗?我基本上以特定的方式编写了代表卡片的txt文件,例如 名称:Robb Stark。 费用:6. 我使用.split()将值分配给Card类中的所需变量。 – DivinePickle

+0

即使在这种方法中,卡片文件仍然存在。我想提出的是卡片可能是你作为游戏设计师创建的东西,所以你可以将它们与应用程序捆绑在一起。他们仍然是文件,文件的路径或文件列表可以在属性/配置文件中 –

+0

我想我最终会做到这一点。感谢您的建议! – DivinePickle