Desain Statis vs Instance
Tentukan kapan keadaan statis tepat digunakan.
Desain Statis vs Instance adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. 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 4 pelajaran total.
Sebuah Keputusan Desain
Memilih antara statis dan instans merupakan keputusan desain. Pertanyaan utamanya: apakah perilaku bergantung pada keadaan setiap objek, atau hanya pada inputnya?
using System;
class Program
{
// Depends only on inputs -> good static method
static int Max(int a, int b) => a > b ? a : b;
static void Main()
{
Console.WriteLine(Max(3, 8));
}
}Gunakan Statis untuk Logika Tanpa Keadaan
Jika suatu metode tidak memerlukan bidang instans dan hanya mengubah input, jadikan metode tersebut static. Pembantu matematika dan pemformat merupakan contoh utamanya.
using System;
static class Convert2
{
public static double MilesToKm(double miles) => miles * 1.60934;
}
class Program
{
static void Main()
{
Console.WriteLine(Convert2.MilesToKm(10).ToString("0.0") + " km");
}
}Gunakan Instans untuk Keadaan
Jika perilaku bergantung pada data yang berbeda untuk setiap objek, gunakan instans. Setiap objek menyimpan keadaannya sendiri.
using System;
class Counter
{
private int _count;
public void Increment() => _count++;
public int Value => _count;
}
class Program
{
static void Main()
{
var a = new Counter();
var b = new Counter();
a.Increment();
a.Increment();
b.Increment();
Console.WriteLine("a=" + a.Value + ", b=" + b.Value);
}
}Keadaan Bersama Adalah Keadaan Global
Bidang statis pada dasarnya bersifat global. Bidang ini dapat menyebabkan kesalahan tersembunyi ketika banyak bagian program membaca dan menulisnya. Utamakan keadaan instans jika setiap pengguna memerlukan salinannya sendiri.
using System;
class BadCart
{
public static int Items; // shared by EVERYONE -> usually wrong for a cart
}
class Program
{
static void Main()
{
BadCart.Items++;
BadCart.Items++;
Console.WriteLine("All carts share: " + BadCart.Items);
}
}Kemudahan Pengujian
Metode statis murni mudah diuji: input yang sama menghasilkan output yang sama. Namun, keadaan statis yang dapat diubah dapat bocor antar-pengujian dan membuat pengujian rapuh.
using System;
static class Calc
{
public static int Add(int a, int b) => a + b; // trivially testable
}
class Program
{
static void Main()
{
Console.WriteLine(Calc.Add(2, 2) == 4 ? "pass" : "fail");
}
}Statis untuk Pembantu Pabrik
Metode pabrik statis merupakan cara yang rapi untuk membuat instans yang telah dikonfigurasi dengan nama yang deskriptif.
using System;
class Color
{
public int R, G, B;
private Color(int r, int g, int b) { R = r; G = g; B = b; }
public static Color Red() => new Color(255, 0, 0);
public static Color White() => new Color(255, 255, 255);
}
class Program
{
static void Main()
{
var c = Color.Red();
Console.WriteLine(c.R + "," + c.G + "," + c.B);
}
}Hindari Statis Hanya untuk Menghindari Pembuatan Objek
Jangan menjadikan semuanya statis hanya untuk menghindari pembuatan objek. Jika suatu tipe memodelkan sesuatu yang memiliki keadaan, instans menjaga keadaan tersebut tetap terpisah dan aman.
using System;
class Player
{
public string Name;
public int Health = 100;
public void TakeDamage(int d) => Health -= d;
}
class Program
{
static void Main()
{
var p1 = new Player { Name = "A" };
var p2 = new Player { Name = "B" };
p1.TakeDamage(30);
Console.WriteLine(p1.Name + ": " + p1.Health + ", " + p2.Name + ": " + p2.Health);
}
}Menggabungkan Keduanya dengan Tepat
Banyak kelas menggunakan anggota statis untuk konstanta atau penghitung bersama dan anggota instans untuk data setiap objek. Perpaduan ini sepenuhnya sesuai dengan kebiasaan umum.
using System;
class Invoice
{
private static int _seq = 1000;
public readonly int Number;
public decimal Amount;
public Invoice(decimal amount)
{
Number = _seq++;
Amount = amount;
}
}
class Program
{
static void Main()
{
var i1 = new Invoice(50m);
var i2 = new Invoice(75m);
Console.WriteLine(i1.Number + " / " + i2.Number);
}
}Perhatian terhadap Konkurensi
Keadaan statis yang dibagikan dapat diakses oleh beberapa utas sekaligus sehingga berisiko menimbulkan kondisi balapan. Keadaan instans yang dibatasi pada satu utas secara bawaan lebih aman.
using System;
class SafeCalc
{
// No shared mutable state -> naturally thread-safe
public static long Factorial(int n)
{
long result = 1;
for (int i = 2; i <= n; i++) result *= i;
return result;
}
}
class Program
{
static void Main()
{
Console.WriteLine(SafeCalc.Factorial(5));
}
}Aturan Praktis Sederhana
Statis = perilaku yang dimiliki oleh tipe dan tidak menggunakan keadaan setiap objek. Instans = perilaku yang membaca atau mengubah objek tertentu. Jika ragu, pilih instans untuk segala sesuatu yang memiliki keadaan.
using System;
class Temperature
{
public double Celsius; // instance state
public static double ToF(double c) => c * 9 / 5 + 32; // stateless helper
}
class Program
{
static void Main()
{
var t = new Temperature { Celsius = 30 };
Console.WriteLine(Temperature.ToF(t.Celsius));
}
}Menggabungkan Semuanya
Desain yang baik memisahkan pembantu tanpa keadaan (statis) dari model yang memiliki keadaan (instans), serta menjaga keadaan bersama yang dapat diubah pada tingkat minimum yang disengaja.
using System;
static class TaxRules
{
public static decimal Apply(decimal amount, decimal rate) => amount + amount * rate;
}
class Sale
{
public decimal Subtotal;
public decimal Total(decimal rate) => TaxRules.Apply(Subtotal, rate);
}
class Program
{
static void Main()
{
var s = new Sale { Subtotal = 100m };
Console.WriteLine(s.Total(0.2m));
}
}Uji Cepat
Uji pemahaman Anda tentang desain statis dan instans.
Rangkuman
Pilih statis untuk logika tanpa keadaan yang hanya bergantung pada input (pembantu, pabrik, konstanta), dan instans untuk perilaku yang terkait dengan keadaan setiap objek. Keadaan statis yang dapat diubah pada dasarnya bersifat global, lebih sulit diuji, dan berisiko menimbulkan kesalahan konkurensi, jadi gunakan sesedikit mungkin dan dengan sengaja.
using System;
static class Util { public static int Sq(int n) => n * n; }
class Box { public int Size; public int Area() => Util.Sq(Size); }
class Program
{
static void Main()
{
var box = new Box { Size = 4 };
Console.WriteLine(box.Area());
}
}Pertanyaan yang Sering Diajukan
Apakah pelajaran “Desain Statis vs Instance” gratis?
Ya — teks lengkap “Desain Statis vs Instance” 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 4 pelajaran total.
Apa yang akan aku pelajari di “Desain Statis vs Instance”?
Tentukan kapan keadaan statis tepat digunakan. 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 4 dari 4.
Berapa lama pelajaran “Desain Statis vs Instance” 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
- Metode dan Field Statis
- Kelas Statis untuk Utilitas
- Konstanta dan Field readonly
- Desain Statis vs Instance