首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >银行账户的操作

银行账户的操作
EN

Code Review用户
提问于 2015-10-05 15:15:38
回答 3查看 24.3K关注 0票数 19

我是一个新的.NET/C#开发人员,自从我第一次编写代码以来,有一个问题困扰着我。如何改进这段代码?

Program.cs:

代码语言:javascript
复制
class Program
    {
        static void Main(string[] args)
        {
            App();
        }

        public static void App()
        {
            BankDetails bankdet = new BankDetails();

            ShowMenu();

            while (true)
            {
                Console.WriteLine("");

                string userInput = Console.ReadLine();
                switch (userInput)
                {
                    case "a":
                        Console.WriteLine("'Citire din fisier' selected");
                        break;
                    case "b":
                        Console.WriteLine("'Creare cont' selected");
                        Console.WriteLine("");
                        bankdet.CreateAccount("Name 1");
                        bankdet.CreateAccount("Name 2");
                        bankdet.CreateAccount("");
                        bankdet.CreateAccount("Name 4");
                        bankdet.CreateAccount("Name 5");
                        break;
                    case "c":
                        Console.WriteLine("'Depunere bancara' selected");
                        bankdet.Deposit();
                        break;
                    case "d":
                        Console.WriteLine("'Retragere bancara' selected");
                        bankdet.Withdraw();
                        break;
                    case "e":
                        Console.WriteLine("'Afisare sold' selected");
                        bankdet.Balance();
                        break;
                    case "f":
                        Environment.Exit(0);
                        break;
                    default:
                        Console.WriteLine("Please select a valid option");
                        break;
                }
            }
        }

        public static void ShowMenu()
        {
            Console.WriteLine("a. Citire din fisier");
            Console.WriteLine("b. Creare cont");
            Console.WriteLine("c. Depunere bancara");
            Console.WriteLine("d. Retragere bancara");
            Console.WriteLine("e. Afisare sold");
            Console.WriteLine("f. Iesire");
        }

    }

BankDetails.cs:

代码语言:javascript
复制
class BankDetails : IBankDetails
{
    ReturnedVal rv = new ReturnedVal();
    List<BankAccount> _accounts;

    public BankDetails()
    {
        _accounts = new List<BankAccount>();
    }

    public List<BankAccount> Account
    {
        get { return _accounts; }
    }


    public void CreateAccount(string name)
    {
        BankAccount account = new BankAccount();
        CalculateIBAN calculateIban = new CalculateIBAN();

        try
        {
            if (!String.IsNullOrEmpty(name))
            {
                account.Name = name;
                account.IBAN = calculateIban.IBAN();
                _accounts.Add(account);
                Console.WriteLine("Account created - Name: {0}, IBAN: {1}", account.Name, account.IBAN);
            }
            else
            {
                Console.WriteLine("Account name is null or empty.");
            }
        }
        catch (NullReferenceException ne)
        {
            Console.WriteLine(ne.StackTrace);
        }
    }

    public float Deposit()
    {
        string iban = rv.EnterIban();
        BankAccount account = rv.GetAccountByName(iban, _accounts);

        while (account == null)
        {
            Console.WriteLine("Account doesn't exist");
            iban = rv.EnterIban();
            account = rv.GetAccountByName(iban, _accounts);
        }

        float sum = rv.AmountToDeposit();
        while (sum <= 0)
        {
            Console.WriteLine("Amount cannot be less or equal than 0.");
            sum = 0;
            sum = rv.AmountToDeposit();
        }

        account.Sum += sum;
        Console.WriteLine("Added {0} to account {1}", sum, iban);

        return account.Sum;
    }

    public float Withdraw()
    {
        BankDetails details = new BankDetails();
        BankAccount.Comision c = Comission.Comision;

        string iban = rv.EnterIban();
        BankAccount account = rv.GetAccountByName(iban, _accounts);

        while (account == null)
        {
            Console.WriteLine("Account doesn't exist");
            iban = rv.EnterIban();
            account = rv.GetAccountByName(iban, _accounts);
        }

        float sum = rv.AmountToDeposit();
        while (sum <= 0)
        {
            Console.WriteLine("Amount cannot be less or equal than 0.");
            sum = 0;
            sum = rv.AmountToDeposit();
        }

        account.Sum -= sum;

        Console.Write("Withdrawn {0} from account {1}.", sum, iban);
        Console.WriteLine("Comision {0}", Math.Round(c(account.Sum), 2));
        account.Sum -= c(account.Sum);
        Console.WriteLine("Remaining: {0}", Math.Round(account.Sum, 2));

        return account.Sum;
    }

    public float Balance()
    {
        string iban = rv.EnterIban();
        BankAccount account = rv.GetAccountByName(iban, _accounts);

        Console.WriteLine("IBAN: {0} has {1} left", iban, account.Sum);

        return account.Sum;
    }
}

IBankDetails.cs:

代码语言:javascript
复制
interface IBankDetails
    {
        float Balance();
        void CreateAccount(string name);
        float Deposit();
        float Withdraw();
    }

ReturnedVal.cs:

代码语言:javascript
复制
class ReturnedVal
    {
        internal string EnterIban()
        {
            Console.WriteLine("IBAN:");
            string iban = Console.ReadLine();

            return iban;
        }

        internal float AmountToDeposit()
        {
            Console.WriteLine("Type in the amount ");
            float sum = float.Parse(Console.ReadLine());

            return sum;
        }

        internal BankAccount GetAccountByName(string iban, List<BankAccount> _conturi)
        {
            BankAccount ba = _conturi.Find(c => c.IBAN == iban);

            if (ba != null)
            {
                return ba;
            }
            else
            {
                return null;
            }
        }
    }

CalculateIBAN.cs:

代码语言:javascript
复制
public class CalculateIBAN
    {
        static Random generator = new Random();
        string accountNumber = generator.Next(100, 999).ToString();

        public string IBAN()
        {
            return accountNumber;
        }
    }

BankAccount.cs:

代码语言:javascript
复制
public class BankAccount
    {
        public string Name { get; set; }
        public string IBAN { get; set; }
        public float Sum { get; set; }

        public delegate float Comision(float comission);

    }

这只是我的应用程序中的一个类,但它是当前行数最多的类。

EN

回答 3

Code Review用户

发布于 2015-10-05 15:38:36

您的代码中有一些噪声:

代码语言:javascript
复制
        string iban = Console.ReadLine();

        return iban;

代码语言:javascript
复制
        float sum = float.Parse(Console.ReadLine());

        return sum;

变量被赋值立即返回,因此它实际上是无用的。

只需使用:

代码语言:javascript
复制
return Console.ReadLine();

代码语言:javascript
复制
return float.Parse(Console.ReadLine());

在另一段短文中也可以看到同样的情况:

代码语言:javascript
复制
        BankAccount ba = _conturi.Find(c => c.IBAN == iban);

        if (ba != null)
        {
            return ba;
        }
        else
        {
            return null;
        }

@Rotem建议如下:

代码语言:javascript
复制
BankAccount ba = _conturi.Find(c => c.IBAN == iban);
return ba;

我们可以应用同样的半化:

代码语言:javascript
复制
return _conturi.Find(c => c.IBAN == iban);

Deposit函数有3个职责,而一个好的函数应该只有一个:

  1. 它改变了类的内部: account.Sum,+=和;
  2. 它与外界沟通:Console.WriteLine(“添加{0}到帐户{1}",sum,iban);
  3. 它返回一个值:返回account.Sum;

你应该把它分成(至少)三个函数。

你应该用英语写你所有的代码。这是一项国际公约,使世界上的任何人都能平等地阅读代码。当然,您可以保留使用法语与用户交互的信息,但我建议您也用英语编写,以保持一致性。

票数 10
EN

Code Review用户

发布于 2015-10-05 15:38:38

不要抓住NullReferenceException,这是一个programming exception,如果您的工作做得很好,就不应该在代码运行时出现这种情况。如果有什么东西抛出一个NullReferenceException,找出原因并修复它!

当操纵货币时,总是使用decimal,这是最好的数据类型

ReturnedVal不是一个好的类名,什么/何时/为什么它返回什么?如果我正确理解,这个类将用于属于其他类的一些操作。通常,(这里有一个提示)如果你不能用一句话解释你的类作为一个整体做什么(属性/方法等),那么这个类的设计就不是很好。对这个类的解释是“返回一些东西的方法”。这3种方法属于其他地方!

你的课太依赖控制台了。你会想要应用分离关注点。类BankDetail's方法Withdraw应该接收一个参数(也就是取款的钱),Deposit应该接收一个参数(存款的钱,你可以得到它!)。这样,你的类就可以在其他任何地方成为可重复使用,而不依赖于控制台。(假设我想在我的Winforms应用程序中使用您的类,现在这是不可能的。)

关于命名,方法通常表示操作,这意味着Balance应该是GetBalance等等。

票数 10
EN

Code Review用户

发布于 2015-10-05 16:06:15

  • 你不需要做Console.WriteLine("") - Console.WriteLine()就能做到这一点。
  • 你用float来赚钱让我不寒而栗。float的设计并不是为了真正严格的精确性而设计的,就像使用货币量时所需要的那样使用decimal代替。
  • 不要在处理方法中输出。Deposit()不应该输出--例如,如果帐户不存在,则抛出一个自定义异常。
  • CalculateIBAN不是一个好的类名。类就像对象--它们是某种东西。方法可以做一些事情,所以这将是一个比类更好的方法。
  • 把你的顾虑分开。Deposit()只应该关注存值,而不是检查是否存在帐户。我会把帐户和金额转到这个方法中。
  • 使用更好的名称:account.Sum -= c(account.Sum); - c没有说明它做什么。rv也不是最好的名字。
  • 如果输入无效字符串,float float.Parse(string)将引发异常。您可以通过使用bool float.TryParse(string, out float)来避免这种情况,这将只返回无效条目的false

如果(ba != null) {返回ba;} else {返回null;}

你可以把它组合成return ba;

票数 8
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/106631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档