← l-artikli kollha

C#

OOP f'C#: l-Eżempji li Finalment Qabdu f'Moħħi

Dog, Animal, u Bark() qatt ma baqgħu f'moħħi. Encapsulation, abstraction, inheritance, u polymorphism finalment qabdu ladarba rajthom f'kont bankarju, servizz ta' notifiki, u payment processor minflok.

OOP f'C#: l-Eżempji li Finalment Qabdu f'Moħħi

Kull tutorial ta' OOP li bdejt bih uża l-istess eżempji tal-ktieb tal-iskola: Dog li tiret minn Animal u ssejjaħ Bark(), Car li tiret minn Vehicle u ssejjaħ Drive(). Xejn minn dan ma baqa' f'moħħi, għax ma nibnix kennels tal-klieb jew dealerships tal-karozzi. Nibni payment flows u integrazzjonijiet ta' API. L-erba' pilastri verament qabdu biss ladarba rajthom f'kodiċi li kien jidher bħal dak li verament nikteb.

Encapsulation: BankAccount

Il-verżjoni li ma qabditx kienet qasam pubbliku li kwalunkwe kodiċi seta' jissettja direttament:

public class BankAccount
{
    public decimal Balance;
}

Xejn ma jżomm kwalunkwe kodiċi fis-solution milli jissettja Balance għal numru negattiv. Dak li għamel l-encapsulation taqbad ma kienx "aħbi l-qasam," kien li ninduna li l-oġġett għandu jkun l-unika ħaġa permessa tbiddel l-istat tiegħu stess, u biss permezz ta' regoli li jinforza hu stess:

public class BankAccount
{
    public decimal Balance { get; private set; }

    public void Deposit(decimal amount)
    {
        if (amount <= 0)
            throw new ArgumentException("Deposit amount must be positive.");

        Balance += amount;
    }

    public void Withdraw(decimal amount)
    {
        if (amount > Balance)
            throw new InvalidOperationException("Insufficient funds.");

        Balance -= amount;
    }
}

Abstraction: servizz ta' notifiki

L-abstraction qabdet ladarba waqaft naħsibha bħala "agħmel interface" u bdejt naħsibha bħala li taħbi l-mess li min isejjaħ m'għandux għalfejn jimpurtah dwaru:

public interface INotificationService
{
    Task SendSmsAsync(string phoneNumber, string message);
}

public class TwilioNotificationService : INotificationService
{
    private readonly HttpClient _httpClient;

    public async Task SendSmsAsync(string phoneNumber, string message)
    {
        // HTTP payload formatting, auth header signing, error handling
    }
}

Kwalunkwe ħaġa li ssejjaħ SendSmsAsync m'għandhiex bżonn taf dwar HTTP status codes jew signing headers. Dik il-lakuna bejn il-kuntratt sempliċi u l-implimentazzjoni imħawda warajh hija dak li l-abstraction verament tagħtik.

Inheritance: template ta' payment processor

Katini profondi ta' inheritance qatt ma għamlu sens għalija sakemm rajt inheritance użata għal workflow komuni minflok tassonomija komuni:

public abstract class PaymentProcessor
{
    public async Task ProcessTransactionAsync(decimal amount)
    {
        ValidateAmount(amount);
        await ExecutePaymentAsync(amount);
        LogReceipt();
    }

    private void ValidateAmount(decimal amount) { /* shared logic */ }
    private void LogReceipt() { /* shared logic */ }

    protected abstract Task ExecutePaymentAsync(decimal amount);
}

public class StripePaymentProcessor : PaymentProcessor
{
    protected override async Task ExecutePaymentAsync(decimal amount)
    {
        // Stripe API integration logic
    }
}

Il-klassi bażi tippossjedi l-proċess. Kull subclass tissuperviżjona biss il-pass wieħed li verament ivarja. Dak huwa impenn ħafna iżgħar mill-katini Dog -> Mammal -> Animal li bqajt nara fit-tutorials.

Polymorphism: nibdlu payment providers

L-eżempju li għamel il-polymorphism taqbad kien li nissostitwixxi katina dejjem tikber ta' if/else b'abstraction waħda:

public class CheckoutService
{
    private readonly PaymentProcessor _paymentProcessor;

    public CheckoutService(PaymentProcessor paymentProcessor)
    {
        _paymentProcessor = paymentProcessor;
    }

    public async Task CompleteOrderAsync(Order order)
    {
        await _paymentProcessor.ProcessTransactionAsync(order.TotalAmount);
    }
}

CheckoutService ma jafx u ma jimpurtahx liema subclass konkreta ta' PaymentProcessor ħa, StripePaymentProcessor jew kwalunkwe ħaġa miżjuda aktar tard. Li żżid metodu ta' pagament ġdid ifisser tikteb subclass ġdida, mhux teditja switch statement moħbija xi mkien ieħor fil-codebase.

X'verament inbidel

Dak li għamel dawn l-erbgħa jibqgħu f'moħħi huwa li huma kollha affarijiet li verament nikteb. Il-kunċett finalment kellu fejn attwali jeħel, minflok jinsab fuq klassi Dog li qatt m'iniex se nuża mill-ġdid.