c# - 在 Main() 中保持模块化?

标签 c# oop module program-structure

我正在编写简单的纸牌游戏“ war ”作为家庭作业,现在游戏可以运行了,我正在努力使其更加模块化和井井有条。下面是 Main() 的一部分,其中包含大部分程序。我应该提一下,该类(class)是用 C# 教授的,但它不是 C# 类(class)。相反,我们正在学习基本逻辑和 OOP 概念,因此我可能没有利用某些 C# 功能。

bool sameCard = true;

while (sameCard)
{
    sameCard = false;
    card1.setVal(random.Next(1,14));        // set card value
    val1 = determineFace(card1.getVal());   // assign 'face' cards accordingly
    suit = suitArr[random.Next(0,4)];       // choose suit string from array
    card1.setSuit(suit);                    // set card suit
    card2.setVal(random.Next(1,14));        // rinse, repeat for card2...
    val2 = determineFace(card2.getVal());    
    suit = suitArr[random.Next(0,4)];        
    card2.setSuit(suit);  

    // check if same card is drawn twice:

    catchDuplicate(ref card1, ref card2, ref sameCard); 
}
Console.WriteLine ("Player: {0} of {1}", val1, card1.getSuit());
Console.WriteLine ("Computer: {0} of {1}", val2, card2.getSuit());

// compare card values, display winner:

determineWinner(card1, card2);   

所以这是我的问题:

  • 我可以在 Main() 中使用循环并仍然认为它是模块化的吗?
  • 抽卡过程是否写得好/包含得当?
  • 在方法中打印消息是否被认为是不好的做法(即:determineWinner())?

我只学了两个学期的编程,我想在这个阶段养成良好的习惯。任何输入/建议将不胜感激。

编辑:

catchDuplicate() 现在是一个 bool 方法,调用如下所示:

sameCard = catchDuplicate(card1, card2);

感谢@Douglas。

最佳答案

Can I use loops in Main() and still consider it modular?

是的,你可以。然而,OOP 程序中的 Main 通常只包含少数启动核心功能的方法调用,然后存储在其他类中。

Is the card-drawing process written well/contained properly?

部分。如果我正确理解您的代码(您只显示 Main),您将执行一些操作,如果以错误的顺序或错误的值执行这些操作,可能不会有好的结果。这样想:如果您出售您的类库(不是整个产品,而只是您的类),对于外行用户来说,使用您的类库的最明确方式是什么?

即,考虑包含一副纸牌的类 Deck。在创建时,它会创建所有卡片并洗牌。给它一个方法 Shuffle 来在你的类的用户需要洗牌时洗牌,并添加像 DrawCard 这样的方法来处理发牌。

此外:您拥有不包含在它们自己的类中但具有在类中更好的功能的方法。即,determineFace 更适合作为类 Card 的方法(假设 card2Card 类型)。

Is it considered bad practice to print messages in a method (i.e.: determineWinner())?

是也不是。如果您只想在测试期间显示消息,请使用 Debug.WriteLine。在生产构建中,这些将是空操作。但是,当您在生产版本中编写消息时,请确保从方法名称中清楚这一点。即,WriteWinnerToConsole 或其他内容。

更常见的是这样做是因为:您将以什么格式打印信息?它应该附带什么文字?你如何处理本地化?但是,当您编写程序时,显然它必须包含将内容写入屏幕(或表单或网页)的方法。为此目的,这些通常包含在特定的类中。例如,这可能是 CardGameX 类。

总体思路
想想“一个方法/函数应该只有一个任务,只有一个任务,它不应该有副作用(比如计算平方打印,那么打印就是副作用)”的原则。

类的原则是非常高层次的:一个类包含逻辑上属于一起并在同一组属性/字段上运行的方法。相反的例子:Shuffle 不应该是 Card 类中的方法。但是,它在逻辑上属于 Deck 类。

关于c# - 在 Main() 中保持模块化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10057958/

相关文章:

c# - 为什么大多数人说数据服务和数据库是系统中最重要的部分?

c# - string.Length 与 string.ToCharArray().Length

javascript - 使用 Array.map (TypeScript) 返回通用数组

ruby - 在 Ruby 中使用匿名模块

javascript - 如何在 RT 上添加插件和使用一些外部模块/文件

c# - c# 中的 autokey vigenere 解密

c# - C# 中派生类的动态调度

oop - UML 箭头的解释

抽象方法中的PHP类型提示接口(interface)和方法实现中的类型提示接口(interface)的子类

Python 将模块名称视为 'NoneType'