0Pricing
C# Academy · Pelajaran

Enkapsulasi dan invarian

Sembunyikan status internal, tampilkan operasi yang aman, dan pertahankan agar invarian kelas selalu benar (misalnya saldo tidak negatif dan rentang valid).

Enkapsulasi dan invarian adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 3 pelajaran total.

Ikhtisar enkapsulasi

Tujuan: Melindungi keadaan objek Anda.

  • Enkapsulasi: sembunyikan bidang, ekspos APIs yang aman
  • Invarian: aturan yang selalu benar
  • Lakukan validasi dalam konstruktor/setter/metode

Permukaan hanya-baca

Jadikan bidang privat. Berikan pemanggil properti hanya-baca dan operasi yang aman.

using System;

// Expose read-only view; mutate via methods only
public class Counter
{
  private int _value;          // hidden state
  public int Value             // read-only to callers
  {
    get { return _value; }
    private set { _value = value; } // keep setter private
  }

  public void Increment()
  {
    Value = Value + 1;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Counter c = new Counter();
    c.Increment();
    c.Increment();
    Console.WriteLine("Value = " + c.Value);
  }
}

Penjagaan konstruktor

Konstruktor menetapkan keadaan yang diperlukan. Cegah input yang tidak valid agar objek tetap valid sejak awal.

using System;

// Enforce rules early (constructor guard)
public class User
{
  public string Name { get; private set; }
  public int Age { get; private set; }

  public User(string name, int age)
  {
    if (string.IsNullOrEmpty(name)) throw new ArgumentException("name");
    if (age < 0) throw new ArgumentOutOfRangeException("age");
    Name = name;
    Age = age;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      User u = new User("Ada", 28);
      Console.WriteLine(u.Name + " (" + u.Age + ")");
    }
    catch (Exception ex)
    {
      Console.WriteLine("Error: " + ex.Message);
    }
  }
}

Penerapan invarian

Tentukan sebuah invarian (misalnya, Balance ≥ 0) dan tegakkan dalam setter serta metode.

using System;

// Invariant: Balance >= 0 at all times
public class BankAccount
{
  private decimal _balance;

  public decimal Balance
  {
    get { return _balance; }
    private set
    {
      if (value < 0) throw new InvalidOperationException("Balance would be negative");
      _balance = value;
    }
  }

  public BankAccount(decimal opening)
  {
    if (opening < 0) throw new ArgumentOutOfRangeException("opening");
    _balance = opening;
  }

  public void Deposit(decimal amount)
  {
    if (amount <= 0) throw new ArgumentOutOfRangeException("amount");
    Balance = Balance + amount;
  }

  public bool TryWithdraw(decimal amount)
  {
    if (amount <= 0) return false;
    if (Balance - amount < 0) return false;
    Balance = Balance - amount;
    return true;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    BankAccount a = new BankAccount(50m);
    a.Deposit(20m);
    bool ok = a.TryWithdraw(100m); // fails, invariant protected
    Console.WriteLine("ok=" + ok + " balance=" + a.Balance);
  }
}

Melindungi koleksi

Jangan mengekspos daftar/larik internal secara langsung. Kembalikan salinan (atau tampilan hanya-baca) untuk melindungi invarian.

using System;
using System.Collections.Generic;

public class Tags
{
  private readonly List<string> _items = new List<string>();

  public void Add(string tag)
  {
    if (string.IsNullOrWhiteSpace(tag)) return;
    _items.Add(tag.Trim());
  }

  // Expose a copy so callers cannot mutate internal list
  public List<string> GetAllCopy()
  {
    return new List<string>(_items);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Tags t = new Tags();
    t.Add(" apple ");
    t.Add("banana");
    List<string> view = t.GetAllCopy();
    view.Add("hacker"); // modifies the copy only
    Console.WriteLine("copy count=" + view.Count);
    Console.WriteLine("original count=" + t.GetAllCopy().Count);
  }
}

Kiat enkapsulasi

Daftar periksa:

  • Bidang privat; properti/metode publik.
  • Lakukan validasi dalam konstruktor/setter.
  • Pastikan invarian tetap benar setelah setiap pemanggilan.
  • Jangan membocorkan koleksi internal.

Prinsip enkapsulasi

Pemeriksaan singkat: Pilihan mana yang paling baik mempertahankan enkapsulasi dan invarian kelas?

Ringkasan

Ringkasan: Lakukan enkapsulasi dengan bidang privat dan APIs yang tervalidasi. Tentukan sebuah invarian dan tegakkan dalam konstruktor, setter, serta metode. Jangan pernah membocorkan koleksi internal.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Enkapsulasi dan invarian” gratis?

Ya — teks lengkap “Enkapsulasi dan invarian” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 3 pelajaran total.

Apa yang akan aku pelajari di “Enkapsulasi dan invarian”?

Sembunyikan status internal, tampilkan operasi yang aman, dan pertahankan agar invarian kelas selalu benar (misalnya saldo tidak negatif dan rentang valid). Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 3.

Berapa lama pelajaran “Enkapsulasi dan invarian” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Field, properti otomatis, penginisialisasi objek
  2. Konstruktor, anggota statis
  3. Enkapsulasi dan invarian
← Kembali ke C# Academy