Property adalah tempat class menyimpan datanya — padanan field pada struct, tetapi dengan kekuatan ekstra: nilai default otomatis, validasi, konstanta, dan nilai yang dihitung on-the-fly. Kekuatan-kekuatan ini menentukan mutu encapsulation: property yang dirancang baik tidak pernah berisi nilai tak masuk akal. Pada chapter ini kita membangun class Suhu yang menyimpan suhu dalam Celsius lalu menghitung Fahrenheit dan Kelvin secara otomatis. Cakupan materi:

  • deklarasi property dan nilai default
  • dua jalur validasi: sintaksis validasi property dan validasi manual
  • atribut Constant dan Dependent
  • accessor get.Properti dan set.Properti

Properties dan Nilai Default #

Aturannya: setiap property dideklarasikan dengan nama di dalam blok properties, dan boleh langsung diberi nilai default. Mekanisme di balik layar: setiap kali object diinstansiasi, MATLAB menyiapkan salinan property lengkap dengan nilainya — object baru tidak pernah berisi “sampah” seperti variabel yang belum diisi. Nilai default harus berupa konstanta atau ekspresi yang bisa dievaluasi saat class dimuat.

matlab
classdef Sensor
    properties
        lokasi = 'gudang'
        bacaan = 0
    end
end
matlab
>> s = Sensor()
text
s =

  Sensor with properties:

    lokasi: 'gudang'
    bacaan: 0

Property tanpa nilai default berawalan [] — praktik yang baik adalah mengisi semua property yang relevan agar object langsung berada dalam keadaan valid.

Validasi Nilai Property #

MATLAB (R2019b ke atas) menyediakan sintaksis validasi property yang ditempelkan langsung pada deklarasi — satu baris memuat ukuran, kelas, validator, dan nilai default:

matlab
properties
    celsius (1,1) double {mustBeGreaterThan(celsius, -273.15)} = 25
end

Anatomi deklarasi tersebut, dibaca dari kiri ke kanan:

BagianContohPeran
nama propertycelsiusidentifier yang diakses lewat obj.celsius
ukuran(1,1)dimensi yang diharapkan; : berarti bebas
kelasdoubletipe yang diterima (atau bisa dikonversi)
validators{mustBeGreaterThan(...)}pemeriksa tambahan dalam kurung kurawal
nilai default= 25dipakai bila constructor tidak mengisi

Jalur manual bekerja lewat accessor: setiap assignment obj.celsius = nilai yang sah diarahkan MATLAB ke method set.celsius(obj, nilai) milik class — di sanalah kita meletakkan pemeriksaan isnumeric, isscalar, dan batas nilai, lalu menolak pelanggaran dengan error(). Constructor yang mengisi property juga melewati accessor yang sama, sehingga aturan berlaku sejak object pertama kali dibuat.

Constant: Konstanta Milik Class #

Atribut Constant = true menjadikan property konstanta: nilainya milik class, tidak per object, dan dibaca tanpa perlu instansiasi — cukup NamaClass.NamaProperti. Konstanta cocok untuk nilai fisik, batas, atau pengaturan yang sama untuk semua instance:

matlab
classdef Suhu
    properties (Constant = true)
        NOL_MUTLAK = -273.15   % derajat Celsius
    end
    % ... property dan method lain menyusul pada contoh lengkap
end

Mekanismenya: nilai konstanta dievaluasi sekali saat class dimuat; seluruh object membaca nilai yang sama dari definisi class. MATLAB menolak assignment ke property Constant dengan galat — konstanta memang tidak boleh ditimpa dari luar maupun dari dalam class. Pada class Suhu, konstanta ini dipakai baik sebagai batas validasi (celsius >= NOL_MUTLAK) maupun sebagai titik nol perhitungan Kelvin.

Dependent Properties dan Accessor get #

Beberapa nilai sebaiknya tidak disimpan karena selalu bisa dihitung dari data lain — menyimpannya membuka risiko tidak sinkron (Celsius diubah, Fahrenheit tertinggal). Atribut Dependent = true menyelesaikannya: property bertanda dependent tidak menyimpan nilai; setiap pembacaan obj.fahrenheit memanggil accessor get.fahrenheit(obj) yang menghitung hasil saat itu juga.

matlab
properties (Dependent = true)
    fahrenheit
    kelvin
end

methods
    function f = get.fahrenheit(obj)
        f = obj.celsius * 9/5 + 32;
    end
end

Mekanisme di balik layar: obj.fahrenheit berhenti di accessor get, rumus dijalankan, hasil dikembalikan ke pemanggil — memori object hanya menyimpan celsius. Pasangan get/set seperti ini adalah tempat validasi manual bermalam: set.celsius memeriksa nilai masuk, get.fahrenheit menghitung nilai turunan. Property dependent juga menolak assignment dari luar — menulis obj.fahrenheit = 100 tidak bermakna karena tidak ada penyimpanan di belakangnya.

Contoh Lengkap: Class Suhu #

Class Suhu menggabungkan seluruh fitur: konstanta NOL_MUTLAK, property tersimpan celsius, dua property dependent, serta accessor set yang memvalidasi:

matlab
classdef Suhu
    %SUHU Suhu dengan konversi otomatis ke Fahrenheit dan Kelvin.
    properties (Constant = true)
        NOL_MUTLAK = -273.15   % derajat Celsius
    end
    properties
        celsius = 25
    end
    properties (Dependent = true)
        fahrenheit
        kelvin
    end
    methods
        function obj = Suhu(c)
            if nargin > 0
                obj.celsius = c;   % melewati set.celsius -> tervalidasi
            end
        end
        function obj = set.celsius(obj, nilai)
            if ~isnumeric(nilai) || ~isscalar(nilai) || ...
                    nilai < Suhu.NOL_MUTLAK
                error('Suhu:celsiusTidakValid', ...
                    'celsius harus skalar >= %g (nol mutlak).', ...
                    Suhu.NOL_MUTLAK);
            end
            obj.celsius = nilai;
        end
        function f = get.fahrenheit(obj)
            f = obj.celsius * 9/5 + 32;
        end
        function k = get.kelvin(obj)
            k = obj.celsius - Suhu.NOL_MUTLAK;
        end
    end
end

Mari kita bedah baris-baris kode di atas:

  1. Baris 3-5 (properties (Constant = true)): konstanta dibaca sebagai Suhu.NOL_MUTLAK tanpa object — dipakai sebagai batas validasi dan titik nol Kelvin.
  2. Baris 6-8 (celsius = 25): satu-satunya data tersimpan; nilai defaultnya suhu ruang yang wajar.
  3. Baris 9-12 (properties (Dependent = true)): fahrenheit dan kelvin dideklarasikan tanpa nilai — keduanya dihitung, bukan disimpan.
  4. Baris 19-27 (set.celsius): gerbang validasi — tiga syarat (numerik, skalar, di atas nol mutlak) diperiksa sebelum obj.celsius ditimpa; constructor di baris 16 juga melewati gerbang ini.
  5. Baris 28-33 (get.fahrenheit, get.kelvin): rumus konversi dijalankan setiap kali property dependent dibaca, sehingga Celsius dan Fahrenheit tidak pernah berbeda pendapat.

Skrip uji_Suhu.m menguji nilai default, tiga titik suhu fisik, konstanta class, dan penolakan input di bawah nol mutlak:

matlab
% uji_Suhu.m - menguji class Suhu
s = Suhu();
fprintf('default      : %g C | %g F | %g K\n', ...
    s.celsius, s.fahrenheit, s.kelvin);

s = Suhu(100);
fprintf('air mendidih : %g C | %g F | %g K\n', ...
    s.celsius, s.fahrenheit, s.kelvin);

s = Suhu(-40);
fprintf('titik sama   : %g C | %g F\n', s.celsius, s.fahrenheit);

s.celsius = 37;   % assignment lewat set.celsius
fprintf('suhu badan   : %g C | %g F | %g K\n', ...
    s.celsius, s.fahrenheit, s.kelvin);

fprintf('konstanta    : Suhu.NOL_MUTLAK = %g\n', Suhu.NOL_MUTLAK);

try
    s = Suhu(Suhu.NOL_MUTLAK - 10);
catch err
    fprintf('ditolak      : %s\n', err.message);
end

Output yang Dihasilkan:

text
default      : 25 C | 77 F | 298.15 K
air mendidih : 100 C | 212 F | 373.15 K
titik sama   : -40 C | -40 F
suhu badan   : 37 C | 98.6 F | 310.15 K
konstanta    : Suhu.NOL_MUTLAK = -273.15
ditolak      : celsius harus skalar >= -273.15 (nol mutlak).

Baris “titik sama” memperlihatkan keuntungan dependent property: -40 adalah satu-satunya suhu yang bernilai sama dalam Celsius dan Fahrenheit — kita tidak perlu menyimpan dua angka untuk membuktikannya.

Ringkasan #

Property dideklarasikan dalam blok properties dengan nilai default yang otomatis terpasang pada setiap object baru. Validasi nilainya punya dua jalur: sintaksis property (1,1) double {mustBe*} = default (MATLAB R2019b+, MATLAB-ONLY) atau validasi manual dalam accessor set.Properti yang juga disusuri constructor. Atribut Constant menyediakan konstanta tingkat class yang dibaca sebagai NamaClass.Properti, sedangkan Dependent menandai property yang dihitung accessor get.Properti setiap kali dibaca — penyimpanan tunggal, tanpa risiko tidak sinkron. Berkas Suhu.m dan uji_Suhu.m di bagian bawah halaman memuat class lengkap yang sudah teruji.