Menu
Coddy logo textTech

Bankacılık Sistemi

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 106 / 107.

challenge icon

Görev

Kolay

Hesapları, işlemleri ve finansal operasyonları yöneten bir Bankacılık Sistemi oluşturalım! Veri bütünlüğünün kritik olduğu sağlam bir sistem oluşturacaksınız: hesap bakiyeleri yalnızca doğrulanmış yöntemler aracılığıyla değişmeli ve kredili mevduat hesabı aşımı veya geçersiz tutarlar gibi hatalar sorunsuz bir şekilde ele alınmalıdır.

Kodunuzu beş dosyaya ayıracaksınız:

  • account.go: Transactable ve Deposit(amount float64) error yöntemlerine sahip bir Withdraw(amount float64) error arayüzü tanımlayın. Ardından bu arayüzü uygulayan iki hesap türü oluşturun:

    Export edilmemiş CheckingAccount, id ve holder alanlarına sahip bir balance. Cari hesaplar, bakiyeyi tam olarak sıfıra indiren para çekme işlemlerine izin verir ancak bakiyenin sıfırın altına düşmesine izin vermez.

    Aynı export edilmemiş alanlara ek olarak bir SavingsAccount alanına sahip bir minBalance. Tasarruf hesapları 100.0 tutarında minimum bakiye korumalıdır: bu eşik değerin altına düşmeye neden olacak para çekme işlemleri başarısız olmalıdır.

    Her iki hesap türünün de oluşturuculara (NewCheckingAccount ve NewSavingsAccount) ve bir Balance() float64 getter yöntemine ihtiyacı vardır. Para yatırma işlemlerinde negatif veya sıfır tutarları reddedin. Para çekme işlemlerinde negatif veya sıfır tutarları ve kullanılabilir bakiyeyi aşan tutarları reddedin.

  • transaction.go: Hesap hareketlerini kaydetmek için bir Transaction yapısı oluşturun. Her işlemin bir Type (string: "deposit" veya "withdrawal"), Amount (float64) ve AccountID (string) alanı vardır. Bir NewTransaction oluşturucusu ve şu biçimi döndüren bir String() string yöntemi ekleyin: tutarın iki ondalık basamağa biçimlendirildiği [Type] $[Amount] on [AccountID].
  • bank.go: Birden çok hesabı yöneten ve işlemleri kaydeden bir Bank yapısı oluşturun. Hesapları ID'ye göre bir map'te saklayın ve işlemlerden oluşan bir slice tutun. Şunları uygulayın:
    • NewBank() *Bank: boş koleksiyonları başlatır
    • AddAccount(id string, account Transactable): bir hesabı kaydeder
    • Deposit(accountID string, amount float64) error: bir hesaba para yatırır ve başarılı olursa işlemi kaydeder
    • Withdraw(accountID string, amount float64) error: bir hesaptan para çeker ve başarılı olursa işlemi kaydeder
    • Transfer(fromID, toID string, amount float64) error: hesaplar arasında parayı atomik olarak aktarır (para çekme başarılı ancak para yatırma başarısız olursa para çekme işlemini geri alın)
    • GetBalance(accountID string) (float64, error): bir hesabın bakiyesini döndürür

    Mevcut olmayan hesaplar için uygun hataları döndürün.

  • errors.go: Bankacılık işlemleriniz için sentinel hatalar tanımlayın:
    • ErrAccountNotFound: bir hesap ID'si mevcut olmadığında
    • ErrInsufficientFunds: para çekme işlemi kullanılabilir bakiyeyi aştığında
    • ErrInvalidAmount: para yatırma/çekme tutarı sıfır veya negatif olduğunda
    • ErrMinBalanceRequired: tasarruf hesabından para çekme işlemi minimum bakiyeyi ihlal edeceğinde
  • main.go: Bir banka oluşturun ve girdiye göre işlemleri gerçekleştirin.

    Oluşturulacak hesapların sayısını okuyun. Her hesap için hesap türünü (checking veya savings), ID'yi, hesap sahibinin adını ve başlangıç bakiyesini okuyun. Uygun hesap türünü oluşturun ve bankaya ekleyin.

    Ardından işlem sayısını okuyun. Her işlem şunlardan biridir:

    • deposit [accountID] [amount]
    • withdraw [accountID] [amount]
    • transfer [fromID] [toID] [amount]
    • balance [accountID]

    Her işlem için sonucu yazdırın: başarılı para yatırma/çekme/aktarma işlemleri için OK, bakiye sorguları için iki ondalık basamağa biçimlendirilmiş bakiye veya başarısız işlemler için sentinel hata mesajlarınızı kullanan Error: [message].

Aşağıdaki girdiler sağlanacaktır:

  • Hesap sayısı, ardından her hesabın türü, ID'si, sahibi ve başlangıç bakiyesi (her biri 4 satır)
  • İşlem sayısı, ardından her işlem (her biri 1 satır)

Örneğin, şu veriler verildiğinde:

2
checking
ACC001
Alice
500.00
savings
ACC002
Bob
1000.00
6
deposit ACC001 200
balance ACC001
withdraw ACC002 950
withdraw ACC001 800
transfer ACC001 ACC002 100
balance ACC002

Çıktınız şöyle olmalıdır:

OK
700.00
Error: minimum balance required
Error: insufficient funds
OK
1000.00

Ve şu veriler verildiğinde:

1
checking
C100
Charlie
100.00
4
withdraw C100 100
balance C100
deposit C100 -50
withdraw C999 50

Çıktınız şöyle olmalıdır:

OK
0.00
Error: invalid amount
Error: account not found

Transactable arayüzünün Bank'ın her iki hesap türüyle de tek tip şekilde çalışmasına nasıl olanak sağladığına dikkat edin; her hesap türü kendi kurallarını uygularken, Transfer yöntemi atomik işlemleri gösterir: işlemin ortasında bir şeyler ters giderse sistem tutarlı kalır!

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// Hesap sayısını oku
	scanner.Scan()
	numAccounts, _ := strconv.Atoi(scanner.Text())

	// Yeni bir banka oluştur
	bank := NewBank()

	// Hesapları oku ve oluştur
	for i := 0; i < numAccounts; i++ {
		scanner.Scan()
		accountType := scanner.Text()
		scanner.Scan()
		id := scanner.Text()
		scanner.Scan()
		holder := scanner.Text()
		scanner.Scan()
		balance, _ := strconv.ParseFloat(scanner.Text(), 64)

		// TODO: accountType'a göre uygun hesap türünü oluştur
		// ve bankaya ekle
		_ = accountType
		_ = id
		_ = holder
		_ = balance
	}

	// İşlem sayısını oku
	scanner.Scan()
	numOps, _ := strconv.Atoi(scanner.Text())

	// Her işlemi işle
	for i := 0; i < numOps; i++ {
		scanner.Scan()
		parts := strings.Fields(scanner.Text())
		operation := parts[0]

		// TODO: Her işlem türünü ele al:
		// - "deposit": hesaba para yatır, "OK" veya hata yazdır
		// - "withdraw": hesaptan para çek, "OK" veya hata yazdır
		// - "transfer": hesaplar arasında transfer yap, "OK" veya hata yazdır
		// - "balance": bakiyeyi al ve 2 ondalık basamağa biçimlendirilmiş olarak yazdır
		_ = operation
	}
}

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi