Mengirim Variabel ke Kelas Lain di Java

Bahasa Java memiliki istilah-istilah rumit terutama ditujukan untuk pemrograman berorientasi objek. Konsep objek dengan prinsip enkapsulasi (information hiding) memerlukan perlakuan khusus dalam membuat programnya. Contoh-contoh kode yang beredar di internet, terutama yang menggunakan basis data relational terkadang tidak menerapkan prinsip enkapsulasi ini. Untuk mempraktekannya ada baiknya dimulai dari yang dasar dulu yaitu konstruktor.

Konstruktor

Sebuah kelas merupakan cetakan (template) suatu objek tertentu. Misal seorang siswa memiliki atribut tertentu seperti kode dan nama serta metode/operasi seperti membaca data, memasukan data siswa baru, menghapus data siswa, dan sejenisnya. Jika sebuah objek baru terbentuk maka data baru harus mengikuti pola kelas Siswa tersebut yang terdiri dari atribut dan metode/operasi.

Pada Netbeans, kelas Siswa dapat dilihat di jendela navigator. Tampak atribut di bawah dan lingkaran yang menyatakan metode. Belah ketupat menyatakan metode yang masuk kategori konstruktor, yang berfungsi membuat satu objek baru.

Konstruktor Siswa(String k, String n) berfungsi membuat satu objek dengan atribut k dan n yang kemudian dikonversi menjadi variabel lokal (this.kodesiswa dan this.nama).

  • public Siswa(String k, String n){
  • this.kodesiswa=k;
  • this.nama=n;
  • }

Ketika kelas lain meminta menjalankan satu metode/operasi maka diperlukan objek baru yang dibentuk dari konstruktor. Misalkan menggunakan kelas Main yang biasanya secara default muncul di tiap project.

Getter & Setter

Objek “mhs” baru dibentuk lewat konstruktor Siswa yang menangkap kode “009” dan nama”Dr. Rahmadya Trias H.”. Ditangkap lewat mekanisme setter & getter. Ketika diketik “mhs.” Pastikan muncul operasi-operasi yang tersedia, jika tidak maka konstruktor bermasalah. Misal kita pilih metode “greetings()” yang sebelumnya di kelas Siswa telah diisi, misalnya sbb:

  • public void greetings(){
  • System.out.println(“Hai, salam kenal, saya ” +this.nama);
  • }

Jika dijalankan akan menjalankan metode “greetings()” dengan parameter yang dikirim “009” dan “Dr. Rahmadya Trias H.” untuk digunakan mengoperasikan tulisan (di sini yang digunakan hanya this.nama saja).

Membuat CRUDE Matrix

CRUDE singkatan dari Create, Read, Update, dan Execute. CRUD tanpa E biasa digunakan oleh pemrograman terstruktur, sementara Execute ditambahkan untuk Objek oriented yang artinya proses selain CRUD, misalnya membuat tampilan tertentu, perhitungan-perhitungan, validasi, dan lain-lain. CRUDE matrix biasanya dibuat dari Use Case diagram di tahapan analisa.

Berikut ini contoh pembuatan CRUDE matrix. Perhatikan aktor yang terlibat bisa juga berupa kelas, biasanya diberi simbol <<class>>, kadang tidak muncul pada Use Case diagram.

Kandidat aktor: Doctor, Management, New Patient, Old Patient. Aktor “Patient” menwakili New dan Old Patient.

Kandidat kelas:

Baik management dan Doctor mengelola jadwal (Manage Schedule). Ada kelas Jadwal (Schedule). Kelas New Patient butuh kelas Patient. Baik kelas New dan Old Patient mengajukan jadwal (appointment). Kelas Doctor perlu dibuat untuk penjadwalan.

CRUDE Matrix

Berikut CRUD Matrix sementara yang bisa berubah pada fase/tahap berikutnya.

Kelas-kalas: Management, Doctor, Patient, Appointment, Schedule

 

Management

Doctor

Patient

Appointment

Schedule

Management

 

C,R,U,D

C,R,U,D

R,E

C,R,U,D

Doctor

       

C,R,U,D

Patient

     

C,U

 

Appointment

         

Schedule

         

 

Training, Validating, Testing dan Corpus

Empat kata di atas, terutama tiga pertama merupakan istilah yang banyak disebut dalam literatur machine learning. Sementara yang keempat, Corpus, muncul belakangan ketika banyaknya pihak-pihak yang berkontribusi dengan membagikan file big data yang dimilikinya. Postingan kali ini sedikit menambah penjelasan mengenai penggunaan istilah-istilah di atas.

Training

Istilah ini merupakan pengkhususan dari arti sebenarnya: pelatihan/pembelajaran. Teringat ketika presentasi hasil penelitian di kampus yang dihadiri oleh beragam bidang ilmu. Salah satu peserta dari fakultas agama Islam memprotes manfaat dari training yang katanya tidak perlu karena menghambur-hamburkan dana. Peserta dari fakultas teknik, terutama jurusan informatika, hanya bisa tersenyum karena maklum istilah training di penelitian itu adalah proses melatih model agar diperoleh parameter yang tepat, bukan pelatihan berupa kursus, workshop, dan sejenisnya. Diperlukan data yang disertai dengan label dalam proses training ini. Banyak metode yang digunakan, biasanya backpropagation dengan turunannya gradient descent atau levenberg marquardt (LM). Data training ini dikenal dengan istilah training set.

Validating

Jika training membutuhkan data beserta label agar diperoleh parameter yang tepat, misalnya untuk jaringan syaraf tiruan (JST) berupa bobot dan bias, validating berisi data beserta label pula yang dimaksudkan untuk menguji hasil training apakah sudah akurat atau belum. Jika beruntung, hasil validasi akurat, biasanya di atas 75%. Jika belum harus di-training ulang. Data untuk validasi biasanya sebagian data training. Istilah data untuk validasi adalah development set, held-out set, atau validation set. Terkadang sebagian data training dipakai untuk validasi, kemudian secara bergantian yang tadinya buat training menjadi testing, yang dikenal dengan istilah cross validation.

Testing

Data testing atau dikenal dengan istilah testing set wajib dijalankan setelah validasi. Fungsinya membuktikan apakah model sudah sesuai dalam artian akurat di validasi dan akurat juga di kenyataannya. Data yang digunakan untuk testing merupakan data real yang tidak digunakan untuk training. Tentu saja tidak “fair” menggunakan data training untuk testing, ibarat ujian, soal yang diujikan diberitahu terlebih dahulu.

Corpus

Corpus merupakan kumpulan data spesifik. Jamaknya dikenal dengan nama Corpora. Data ini biasanya digunakan untuk testing yang berasal dari lembaga yang bersedia men-share untuk pembelajaran bersama, misalnya data aeronatika, video, suara, gambar, dan lain-lain. Jika Anda menginstal Python, disertakan juga Corpora secara opsional, karena memang ukurannya yang besar. Tentu saja Corpus ini dipergunakan biasanya untuk pengujian metode/algoritma apakah akurat atau tidak. Sementara untuk data spesifik tertentu, misal pengambilan keputusan kredit bank, pemberian beasiswa, penyetujuan proposal, perlu mencari data real yang ada jika tidak ada yang men-share karena memang data tersebut khusus/spesifik dimana tiap institusi/lokasi/objek penelitian berbeda-beda karakteristiknya. Yuk, yang punya data, bagi-bagi, untuk membantu riset teknologi informasi, terutama yang punya data bidang kesehatan.

Analisa dan Disain Sistem Berorientasi Objek

Pemrograman Berorientasi Objek (PBO) dalam proses perancangan sistemnya tidak berbeda dengan pemrograman terstruktur dan dapat menggunakan metode yang sama. Hanya saja karena ciri khas PBO yang tidak membedakan proses dan data maka ada sedikit sudut pandang yang berbeda dalam perancangannya. Tiga tokoh penggagas Unified Modeling Language (UML) yaitu Grady Booch, Ivar Jacobson, dan James Rumbaugh sepakat dalam perancangan sistem modern harus berbasis: Use Case Driven, fokus ke arsitektur sistem (Architecture-centric), dan iteratif & inkremental.

Use Case Driven

Use Case Driven artinya adalah Use Case sebagai pemodelan utama dalam perancangan sistem. Model Use Case menggambarkan hubungan antara pengguna dengan sistem dalam melakukan aktifitas tertentu seperti pemesanan barang, penyewaan, mencari informasi tertentu, dan lain-lain. Use Case Driven berbeda dengan pemodelan tradisional maupun Rapid Application Development (RAD) yang kompleks. Kompleksitas metode tradisional tersebut karena harus melibatkan baik analis maupun pengguna dimana sistem dipecah menjadi subsistem hingga tidak bisa dipecah lagi dalam analisanya. Diagram menjadi rumit karena saling terkait antara satu diagram dengan diagram lainnya yang jumlahnya banyak. Sementara itu Use Case hanya berfokus pada satu proses bisnis dalam satu waktu dan membuat proses menjadi lebih sederhana.

Fokus ke Arsitektur Sistem

Arsitektur bisa bermacam-macam artinya, tergantung dari sudut pandang tertentu. Dari sudut pandang PBO dengan standar UML-nya arsitektur merupakan aspek keseluruhan dari organisasi sistem. Aspek tersebut melandasi komponen-komponen arsitektur sistem yang terdiri dari fungsionalitas, struktur, dan proses (function, static, & behaviiour). Selain itu arsitektur juga mengatasi permasalahan performa, skalabilitas, reuse, dan batasan-batasan ekonomi dan teknis.

Secara garis besar arsitektur dapat dilihat dari sisi eksternal (pengguna) yaitu berupa fungsi-fungsi. Selain itu dilihat juga dari sisi internal berupa atribut, metode, dan kelas-kelas . Arsitektur juga melibatkan relasi antar objek yang melibatkan pesan-pesan untuk menjalankan fungsi tertentu.

Iteratif dan Inkremental

PBO menerapkan metode pengembangan sistem berupa iterasi dan inkremental. Metode ini mengembangkan tiga sudut pandang arsitektur (fungsi, statis, dan proses) secara berulang. Setelah testing, perancang kembali lagi ke awal untuk penyempurnaan. Dalam merancang, perancang mengembangkan sedikit demi sedikit, dari sistem sederhana menuju sistem yang lebih besar dan kompleks. Tiap iterasi pengembang selalu berhubungan dengan pengguna dalam merancang fungsi-fungsi yang diperlukan. Jadi struktur dan fungsi harus dikuasai oleh pengembang agar diperoleh sistem yang baik. Pengembang juga dapat menambahkan kebutuhan-kebutuhan fungsi yang tidak disadari oleh pengguna.

Relasi One-To-Many Pada Objek Database

Untuk mengimplementasikan relasi one-to-many pada pemrograman terstruktur dengan sistem basis data relasional diperlukan sebuah tabel detil karena dalam satu field tidak boleh berisi lebih dari satu item. Namun pada pemrograman berorientasi objek dapat dihandel oleh sebuah kelas dengan format atribut array. Misalnya kelas kursus yang berisi lebih dari satu peserta kursus berikut ini.

Salah satu atribut kursus adalah peserta yang merupakan sebuah objek dari kelas siswa. Simbol kurung “[]” menandakan bahwa kelas Kursus bisa memiliki lebih dari satu objek peserta kursus, yang dalam ERD sistem relasional dikenal dengan relasi one-to-many. Bagaimana dalam implementasinya di Netbeans?

Memakai Atribut dari Kelas Lain

Pada kelas kursus terdapat atribut “peserta” yang berasal dari kelas Siswa. Karena menggunakan atribut maka terdapat relasi memiliki dari kelas Kursus terhadap kelas Siswa, diistilahkan dengan relasi “has-a”. Bandingkan dengan relasi antara kelas Main dengan Kursus yang berupa penggunaan saja (mengatur/maintain kursus), diistilahkan dengan relasi “is-a”. Berikut potongan kode dalam bahasa Java untuk kelas yang menggunakan objek dari kelas Siswa (peserta).

public class Kelas {
private String kode,jadwal;
private Siswa[] peserta;
private int i;
//konstruktor
public Kelas(){
this.peserta=new Siswa[5];
}
public Kelas(String kode, String jadwal, Siswa[] peserta){
this.kode=kode;
this.jadwal=jadwal;
this.peserta=peserta;
}

Perhatikan variabel peserta diambil dari kelas Siswa (private Siswa[] peserta). Selanjutnya ditambah dengan setter & getter serta operasi-operasi lainnya. Pada konstruktor kelas misalnya dibatasi lima peserta kurus saja (this.peserta=new Siswa[5];). Operasi penting untuk menangkap data objek Kelas adalah sebagai berikut.

public void add(Siswa s){
if(i<peserta.length){
peserta[i]=s;
System.out.println(“Siswa add at index “+i);
i++;
}
System.out.println(“Peserta: “+peserta);
}
public void add3(String jadwal){
this.jadwal=jadwal;
}
public void add2(String kode){
this.kode=kode;
}

Peserta kursus memanfaatkan variabel I untuk menambah beberapa kali (dalam hal ini max 5). Operasi lainnya juga disertakan untuk menambahkan kode kelas dan jadwalnya. Jika dilihat di navigation pada Netbeans tampak seperti berikut ini.

Dua operasi CRUD (insertData dan readData) misalnya dimasukan. Sebaiknya seluruh CRUD dimasukan juga (update dan delete). Variabel I: int digunakan untuk memasukan peserta kursus yang lebih dari satu.

Kelas Siswa seperti biasa dibuat dengan atribut dan operasi tertentu. Buat CRUD yang lengkap seperti contoh berikut. Untuk akses ke basis data objek dengan operasi CRUD silahkan lihat pos yang lalu.

Kelas Main

Kelas ini hanya contoh interface untuk mendaftarkan kelas beserta pesertanya. Dalam implementasi biasanya menggunakan form/frame.

ObjectContainer db = Db4oEmbedded.openFile(“C:/Users/Herlawati/Documents/NetBeansProjects/com.kursus/kursus.yap”);
Kelas kel = new Kelas();
//siswa pertama
Siswa sis = new Siswa();
sis.setKodesiswa(“03”);
ObjectSet<Object> result = db.queryByExample(sis);
Siswa m1 = (Siswa) result.next();
System.out.println(“ketemu siswa nama: “+m1.getNama()+” kode “+m1.getKodesiswa());
System.out.println(m1);
kel.add(m1);
//siswa kedua
Siswa sis2 = new Siswa();
sis2.setKodesiswa(“04”);
ObjectSet<Object> result2 = db.queryByExample(sis2);
Siswa m2 = (Siswa) result2.next();
System.out.println(“ketemu siswa nama: “+m2.getNama()+” kode “+m2.getKodesiswa());
System.out.println(m2);
kel.add(m2);
//input atribut Kelas
kel.add3(“senin dan selasa”);
kel.add2(“kode3”);
db.close();
kel.insertData();
kel.readData();

Ada satu Kelas dengan dua peserta ditambahkan dengan kode di atas, pastikan ketika dieksekusi akan menghasilkan jawaban yang mengindikasikan data tersimpan.

Siswa dengan kode 03 dan 04 dicari terlebih dahulu dari kelas Siswa. Tentu saja sudah dimasukan terlebih dahulu beberapa objek Siswa. Fungsi Add akan memasukan siswa secara multivalue ke objek Kelas. Setelah atribut kelas (jadwal dan kode kelas) ditambahkan (operasi add2 dan add3) maka operasi insertData akan memasukan objek Kelas yang baru saja didaftarkan secara permanen ke sistem basis data objek. Butuh penjelasan yang detil, tetapi secara garis besar langkah-langkah di atas bermaksud menjelaskan prinsip kerja objek, baik instan (temporer) maupun persistence (permanen). Semoga bermanfaat.

Membuat Kelas Transaksi dengan Basis Data Objek

Mirip dengan tabel master dan tabel transaksi pada basis data relasional, pada pemrograman berorientasi objek membutuhkan juga tabel transaksi yang melibatkan lebih dari dua tabel. Sebagai contoh adalah mahasiswa yang mendaftarkan kelas yang diikutinya lewat kelas registrasi. Di sini kelas registrasi memerlukan kelas Mahasiswa dan kelas Kelas yang diikuti. Berikut kode untuk membuat kelas Kelas.

public class Kelas {
String kodemk;
String namamk;
int sks;
public Kelas(String kodemk, String namamk, int sks){
this.kodemk=kodemk;
this.namamk=namamk;
this.sks=sks;
}
public void display(){
System.out.println(“Kode MK: “+kodemk+”| Nama MK: “+namamk+” | Jlh SKS: “+sks+”SKS”);
}
}

Seperti biasa tiap kelas memiliki nama, atribut dan operasi. Karena hanya sebagai latihan, pada kelas ini tidak dimasukan kelas untuk operasi create, read, update and delete (CRUD). Hanya operasi display yang disertakan untuk memunculkan atribut-atribut kelas Kelas antara lain: kodemk, namamk, dan sks yang berturut-turut bertipe string, string, dan integer.

Dengan cara yang sama kita bisa membuat kelas Mahasiswa dengan atribut: nama, usia, dan jurusan. Tentu saja hanya sekedar contoh, karena biasany membutuhkan juga nomor pokok mahasiswa (NPM), alamat, ipk, dan lain-lain. Lanjut saja ke bagian penting, yaitu kelas Registrasi yang berfungsi mengakomodir Mahasiswa yang medaftarkan kelas mata kuliah tertentu. Berikut kode pada kelas Registrasi yang dibuat cepat dengan IDE Netbeans 8.

public class Registrasi {
private String noreg;
Mahasiswa m;
Kelas kls;
public Registrasi(String noreg, Mahasiswa m, Kelas kls){
this.noreg=noreg;
this.m=m;
this.kls=kls;
}
public void display(){
System.out.println(“No Reg: “+noreg);
kls.display();
m.display();
}
public void insertData() {
System.out.println(“* Insert data…”);
ObjectContainer db;
db = Db4oEmbedded.openFile(“<folder>/mahasiswadb.yap”);
try {
Registrasi reg = new Registrasi(noreg,m,kls);
db.store(reg);
System.out.println(“Stored “+reg);
}
finally {
db.close();
}
}
}

Kelas Registrasi ini memiliki atribut: noreg, m, dan kls yang merepresentasikan berturut-turut nomor registrasi, mahasiswa dan kelas. Ada operasi display() yang berisi display dari kelas yang terlibat (Mahasiswa dan Kelas). Satu kelas penting lainnya adalah insertData() yang menyimpan data objek registrasi ke basis data agar tersimpan secara permanen (persistence). Terakhir di kelas Main masukan kode contoh berikut.

public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Mahasiswa m = new Mahasiswa(“Rahmadya”,43,”Teknik Komputer”);
Kelas kls = new Kelas(“FIS-1″,”Fisika”,3);
Registrasi reg = new Registrasi(“01/mei/2019”,m,kls);
reg.display();
reg.insertData();
}
}

Pertama-tama objek mahasiswa dibentuk dengan atributnya lengkap. Demikian pula objek Kelas yang berisi kode kelas, nama kelas dan jumlah SKS. Terakhir objek registrasi yang berisi nomor registrasi beserta objek yang terlibat (diberi nama variabel m dan kls) dibentuk. Objek registrasi selain ditampilkan lewat operasi display() juga disimpan ke basis data lewat operasi insertData(). Jika dijalankan dengan menekan tombol segitiga hijau akan menghasilkan output di bawah ini.

Coba buka file basis data objek “mahasiswadb.yap” dengan notepad dan pastikan terisi objek yang baru saja disimpan lewat instruksi db.store(reg) di atas.

Postingan ini menggunakan Netbeans dengan Object Database Management System (ODBMS) DB4O yang masih jarang digunakan. Biasanya pengembang menggunakan kelas dan objek yang disimpan dalam Relational Database Management System (RDBMS). Silahkan searching ebook tentang DB4O yang banyak beredar di internet. Untuk buku sejenis yang berbahasa Indonesia saya masih mencoba menulis, semoga segera selesai

Problem CRUD pada Pemrograman Berorientasi Objek

Problem Create, Read, Update, dan Delete (CRUD) pada PBO dikenal dengan istilah impedance mismatch. Hal ini terjadi karena pemrograman terstruktur dengan karakternya yang menggunakan database relasional menggunakan prinsip pemisahan antara data dengan program. Sementara itu PBO dalam satu kelas memadukan data dan program. Dalam hal ini data berupa atribut, sementara programnya berupa method/operasi. Kontroversi kerap terjadi, biasanya untuk programmer-programmer yang biasanya menangani program-program nonobjek, yang menganjurkan CRUD terpisah dari kelas-nya (lihat di sini). Terutama yang sering menggunakan framework maupun bertipe service oriented architecture (SOA), cenderung memasukan CRUD ke layer service. Atau programmer yang menerapkan Object Relational Database Management System (ORDBMS).

Gambar berikut dikutip dari sumber materi PBO link ini. Tampak pada kelas Customer, kelas ini memiliki operasi bernama +add(name,phone) yang bertugas memasukan pelanggan baru. Operasi yang berada dalam sebuah kelas sebenarnya memperkuat konsep PBO yaitu encapsulation dimana kelas lain tidak bisa mengutak-atik kelas tertentu. Untuk menambah pelanggan, dalam kelas Customer harus lewat operasi +add pada kelas tersebut, tidak seperti database relasional yang menggunakan akses dari luar lewat injeksi SQL (insert into Customer).

Jadi sejatinya CRUD pada objek terletak di bagian operasi kelas yang bersangkutan, jika ingin prinsip encapsulation tetap dipegang. Hal ini bisa dijalankan untuk Object Database Management System (ODBMS) murni dengan basis data objek seperti DB4O (lihat pos yang lalu) atau tipe no-sql seperti MongoDB. Interface yang mengirimkan data yang harus diubah pada PBO hanya berupa pesan (message), misalnya pada diagram kelas di atas ingin menambah satu pelanggan baru maka interface yang biasanya form/frame memberikan pesan ke kelas Customer agar menjalankan operasi +add(name,phone) untuk menambah satu data pelanggan baru dengan name dan phone tertentu (dari isian form/frame). Mungkin pembaca tidak setuju, boleh saja, toh antara konsep PBO dengan terstruktur termasuk antara database relasional dan objek pun bisa dikombinasikan. Terkadang antara teori dengan aplikasi/penerapan perlu kompromi.