是使用私有方法还是公共方法
本文关键字:方法 有方法 | 更新日期: 2023-09-27 18:28:17
随着我继续在C#中进一步增强我的hangman游戏,以帮助我学习语言并像程序员一样思考,我认为其中有一些方法应该在单独的类中。现在,所有的代码都在Form类(Windows窗体)上。这使得调用所需的方法非常容易,因为我只需要使用方法名称和必要的参数。而且,因为这只是一个简单的刽子手游戏,这可能是最好的方法。我不知道。
具体来说,我使用的一个方法读取了一个包含数千个单词的.txt文件,将其拆分为一个数组,对数组进行混洗,然后调用另一个方法来做其他事情。
当我阅读一些关于C#的文献时,我被告知你想尽可能多地隐藏你的课堂。这样就不能通过传递类无法处理的数据来破坏类。但这似乎意味着,除了必须创建该类的对象之外,我还必须向该类添加一个属性才能访问它,以便能够使用我想要的方法。这似乎是一种拜占庭式的方法,可以访问这种方法。
正如经验丰富的程序员所看到的,我还没有像程序员那样思考。我的重点是尽早养成正确的习惯,而不是以后再改掉坏习惯。
所以问题基本上是,在这样一个简单的程序中,这个方法应该设置为私有吗?最佳做法是什么?
有问题的代码如下(读取文件、形成数组、shuffles等的方法):
private void ReadFile(StringBuilder hintlength, string[] wordlist, string lettercountpath)
{
string fileContent = File.ReadAllText(lettercountpath); //Read file
string[] array = fileContent.Split((string[]null, StringSplitOptions.RemoveEmptyEntries); //Form array
Random rand = new Random();
for (int i = 0; i < array.Length; i++) // Shuffle algorithm
{
int randIndex = rand.Next(i, array.Lenth);
string temp = array[randIndex];
array[randIndex] = array[i];
array[i] = temp;
}
for (int i = 0; i < 10; i++0) //Assigns shuffled array into wordlist array
wordlist[] = array[i];
if (j > 9) //Checks counter to see how many times it's been clicked
j =0;
Start.Enabled = false;
NewWord.Enabled = false;
WordSelection(hint length, wordlist); // Calls WordSelection method
radioButton1.Enabled = false;
radioButton2.Enabled = false;
radiobutton3.Enabled = false;
if (remainderWords == 1) // Checks remaining words counter
remainderWords = 10;
}
您应该根据类成员在设计中的位置来设置类成员的可见性,而不是根据类的大小或任何其他考虑因素。
- 如果一个方法或字段表示或执行的某些内容与类的工作方式有关,但与类的用户查看其工作的方式无关,则将该成员标记为私有成员。这方面的奇特名称是"实现细节":您不希望为了确保以后可以更改它们而公开它们
- 如果一个方法或字段对类为用户所做的事情至关重要,那么就将该成员公开:否则,没有人能够使用该成员,从而使整个类变得无用
- 如果您的类是为继承而设计的,并且某个方法或字段是为该类及其子类的独占使用而准备的,请使该方法受到保护
- 如果某个方法或字段是需要由同一程序集中的其他类可见的实现详细信息,则将成员设为
internal
。可以混合使用internal
和protected
,从而进一步限制对同一程序集中派生类的访问
在设计软件时,你应该在脑海中开始进行这种分类。当设计较小的系统时,进行这种分类要容易得多。然而,随着系统规模的增加,正确操作的重要性也会大大增加。
每个职责都有一个类的概念。对于您的Hangman程序,您需要一个随机单词,您正在从文件中读取。现在是构建一个新类的好时机:一个读取单词文件并给你一个随机单词的类。
你要保密的部分是单词的实际集合。主游戏了解整个系列没有任何好处,它只需要一个随机的单词。因此,你可以构建这样的东西:
public class HangmanWordProvider
{
private string[] _words;
public HangmanWordProvider(string inputfile) {
// code to read file into _words variable here
}
public string GetRandomWord()
{
// code to return a random word from the collection
}
}
然后,您将创建一个单词提供者的新实例,以便在游戏中使用。您的主HangmanGame
现在不再需要费力地读取单词文件或从集合中获取随机单词。你只要打电话给wordprovider.GetRandomWord()
,就知道你得到了所需的数据。这是关注的分离。
现在想象一下你的游戏在增长,你想确保提供者不会连续两次返回同一个单词。这将是您在WordProvider
中构建的东西,而不必接触游戏类本身。
你可以更进一步,在某个时候使用数据库或Web服务来提供单词。。。你仍然只需要改变WordProvider
,而不是你的游戏。
类中的private
部分是关于隐藏其他类不需要知道的部分的实现。在你的情况下,游戏不需要知道单词列表是如何存储的,从哪里加载,或者你用什么方法来获得随机结果。它只需要知道如何获得一个随机单词。