Mengapa kita membuat class
16 Dec 2014Ada pertanyaan di grup Facebook yang cukup menarik untuk kita bahas di sini. Sample code yang ditanyakan saya modifikasi sedikit supaya lebih cocok.
Class Mahasiswa
public class Mahasiswa {
private String nama;
private Date tanggalLahir;
private JenisKelamin jenisKelamin;
// getter setter
}
public enum JenisKelamin{
PRIA, WANITA
}
Class SimpanMahasiswaServlet
public class SimpanMahasiswaServlet extends HttpServlet {
private MahasiswaDao md = new MahasiswaDao();
public void doPost(HttpServletRequest req, HttpServletResponse resp){
Mahasiswa m = new Mahasiswa();
m.setNama(req.getParameter("nama"));
SimpleDateFormat formatTanggal = new SimpleDateFormat("yyyy-MM-dd");
m.setTanggalLahir(formatTanggal.parse(req.getParameter("tanggal")));
m.setJenisKelamin(JenisKelamin.valueOf(req.getParameter("jenis")));
md.simpan(m);
}
}
Class MahasiswaDao
public class MahasiswaDao {
public void simpan(Mahasiswa m){
String sql = "INSERT INTO mahasiswa values (?,?,?)";
PreparedStatement ps = koneksi.prepareStatement(sql);
ps.setString(1, m.getNama());
ps.setDate(2, new java.sql.Date(m.getTanggalLahir().getTime()));
ps.setString(3, m.getJenisKelamin().name());
ps.executeUpdate();
}
}
Pertanyaan : Lebih kenceng mana contoh kode di atas (menggunakan class Mahasiswa) dibandingkan langsung saja pakai Map/Array ?
Supaya lebih jelas, berikut contoh yang pakai array.
public class SimpanMahasiswaServlet extends HttpServlet {
private MahasiswaDao md = new MahasiswaDao();
public void doPost(HttpServletRequest req, HttpServletResponse resp){
String[] m = new String[3];
m[0] = req.getParameter("nama");
m[1] = req.getParameter("tanggal");
m[2] = req.getParameter("jenis");
md.simpan(m);
}
}
Class MahasiswaDao
public class MahasiswaDao {
public void simpan(String[] m){
String sql = "INSERT INTO mahasiswa values (?,?,?)";
PreparedStatement ps = koneksi.prepareStatement(sql);
for(int i=0; i<m.length; m++){
ps.setString(i, m[i]);
}
ps.executeUpdate();
}
}
Pembuatan class Mahasiswa
di atas merupakan salah satu implementasi prinsip encapsulation
dalam OOP. Class Mahasiswa
disebut dengan istilah domain class, yaitu class yang dibuat untuk memodelkan kasus yang akan dibuat.
Jawaban : gak usah mikirin kenceng dulu. Soalnya pakai Array/Map itu salah. Buat apa aplikasi salah dibikin kenceng?
Kenapa salah?
- Susah dipahami
- Tidak bisa pakai library pihak ketiga
- Menyia-nyiakan dukungan tipe data yang sudah disediakan Java
Source code susah dipahami
Bayangkan kita lagi mau ngisi variabel di Netbeans/Eclipse.
Mahasiswa m = new Mahasiswa();
g. <-- Ctrl-Spasi autocomplete, keluar pilihan setNama, setTanggalLahir, dsb
Lebih gampang mana dipahami daripada seperti ini
String[] m = new String[3];
m <-- gak bisa Ctrl-Spasi, gak keluar pilihan apa-apa
Kalau seandainya ada programmer baru masuk, lebih besar mana kemungkinan melakukan kesalahan ini
m.setNama(req.getParameter("jenis"));
atau ini
m[0] = req.getParameter("tanggal");
Tidak bisa menggunakan library pihak ketiga
Semua baris untuk set nilai di SimpanMahasiswaServlet
itu bisa diotomasi pakai Spring MVC. Semua baris untuk get isinya dan simpan ke db di MahasiswaDao
bisa diotomasi pakai Hibernate.
Bila suatu saat kita ingin konversi objek Mahasiswa
menjadi JSON, kita bisa dengan mudah melakukan ini
Mahasiswa m = new Mahasiswa();
// isi nama, tanggal lahir, jenis kelamin
ObjectMapper om = new ObjectMapper();
String json = om.writeValue(m);
Nah, coba lakukan hal di atas pakai array. Mana bisa?
Hal yang sama berlaku kalau mau konversi ke XML menggunakan JAXB.
Menyia-nyiakan fitur yang sudah disediakan
Kalau kita bikin class Mahasiswa, kita bisa bikin nama itu String, jenis kelamin Enum, tanggal lahir Date. Dengan pakai tipe data, kalau salah entri langsung ketahuan error pada saat ngetik source code. Kalau gak pake itu, pas dijalanin baru ketahuan.
Sebagai contoh, error ini langsung ketahuan di Eclipse/Netbeans, atau pada waktu compile (kalau pakai Notepad++)
Mahasiswa m = new Mahasiswa();
// bakalan error karena tipe data tanggalLahir adalah Date, bukan String
m.setTanggalLahir(req.getParameter("nama"));
Kalau pakai array, tidak akan ketahuan
String[] m = new String[3];
// gak error karena sama-sama String
m[1] = req.getParameter("nama");
Kesimpulan
Prioritas utama dalam menulis kode program adalah sebagai berikut:
- Benar (correctness)
- Mudah dipahami (readability)
- Mudah dikembangkan (maintainability)
- Performance
Nah, jadi jangan pagi-pagi udah mikir performance dengan mengorbankan 3 hal diatasnya ya ;)