Pola Imutabilitas
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 34 dari 70.
Imutabilitas membawa enkapsulasi ke titik ekstrem yang logis. Setelah object dibuat, object tidak akan pernah berubah. Ini menghilangkan seluruh kategori bug karena kamu tidak perlu khawatir data kamu diubah secara tak terduga.
Cara paling sederhana untuk membuat class yang immutable adalah menggunakan field readonly dengan constructor yang menetapkan semua nilai, dan tidak menyediakan setter:
public class Point
{
public readonly int X;
public readonly int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}Setelah Point dibuat, koordinatnya tidak dapat berubah. Namun, bagaimana jika kamu membutuhkan versi yang dimodifikasi? Alih-alih mengubah object yang sudah ada, kamu mengembalikan object baru:
public Point Move(int deltaX, int deltaY)
{
return new Point(X + deltaX, Y + deltaY);
}Titik asli tetap tidak berubah, sementara kamu mendapatkan titik baru dengan nilai yang diperbarui. Pola ini digunakan di seluruh .NET, misalnya, string bersifat immutable. Saat kamu memanggil ToUpper(), kamu mendapatkan string baru, bukan mengubah string asli.
object yang immutable pada dasarnya aman untuk thread karena tidak ada kode yang dapat mengubahnya setelah dibuat. object ini juga lebih mudah dipahami karena kamu tahu state-nya tidak akan pernah berubah secara tak terduga.
Tantangan
MudahMari buat sistem uang yang immutable untuk menunjukkan bagaimana object dapat dirancang agar tidak pernah berubah setelah dibuat. Kamu akan membuat class Money dengan setiap operasi mengembalikan object baru, bukan mengubah object aslinya. Pola ini membuat kodemu lebih aman dan lebih mudah dipahami.
Kamu akan mengatur kodemu dalam dua file:
Money.cs: Buat classMoneyyang immutable di namespaceFinance. Uangmu harus memiliki:- Dua field
readonly:Amount(decimal) danCurrency(string) - Constructor yang menetapkan kedua nilai. Setelah dibuat, object Money tidak akan pernah bisa berubah
- Method
Add(decimal value)yang mengembalikan objectMoneybaru dengan jumlah yang bertambah, menggunakan mata uang yang sama - Method
Subtract(decimal value)yang mengembalikan objectMoneybaru dengan jumlah yang berkurang, menggunakan mata uang yang sama - Method
Convert(string newCurrency, decimal rate)yang mengembalikan objectMoneybaru dengan jumlah yang dikalikan dengan nilai tukar dan mata uang baru - Method
GetDisplay()yang mengembalikan string dalam format"{Amount} {Currency}"
Moneyyang benar-benar baru!- Dua field
Program.cs: Di file utama, tunjukkan cara kerja immutability. Buat objectMoneyawal, lalu lakukan operasi terhadapnya sambil menyimpan referensi ke object asli dan hasilnya. Ini akan membuktikan bahwa object asli tidak pernah berubah, bahkan setelah beberapa operasi.
Kamu akan menerima empat input:
- Jumlah awal (decimal)
- Mata uang awal (string)
- Jumlah yang akan ditambahkan (decimal)
- Nilai tukar ke EUR (decimal)
Cetak output dalam format ini:
Original: {GetDisplay()}
After add: {GetDisplay()}
Original unchanged: {GetDisplay()}
Converted: {GetDisplay()}Misalnya, jika inputnya adalah 100.00, USD, 50.00, dan 0.85, outputnya harus seperti ini:
Original: 100.00 USD
After add: 150.00 USD
Original unchanged: 100.00 USD
Converted: 127.50 EURPerhatikan bahwa object Money asli tetap menampilkan 100.00 USD bahkan setelah memanggil Add(). Itulah immutability! Method Add() membuat object baru sepenuhnya dengan 150.00 USD, tanpa mengubah object asli. Konversi dilakukan pada hasil operasi penambahan.
Coba sendiri
using System;
using Finance;
class Program
{
public static void Main(string[] args)
{
// Baca input
decimal initialAmount = Convert.ToDecimal(Console.ReadLine());
string initialCurrency = Console.ReadLine();
decimal amountToAdd = Convert.ToDecimal(Console.ReadLine());
decimal conversionRate = Convert.ToDecimal(Console.ReadLine());
// TODO: Buat object Money awal dengan jumlah dan mata uang awal
// TODO: Tampilkan uang asli menggunakan GetDisplay()
// TODO: Panggil Add() pada object asli dan simpan hasilnya dalam variabel baru
// TODO: Tampilkan hasil setelah penambahan menggunakan GetDisplay()
// TODO: Tampilkan uang asli lagi untuk membuktikan nilainya tidak berubah
// TODO: Konversi hasil penambahan ke EUR menggunakan nilai tukar
// TODO: Tampilkan uang yang sudah dikonversi menggunakan GetDisplay()
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online