Originariamente pubblicato su CodeReview, ma è stato rilevato che sarebbe stato pubblicato qui meglio. L'altra domanda è stata cancellata.
Creazione di un software di finanza personale, ma in esecuzione in un problema di architettura. Ho una classe chiamata Account
che contiene Transactions
e SubAccounts
. Sono molto avanti nella fase di codifica, ma sto vedendo che la mia classe Account
potrebbe potenzialmente diventare molto grande.
Questo è quello che ho:
public class Account
{
public Account(string name)
{
Name = name;
_subAccounts = new List<Account>();
Transactions = new List<Transaction>();
}
public string Name { get; }
public List<Transaction> Transactions { get; }
public IEnumerable<Account> SubAccounts => _subAccounts;
public decimal Balance => ComputeBalance();
public void AddSubAccount(Account account)
{
Debug.Assert(account != null);
_subAccounts.Add(account);
}
public Account FindSubAccount(string name)
{
// logic to find account
return account;
}
public void RemoveSubAccount(Account account)
{
Debug.Assert(account != null);
_subAccounts.Remove(account);
}
public void AddTransaction(Transaction transaction)
{
Transactions.Add(transaction);
}
public void FindTransactionByID(TransactionID id)
{
// logic to find transaction
return transaction;
}
public void RemoveTransaction(Transaction transaction)
{
Transactions.Remove(transaction);
}
private decimal ComputeBalance()
{
decimal balance = 0M;
foreach (var transaction in Transactions)
{
balance += transaction.Amount;
}
return balance;
}
private readonly List<Account> _subAccounts;
}
public class Transaction
{
public Transaction(string desc, decimal amount, Account debit, Account credit)
{
Description = desc;
Amount = amount;
Credit = credit;
Debit = debit;
}
public string Description { get; }
public decimal Amount { get; }
public Account Credit { get; }
public Account Debit { get; }
}
Il problema che sta iniziando a comparire è che la mia classe Account
sembra molto segregata tra 3 parti: subaccount, transazioni e calcolo di un saldo. Tuttavia, in termini di parlare di contabilità, un account finanziario ha tutti questi attributi.
La mia domanda è: cosa fare per evitare che una classe diventi troppo grande (troppe responsabilità) quando si cerca di attenersi al linguaggio del dominio ubiquitario?
Per risolvere il problema, ho avuto l'idea di creare una struttura dati ad albero che usasse AccountNodes
che mantiene puntatori ad altri AccountNodes
(per simulare SubAccounts) e Account
. Ciò separerebbe la struttura gerarchica fisica dall'account.