Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class Money yang immutable di namespace Finance. Uangmu harus memiliki:
    • Dua field readonly: Amount (decimal) dan Currency (string)
    • Constructor yang menetapkan kedua nilai. Setelah dibuat, object Money tidak akan pernah bisa berubah
    • Method Add(decimal value) yang mengembalikan object Money baru dengan jumlah yang bertambah, menggunakan mata uang yang sama
    • Method Subtract(decimal value) yang mengembalikan object Money baru dengan jumlah yang berkurang, menggunakan mata uang yang sama
    • Method Convert(string newCurrency, decimal rate) yang mengembalikan object Money baru dengan jumlah yang dikalikan dengan nilai tukar dan mata uang baru
    • Method GetDisplay() yang mengembalikan string dalam format "{Amount} {Currency}"
    Ingat: tidak satu pun method ini boleh mengubah object aslinya. Semuanya mengembalikan instance Money yang benar-benar baru!
  • Program.cs: Di file utama, tunjukkan cara kerja immutability. Buat object Money awal, 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 EUR

Perhatikan 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()
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C# online