C#: modelează un împrumut cu reguli și identitate
Construiește un model C# pentru împrumuturi, cu identitate stabilă și operații controlate. Verifică tranzițiile permise înainte de a conecta interfața grafică.
În acest material
Un rând din tabelul vizual este o reprezentare temporară a unei entități. Poziția lui se schimbă la sortare, însă identitatea împrumutului trebuie să rămână aceeași. Modelul nostru are un identificator pozitiv, o dată de început și o stare activă. Interfața poate cere returnarea, dar nu ar trebui să modifice arbitrar proprietățile interne.
Cum lucrezi cu exemplul
Programul complet folosește C# 7.3 și API-uri disponibile în .NET Framework 4.8. Deschide Lesson.csproj din arhivă sau creează un proiect Console App (.NET Framework 4.8) și înlocuiește Program.cs. Datele de demonstrație sunt incluse în cod.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
Constructorul validează identificatorul și păstrează numai data calendaristică. Proprietatea Active are setter privat. Metoda Return verifică întâi dacă operația mai este permisă și abia apoi schimbă starea. Rezultatul false pentru a doua returnare este o decizie de domeniu, nu o eroare de index.
Data este primită ca parametru. Nu citim DateTime.Now în interiorul fiecărei reguli, fiindcă un test ar depinde de momentul execuției. În proiectul real, stratul de interfață poate furniza data curentă. Pentru persistare vei salva identificatorul și valorile relevante, apoi le vei reconstrui printr-o cale care validează starea.
Exemplu și rezultat așteptat
Împrumutul 17 începe la 1 octombrie 2026. Prima returnare la 3 octombrie produce true, starea devine inactivă, iar data de închidere este salvată. A doua încercare produce false și nu mută data la 4 octombrie. Programul verifică această proprietate și afișează 17: inchis la 2026-10-03.
ID 17: activ → Returnare: 3 octombrie → ID 17: închis → A doua returnare: refuz.Mărește schema ↗
Codul complet
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Globalization;
using System.Xml.Linq;
using System.Data;
class Loan {
public int Id { get; private set; }
public DateTime Start { get; private set; }
public DateTime? Returned { get; private set; }
public bool Active { get { return !Returned.HasValue; } }
public Loan(int id, DateTime start) {
if (id <= 0) throw new ArgumentOutOfRangeException("id");
Id = id; Start = start.Date;
}
public bool Return(DateTime date) {
if (!Active) return false;
if (date.Date < Start) throw new ArgumentOutOfRangeException("date");
Returned = date.Date; return true;
}
}
class Program {
static void Main() {
var loan = new Loan(17, new DateTime(2026, 10, 1));
if (!loan.Return(new DateTime(2026, 10, 3)) || loan.Return(new DateTime(2026, 10, 4)))
throw new Exception("Tranzitie incorecta");
Console.WriteLine(loan.Id + ": inchis la " + loan.Returned.Value.ToString("yyyy-MM-dd"));
}
}
Rezultatul programului:
17: inchis la 2026-10-03
Greșeli și limite
Nu folosi titlul cărții ca identificator: două exemplare pot avea același titlu. Nu folosi numărul rândului din DataGridView, care este doar poziție de afișare. Nu lăsa un setter public să ocolească verificările metodei Return. O dată de returnare anterioară începerii este respinsă; faptul că valoarea este un DateTime valid nu o face automat corectă pentru domeniu.
Exersează
Testează identificatorul zero și data de returnare anterioară începerii. Ambele trebuie respinse, fără schimbarea stării obiectului valid. Adaugă un termen de returnare și o metodă care calculează întârzierea pentru o dată primită ca argument. Pentru termenul 10 octombrie și evaluarea din 12 octombrie, rezultatul așteptat este două zile, nu diferența de ore de la miezul nopții curente.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: depanare cu breakpoint și starea programului
Lecția următoare: C#: separă stocarea printr-o interfață repository.
Referință: documentația Microsoft.
Întrebări frecvente
De ce are entitatea un ID?
Pentru a o recunoaște stabil chiar dacă poziția, titlul sau ordinea de afișare se schimbă.
De ce este setter-ul privat?
Pentru ca schimbarea stării să treacă prin regula verificată a operației.
Cum fac testele independente de ceas?
Trimit data ca parametru și folosesc valori fixe în teste.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.