C#: proiect gestiune cu stoc și operații verificabile
Construiește o aplicație C# de gestiune a stocului. Separă operațiile de intrare și ieșire, refuză cantitățile imposibile și păstrează un jurnal al succeselor.
În acest material
În gestiune, un stoc negativ nu este o simplă problemă de afișare. Regula trebuie protejată în model, indiferent de controlul folosit pentru introducerea cantității. Proiectul urmărește un produs și două operații: intrare și ieșire. Jurnalul înregistrează numai operațiile reușite.
Cum lucrezi cu exemplul
Exemplul complet se compilează ca Windows Forms App pe .NET Framework 4.8, cu C# 7.3. Deschide Lesson.csproj din arhivă în Visual Studio pe Windows. Rulează scenariile descrise mai jos; verificarea compilării nu înlocuiește testarea ferestrei și a dispozitivelor folosite.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
Stock primește o valoare inițială între zero și un milion. Add verifică limita înainte de adunare, iar Remove verifică disponibilul înainte de scădere. Ambele întorc bool pentru acceptare. NumericUpDown limitează introducerea la 1–1000, dar modelul verifică în continuare propriul contract.
Handlerii apelează aceeași metodă Apply cu sensul operației. Numai succesul adaugă o linie în jurnal. Label-ul este reîmprospătat din model după fiecare încercare. În acest proiect datele sunt în memorie; pentru persistență poți adapta salvarea XML din proiectul anterior sau o tranzacție SQL.
Exemplu și rezultat așteptat
Pornim cu zece unități. O ieșire de șapte produce stoc trei și o linie de jurnal. Încercarea unei ieșiri de cinci este refuzată: stocul și jurnalul rămân neschimbate. O intrare de două produce stoc cinci.
Stoc 10 → Ieșire 7 → stoc 3 → Ieșire 5 → refuz → Intrare 2 → stoc 5.Mărește schema ↗
Codul complet
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LessonForm());
}
}
class Stock {
public int Value {get;private set;}
public Stock(int initial) {if(initial<0 || initial>1000000)throw new ArgumentOutOfRangeException("initial");Value=initial;}
public bool Add(int quantity) {if(quantity<=0 || quantity>1000000-Value)return false;Value+=quantity;return true;}
public bool Remove(int quantity) {if(quantity<=0 || quantity>Value)return false;Value-=quantity;return true;}
}
class LessonForm : Form
{
readonly Stock stock=new Stock(10);
readonly NumericUpDown amount=new NumericUpDown {Left=20,Top=20,Minimum=1,Maximum=1000,Value=1};
readonly Label total=new Label {Left=20,Top=65,Width=250};
readonly ListBox log=new ListBox {Left=20,Top=110,Width=440,Height=150};
public LessonForm() {
Text="Gestiune";ClientSize=new Size(500,290);
var add=new Button {Left=170,Top=20,Text="Intrare"};var remove=new Button {Left=280,Top=20,Text="Iesire"};
add.Click += (s,e) => Apply(true);remove.Click += (s,e) => Apply(false);
Controls.AddRange(new Control[] {amount,add,remove,total,log});total.Text="Stoc: " + stock.Value;
}
void Apply(bool incoming) {
int quantity=(int)amount.Value;bool ok=incoming ? stock.Add(quantity) : stock.Remove(quantity);
if(ok)log.Items.Add((incoming ? "Intrare " : "Iesire ") + quantity);else MessageBox.Show(this,"Operatie refuzata.");
total.Text="Stoc: " + stock.Value;
}
}
Greșeli și limite
Nu scădea stocul înainte de verificare și apoi încerca să repari un rezultat negativ. Nu deduce stocul din numărul liniilor jurnalului. Nu considera că limita controlului înlocuiește validarea modelului, deoarece modelul poate fi apelat și de un import sau de teste.
Exersează
Verifică scenariul 10, ieșire 7, refuz 5, intrare 2. Testează în model cantitatea zero și apropierea de limita maximă. Adaugă două produse cu ID-uri distincte și confirmă că o operație pe unul nu modifică celălalt. Pentru predare, documentează explicit că închiderea aplicației pierde starea până la adăugarea persistării.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: proiect bibliotecă cu împrumut și salvare XML
Lecția următoare: C#: proiect catalog cu note și raport calculat.
Referință: documentația Microsoft.
Întrebări frecvente
De ce validez și în model?
Pentru că regulile trebuie păstrate și când datele vin din altă sursă decât controlul vizual.
O operație refuzată apare în jurnalul succeselor?
Nu. Poți avea separat un jurnal de erori, dar nu o înregistra drept modificare reușită.
Stocul se salvează automat?
Nu în acest exemplu. Persistarea trebuie adăugată și verificată prin recitire.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.