Algoritmy a programování IV

Týden 2

Vytvořte si svoji aplikaci

Pomocí okna terminálu vytvořte adresář s názvem classes. V něm sestavíte aplikaci. Přejděte do daného adresáře a v okně konzoly zadejte dotnet new console . Tento příkaz vytvoří vaši aplikaci. Otevřete soubor Program.cs. Měl by vypadat takto:

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

V tomto kurzu vytvoříte nové typy, které představují bankovní účet. Vývojáři obvykle definují každou třídu v jiném textovém souboru. To usnadňuje správu s rostoucí velikostí programu. V adresáři Classes vytvořte nový soubor s názvem BankAccount.cs.

Tento soubor bude obsahovat definici bankovního účtu. Objektově orientované programování uspořádá kód tak, že vytváří typy ve formě tříd. Tyto třídy obsahují kód, který představuje konkrétní entitu. Třída BankAccount představuje bankovní účet. Kód implementuje specifické operace prostřednictvím metod a vlastností. V tomto kurzu bankovní účet podporuje toto chování:

  1. Má 10místné číslo, které jednoznačně identifikuje bankovní účet.
  2. Obsahuje řetězec, ve kterém jsou uložena jména nebo jména vlastníků.
  3. Zůstatek je možné načíst.
  4. Přijímá vklady.
  5. Akceptuje výběry.
  6. Počáteční zůstatek musí být kladný.
  7. Výběry nemohou vést k zápornému zůstatku.

Definování typu bankovního účtu

Můžete začít vytvořením základů třídy, která toto chování definuje. Vytvořte nový soubor pomocí příkazu Soubor:Nový . Pojmenujte ho BankAccount.cs. Do souboru BankAccount.cs přidejte následující kód:

C#
namespace Classes;public class BankAccount
{
    public string Number { get; }
    public string Owner { get; set; }
    public decimal Balance { get; }    public void MakeDeposit(decimal amount, DateTime date, string note)
    {
    }    public void MakeWithdrawal(decimal amount, DateTime date, string note)
    {
    }
}

Než se pustíme do toho, pojďme se podívat, co jste vytvořili. Deklarace namespace poskytuje způsob, jak logicky uspořádat kód. Tento kurz je relativně malý, takže veškerý kód umístíte do jednoho oboru názvů.

public class BankAccount definuje třídu nebo typ, který vytváříte. Všechno uvnitř { a } , které následuje po deklaraci třídy, definuje stav a chování třídy. Třída má pět členůBankAccount. První tři jsou vlastnosti. Vlastnosti jsou datové prvky a mohou obsahovat kód, který vynucuje ověření nebo jiná pravidla. Poslední dvě jsou metody. Metody jsou bloky kódu, které provádějí jednu funkci. Čtení jmen jednotlivých členů by vám nebo jinému vývojáři mělo poskytnout dostatek informací, abyste pochopili, co třída dělá.

Otevřít nový účet

První funkcí, kterou je potřeba implementovat, je otevření bankovního účtu. Když zákazník otevře účet, musí zadat počáteční zůstatek a informace o vlastníkovi nebo vlastnících tohoto účtu.

Vytvoření nového objektu BankAccount typu znamená definování konstruktoru , který tyto hodnoty přiřadí. Konstruktor je člen, který má stejný název jako třída. Používá se k inicializaci objektů tohoto typu třídy. Do typu přidejte následující konstruktor BankAccount . Nad deklaraci MakeDepositumístěte následující kód :

public BankAccount(string name, decimal initialBalance)
{
    this.Owner = name;
    this.Balance = initialBalance;
}

Předchozí kód identifikuje vlastnosti objektu vytvářeného zahrnutím kvalifikátoru this . Tento kvalifikátor je obvykle volitelný a vynechán. Mohli jste také napsat:


public BankAccount(string name, decimal initialBalance)
{
    Owner = name;
    Balance = initialBalance;
}

Kvalifikátor this je povinný pouze v případě, že místní proměnná nebo parametr má stejný název jako dané pole nebo vlastnost. Pokud this to není nutné, je kvalifikátor ve zbývající části tohoto článku vynechán.

Konstruktory se volají při vytváření objektu pomocí new. Nahraďte řádek Console.WriteLine("Hello World!"); v souboru Program.cs následujícím kódem (nahraďte <name> svým jménem):


", 1000);
Console.WriteLine($"Account {account.Number} was created for {account.Owner} with {account.Balance} initial balance.");
" style="box-sizing: inherit; outline-color: inherit; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 1em; direction: ltr; border: 0px; padding: 0px; line-height: 1.3571; display: block; position: relative;">using Classes;var account = new BankAccount("<name>", 1000);
Console.WriteLine($"Account {account.Number} was created for {account.Owner} with {account.Balance} initial balance.");

Pojďme se pustit do toho, co jste zatím vytvořili. Pokud používáte Visual Studio, vyberte v nabídce Laditmožnost Spustit bez ladění. Pokud používáte příkazový řádek, zadejte dotnet run adresář, ve kterém jste projekt vytvořili.

Všimli jste si, že číslo účtu je prázdné? Je čas to napravit. Číslo účtu by mělo být přiřazeno při vytváření objektu. Vytvoření by ale nemělo být na volajícím. Kód BankAccount třídy by měl vědět, jak přiřadit nová čísla účtů. Jednoduchým způsobem je začít desetimístným číslem. Zvyšte ho při vytváření každého nového účtu. Nakonec při vytváření objektu uložte číslo aktuálního účtu.

Přidejte deklaraci členu do BankAccount třídy . Za levou složenou závorku { na začátek třídy umístěte BankAccount následující řádek kódu:


private static int s_accountNumberSeed = 1234567890;

Je accountNumberSeed datový člen. Je to private, což znamená, že k němu může přistupovat pouze kód uvnitř BankAccount třídy . Jedná se o způsob oddělení veřejné odpovědnosti (například číslo účtu) od privátní implementace (jak se generují čísla účtů). Je také static, což znamená, že ho BankAccount sdílejí všechny objekty. Hodnota nestatické proměnné je pro každou instanci objektu jedinečná BankAccount . Je accountNumberSeedprivate static pole, a proto má předponu s_ podle konvencí vytváření názvů v jazyce C#. Pole s s popisem static a _ popisem private . Přidejte následující dva řádky do konstruktoru pro přiřazení čísla účtu. Umístěte je za řádek s textem this.Balance = initialBalance:


Number = s_accountNumberSeed.ToString();
s_accountNumberSeed++;

Pokud chcete zobrazit výsledky, zadejte dotnet run .

Vytvoření vkladů a výběrů

Vaše třída bankovního účtu musí přijímat vklady a výběry, aby fungovala správně. Pojďme implementovat vklady a výběry vytvořením deníku každé transakce pro účet. Sledování každé transakce má několik výhod oproti jednoduché aktualizaci zůstatku na každé transakci. Historii lze použít k auditu všech transakcí a správě denních zůstatků. Výpočet zůstatku z historie všech transakcí v případě potřeby zajistí, že všechny chyby v jedné transakci, které jsou opravené, se správně projeví ve zůstatku při dalším výpočtu.

Začněme vytvořením nového typu, který bude představovat transakci. Transakce je jednoduchý typ, který nemá žádnou odpovědnost. Potřebuje několik vlastností. Vytvořte nový soubor s názvem Transaction.cs. Přidejte do ní následující kód:


namespace Classes;public class Transaction
{
    public decimal Amount { get; }
    public DateTime Date { get; }
    public string Notes { get; }    public Transaction(decimal amount, DateTime date, string note)
    {
        Amount = amount;
        Date = date;
        Notes = note;
    }
}

Teď do třídy přidáme List<T>Transaction objekty BankAccount . Za konstruktor v souboru BankAccount.cs přidejte následující deklaraci:


 _allTransactions = new List();
" style="box-sizing: inherit; outline-color: inherit; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 1em; direction: ltr; border: 0px; padding: 0px; line-height: 1.3571; display: block; position: relative;">private List<Transaction> _allTransactions = new List<Transaction>();

Teď správně vypočítáme Balance. Aktuální zůstatek lze najít součtem hodnot všech transakcí. Vzhledem k tomu, že kód je aktuálně, můžete získat jenom počáteční zůstatek na účtu, takže budete muset vlastnost aktualizovat Balance . Nahraďte řádek public decimal Balance { get; } v souboru BankAccount.cs následujícím kódem:


public decimal Balance
{
    get
    {
        decimal balance = 0;
        foreach (var item in _allTransactions)
        {
            balance += item.Amount;
        }        return balance;
    }
}

Tento příklad ukazuje důležitý aspekt vlastností. Teď počítáte zůstatek, když o hodnotu požádá jiný programátor. Váš výpočet vypočítá všechny transakce a poskytne součet jako aktuální zůstatek.