我是一个新的.NET/C#开发人员,自从我第一次编写代码以来,有一个问题困扰着我。如何改进这段代码?
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");
}
}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;
}
}interface IBankDetails
{
float Balance();
void CreateAccount(string name);
float Deposit();
float Withdraw();
}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;
}
}
}public class CalculateIBAN
{
static Random generator = new Random();
string accountNumber = generator.Next(100, 999).ToString();
public string IBAN()
{
return accountNumber;
}
}public class BankAccount
{
public string Name { get; set; }
public string IBAN { get; set; }
public float Sum { get; set; }
public delegate float Comision(float comission);
}这只是我的应用程序中的一个类,但它是当前行数最多的类。
发布于 2015-10-05 15:38:36
您的代码中有一些噪声:
string iban = Console.ReadLine();
return iban;和
float sum = float.Parse(Console.ReadLine());
return sum;变量被赋值立即返回,因此它实际上是无用的。
只需使用:
return Console.ReadLine();和
return float.Parse(Console.ReadLine());在另一段短文中也可以看到同样的情况:
BankAccount ba = _conturi.Find(c => c.IBAN == iban);
if (ba != null)
{
return ba;
}
else
{
return null;
}@Rotem建议如下:
BankAccount ba = _conturi.Find(c => c.IBAN == iban);
return ba;我们可以应用同样的半化:
return _conturi.Find(c => c.IBAN == iban);Deposit函数有3个职责,而一个好的函数应该只有一个:
你应该把它分成(至少)三个函数。
你应该用英语写你所有的代码。这是一项国际公约,使世界上的任何人都能平等地阅读代码。当然,您可以保留使用法语与用户交互的信息,但我建议您也用英语编写,以保持一致性。
发布于 2015-10-05 15:38:38
不要抓住NullReferenceException,这是一个programming exception,如果您的工作做得很好,就不应该在代码运行时出现这种情况。如果有什么东西抛出一个NullReferenceException,找出原因并修复它!
当操纵货币时,总是使用decimal,这是最好的数据类型。
ReturnedVal不是一个好的类名,什么/何时/为什么它返回什么?如果我正确理解,这个类将用于属于其他类的一些操作。通常,(这里有一个提示)如果你不能用一句话解释你的类作为一个整体做什么(属性/方法等),那么这个类的设计就不是很好。对这个类的解释是“返回一些东西的方法”。这3种方法属于其他地方!
你的课太依赖控制台了。你会想要应用分离关注点。类BankDetail's方法Withdraw应该接收一个参数(也就是取款的钱),Deposit应该接收一个参数(存款的钱,你可以得到它!)。这样,你的类就可以在其他任何地方成为可重复使用,而不依赖于控制台。(假设我想在我的Winforms应用程序中使用您的类,现在这是不可能的。)
关于命名,方法通常表示操作,这意味着Balance应该是GetBalance等等。
发布于 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;
https://codereview.stackexchange.com/questions/106631
复制相似问题