如何制作我的 Arithmetic Class 模块化 c# CLI 程序

How to make my Arithmetic Class Modular c# CLI Program

背景:

大家好,我现在正在学习软件设计课程,对此我很困惑。

我决定编写一个程序,以便复习 class:class 交互的基础知识,我现在有两个 classes,一个 Arithmetic Class,其中包含一些非常multiply()addition()等简单方法

和我的主 class,它包含一个通过 case 语句的 CLI 菜单。

我想做的是使我的算术 class 模块化。

我的 ResultGen()randomNumberGen() 方法包含 Console.WriteLine,如果可能的话,我不希望这个 Arithmetic class 必须依赖于控制台 Class 存在(因为我想很快将此算术 class 与 GUI WPF 程序一起使用)

我的问题是,

如何将 monthyear 变量从我的 randomNumberGen() 方法转移到我的主要 Program() class 以便我可以格式化它们在那里,我如何将 ResultGen() 中的 result 变量也带过来?

我最好使用参数或 getter 和 setter 来解决这个问题,而不是 returns。

    public int ResultGen()
    {
        Console.WriteLine("Result is equal to: " + result + ".");
        return result;
    }

    public void randomNumberGen()
    {
        Random rnd = new Random();
        month = rnd.Next(1, 11); // creates a number between 1 and 12
        year = rnd.Next(1, 21); // creates a number between 1 and 51
        Console.WriteLine("Month: " + month);
        Console.WriteLine("Year:  " + year);
    }

这是我的主程序:

class Program
{
    static void Main(string[] args)
    {
        ProgramMenu();
    }

    static void ProgramMenu()
    {
        ConsoleKeyInfo cki;
        Arithmetic math = new Arithmetic();
        math.randomNumberGen();
        Console.WriteLine("Press '1' for addition or '2' for multiplication, press '3 'to generate results");
        do
        {
            cki = Console.ReadKey(false); // show the key as you read it
            switch (cki.KeyChar.ToString())
            {
                case "1":
                {
                    math.addition();
                    math.ResultGen();
                    break;
                }
                case "2":
                {
                    math.multipy();
                    math.ResultGen(); 
                    break;
                }
                case "3":
                {
                    math.randomNumberGen();
                    break;
                }
            }
        } while (cki.Key != ConsoleKey.Escape);
    }
}

感谢你们提供的任何帮助,但请记住,我是一名新手程序员,只是想了解基本实践。

如果我尝试这样做,我可能会使用 toString() 方法,但我已经尝试过但失败了。

使用元组

对于第一种方法,只需删除 Console.WriteLine 调用并在处理输出的应用程序中执行。

对于第二个你需要return两个变量在这种情况下会建议returning一个元组。

将您的 randomNumberGen 的 return 类型更改为 Tuple<int,int> 双元组的类型,两个成员的类型都是整数,因此您的方法签名应该是

public Tuple<int,int> randomNumberGen() 

您应该从两个变量(月和年)创建元组,同样有几种方法可以做到这一点,最简单的方法是使用开始 Tuple.Create

因此您的 return 语句应该如下所示 return Tuple.Create(month,year)

在调用方端删除变量,您可以首先调用 Item1 属性,然后调用 Item2 属性。

您的方法应该如下所示

public Tuple<int,int> RandomNumberGen()
{

    Random rnd = new Random();
    int month = rnd.Next(1, 11); // creates a number between 1 and 12
    int year = rnd.Next(1, 21); // creates a number between 1 and 51

    return Tuple.Create(month,year);

}

在你的主

    var result = math.randomNumberGen();
    var month = result.Item1;
    var year = result.Item2;

现在您可以随心所欲地处理月份和年份。

设计笔记

知道这不是您问题的一部分,但仅供参考,通常用于命名 public C# 中面向成员的惯例是大驼峰式,本地人是小驼峰式

属性(在这种情况下没有意义)

您可以在该属性可见的任何上下文中设置属性 setter,即 属性,在这种情况下 这样做毫无意义:

在你的 class

public int Month{ get; private set;} 
public int Year { get; private set; }

public void RandomNumberGen()
{
    Random rnd = new Random();
    Month = rnd.Next(1, 11); // creates a number between 1 and 12
    Year = rnd.Next(1, 21); // creates a number between 1 and 51

}

而在你的主要

var custGenVarName = new Arithmetic();
custGenVarName.RandomNumberGen();
int month = custGenVarName.Month;
int year = custGenVarName.Year;

在这种情况下没有意义,因为计算结果不应该存在于要进行计算的对象中,应该进行计算并return给调用者