Selasa, 12 Oktober 2010

Object Inheritance (Bagian 2 - Akhir)

Pada bagian 1 kita telah sebuah super class dan 5 sub class yakni Hippo, Dog, Tiger, Cat, dan Lion. Jika kita melihat class Dog, Tiger, Cat dan Lion maka kita melihat bahwa ke 4 class tersebut memiliki method eat() yang  melakukan fungsi yang sama.
Langkah #3 : Cermati ulang peluang untuk abstraksi yang baru dengan menentukan dua class atau lebih yang memiliki Behavior yang sama.
Dari analisa diatas kita dapat mengetahui bahwa Cat, Lion, Tiger dan Dog dapat di kelompokan menjadi sebuah kelompok class yang baru yakni Carnivora, sedangkan Hippo dapat kita kelompokan sebagai Herbivora.
package greenhornsjava;

public class Carnivora extends Animal{
 public void eat() {
  System.out.println("I eat meats..");
 }
}
package greenhornsjava;

public class Herbivora extends Animal{
 public void eat() {
  System.out.println("I eat vegetables...");
 }
}

Karena method eat() telah kita pindahkan ke class yang baru maka kita dapat menghapus method eat() dari ke 5 class dan mengubah class agar meng-extends super class yang baru sesuai jenis makanan yang dikonsumsi.

package greenhornsjava;

public class Cat extends Carnivora{
 public void makeNoise() {
  System.out.println("Meong, Meong,...");
 } 
}
package greenhornsjava;

public class Dog extends Carnivora{
 public void makeNoise() {
  System.out.println("Guk, Guk,...");
 }
}

package greenhornsjava;

public class Lion extends Carnivora{
 public void makeNoise() {
  System.out.println("Roar, roar,...");
 }
}
package greenhornsjava;

public class Tiger extends Carnivora{
 public void makeNoise() {
  System.out.println("Hauuuum, Hauuum,...");
 }
}
package greenhornsjava;

public class Hippo extends Herbivora{
 public void makeNoise() {
  System.out.println("Guik, Guik,...");
 }
}

Untuk mengetahui prilaku hewan-hewan yang telah kita definisikan. Mari kita membuat sebuah program yang akan mencetak prilaku hewan - hewan di console.

package greenhornsjava;

import java.util.Scanner;

public class AnimalTester {
 public static void main(String[] args) {
  System.out.println("====== Animal Tester =======");
  System.out.println("1.Hippo");
  System.out.println("2.Lion");
  System.out.println("3.Tiger");
  System.out.println("4.Dog");
  System.out.println("5.Cat");
  System.out.println("6.Exit");
  while (true) {
   int option = 0;
   System.out.print("Pilih [1/2/3/4/5/6] : ");
   option = new Scanner(System.in).nextInt();
   switch (option) {
   case 1:
    Hippo hippo = new Hippo();
    System.out.print("makeNoise() : ");hippo.makeNoise();
    System.out.print("eat() : ");hippo.eat();
    System.out.print("sleep() : ");hippo.sleep();
    System.out.print("roam() : ");hippo.roam();
    break;
    
   case 2:
    Lion lion = new Lion();
    System.out.print("makeNoise() : ");lion.makeNoise();
    System.out.print("eat() : ");lion.eat();
    System.out.print("sleep() : ");lion.sleep();
    System.out.print("roam() : ");lion.roam();
    break;
    
   case 3:
    Tiger tiger = new Tiger();
    System.out.print("makeNoise() : ");tiger.makeNoise();
    System.out.print("eat() : ");tiger.eat();
    System.out.print("sleep() : ");tiger.sleep();
    System.out.print("roam() : ");tiger.roam();
    break;
    
   case 4:
    Dog dog = new Dog();
    System.out.print("makeNoise() : ");dog.makeNoise();
    System.out.print("eat() : ");dog.eat();
    System.out.print("sleep() : ");dog.sleep();
    System.out.print("roam() : ");dog.roam();
    break; 
   
   case 5:
    Cat cat = new Cat();
    System.out.print("makeNoise() : ");cat.makeNoise();
    System.out.print("eat() : ");cat.eat();
    System.out.print("sleep() : ");cat.sleep();
    System.out.print("roam() : ");cat.roam();
    break; 
   
   case 6 : return;
   }
  }
 }
}


Berikut Gambar ilustrasi dari method yang dieksekusi pada class yang menggunakan fitur inheritance.

Jadi apa kegunaan INHERITACE bagi kita?
  • Kita dapat menghindari code yang redundant (berulang-ulang didefinisikan). 
  • Tempatkan method yang memiliki kode yang sama ke sebuah super class yang baru dan biarkan subclass yang menjadi turunan dari superclass mewarisi method tersebut. Ketika kalian ingin mengubah behavior dari method, kalian hanya mengubah di subclass tertentu saja.
  • Anda dapat menentukan sebuah protocol umum untuk sekelompok class.
Sekian tutorial dari Inheritance. Semoga dapat membantu. Jika terdapat pertanyaan, silahkan tinggalkan komentar. Saya akan berusaha menjawab secepat mungkin.

Kamis, 07 Oktober 2010

Object Inheritance (Bagian 1)

Pada bagian ini kita akan belajar mengenai salah satu fitur umum dalam OOP yakni INHERITANCE.
Inheritance, dimaksudkan agar sebuah class dapat mewarisi state2x dan behavior dari object supernya. Agar dapat memahami dengan lebih gampang mari kita simak cerita berikut!

Anda diminta untuk membuat sebuah program simulasi prilaku hewan pada sebuah Kebun Binatang.

Langkah awal dalam pembuatan program adalah Design, sebuah sistem yang akan anda berikan nama :
"Sistem Kendali Prilaku Hewan"

Uncle Sam telah memberikan beberapa sample hewan yang akan dimasukan ke dalam sistem kita. Berikut sample-sample hewan yang diberikan :


Anda diberikan kebebasan dalam menentukan spesifikasi yang akan dimasukan ke dalam sistem anda. Mari kita kerjakan!

Langkah #1: Definisikan super class berdasarkan karakteristik umum dari semua hewan (Attribute dan Behaviour) 

Attribute umum dari hewan2 dalam sistem adalah :
picture (gambar hewan), food (jenis makanan yang dikonsumsi), hunger (tingkat lapar) dan location (posisi hewan dalam kebun binatang).

Method umum dari hewan2 dalam sistem adalah :
makeNoise(bersuara), eat(makan) , roam(cara hewan bergerak) dan sleep (cara hewan tidur)

package greenhornsjava;

import java.awt.Image;

public class Animal {
 private Image picture;
 private String food;
 private int hunger;
 private int location;
 
 public Image getPicture() {
  return picture;
 }
 public void setPicture(Image picture) {
  this.picture = picture;
 }
 public String getFood() {
  return food;
 }
 public void setFood(String food) {
  this.food = food;
 }
 public int getHunger() {
  return hunger;
 }
 public void setHunger(int hunger) {
  this.hunger = hunger;
 }
 public int getLocation() {
  return location;
 }
 public void setLocation(int location) {
  this.location = location;
 }
 
 public void makeNoise() { System.out.println("Animal Make Noise."); }
 public void eat() { System.out.println("Animal eat."); }
 public void roam() { System.out.println("Animal Roam.");}  
 public void sleep() { System.out.println("Animal Sleep.");}
}


Langkah #2 : Definisikan kembali method yang spesifik terhadap typenya
package greenhornsjava;

public class Hippo extends Animal{
 public void makeNoise() {
  System.out.println("Guik, Guik,...");
 }
 
 public void eat() {
  System.out.println("Hippo eats vegetables..");
 } 
}

package greenhornsjava;

public class Dog extends Animal{
 public void makeNoise() {
  System.out.println("Guk, Guk,...");
 }
 
 public void eat() {
  System.out.println("Dog eats meats...");
 }
}
package greenhornsjava;

public class Lion extends Animal{
 public void makeNoise() {
  System.out.println("Roar, roar,...");
 }
 
 public void eat() {
  System.out.println("Lion eats meats..");
 } 
}

package greenhornsjava;

public class Cat extends Animal{
 public void makeNoise() {
  System.out.println("Meong, Meong,...");
 }
 
 public void eat() {
  System.out.println("Cat eats meats..");
 } 
}
package greenhornsjava;

public class Tiger extends Animal{
 public void makeNoise() {
  System.out.println("Haummm, Haummm,...");
 }
 
 public void eat() {
  System.out.println("Tiger eats meats ...");
 } 
}
Sekian bagian pertama dari seri Inheritance... jika terdapat pertanyaan silahkan tinggalkan komentar. Terima kasih.

Struktur Class Java

Pada serie tulisan sebelumnya, kita telah membuat sebuah program Java N-Tier yang sedehana. Sekarang mari kita mundur beberapa langkah untuk mengulas dasar-dasar pemograman yang menjadi pondasinya.
Sebuah program pada platform Java tersusun dari berbagai jenis elemen file, misalnya : Java class, file properties, file Xml konfigurasi, dlcs (dan lainnya cari sendiri…). Pada bagian ini kita hanya akan fokus pada Java Class.

Sebuah class pada Java tersusun dari Variable atau State dan Method atau Behavior.
Variable menerangkan hal-hal yang sebuah object ‘ketahui’ (know), sedangkan Method merupakan hal-hal yang sebuah object dapat ‘lakukan’ (does).
"State dari sebuah object dapat mempengaruhi Behavior-nya."
Berikut contoh dari analogi diatas:
package greenhornsjava;

import java.util.Scanner;

public class Duke {
 private int age;

 public void setAge(int age) {
  this.age = age;
 }

 public int getAge() {
  return age;
 }
 
 public void run() {
  if(age < 25) System.out.println("Duke Run Very Fast...");
  else if(age >= 25 && age < 35) System.out.println("Duke Run Fast...");
  else if(age >= 35 && age < 45) System.out.println("Duke Run Slow...");
  else if(age >= 45) System.out.println("Duke Run Very Slow...");
 }
 
 public static void main(String[] arg) {
  Duke duke = new Duke();
  System.out.print("Duke Age : ");
  int dukeAge = new Scanner(System.in).nextInt();
  duke.setAge(dukeAge);
 
  duke.run();
 } 
}

Gambar Struktur Class Java
Sekian ulasan singkat dari struktur class Java. Jika terdapat pertanyaan, silahkan tulis komentar anda, saya akan mencoba untuk menanggapi secepatnya. Terima kasih.

Minggu, 03 Oktober 2010

Menulis Program Aplikasi Java Sederhana (Bagian 3 - Akhir)

Pada tulisan sebelumnya, kita telah menyelesaikan sampai pada tahap 7.2 (lihat roadmap aplikasi), sekarang kita akan menyelesaikan keseluruhan tahap dari aplikasi (baca : Membuat Aplikasi Program Java Sederhana (Bagian 1).

Mari kita mulai ...

Langkah #10 : Membangun View Daftar Pegawai
13. Ubah dan tambahkan code pada class [Menu] agar ketika user memilih 'pilihan 2.Daftar Data Pegawai' maka user akan diarahkan ke menu daftar data pegawai.


private void showMenu(User user, int option) {
  switch(option) {
   case 1 :  showMenuEntryData(); break;
   case 2 : showMenuListData(); break; 
  }
 }
 
 private void showMenuListData() {
  ListData listData = new ListData();
  listData.showData();
 }

14. Buat class [ListData] di package[greenhornsjava.view]
package greenhornsjava.view;

import java.text.SimpleDateFormat;
import java.util.Scanner;
import greenhornsjava.db.InMemoryEmployeeDb;
import greenhornsjava.model.Employee;
import greenhornsjava.util.FileUtil;

public class ListData {
 private final String FILE_DIR = "C:/greenhornsjava/";  
 public void showData() {
  InMemoryEmployeeDb employeeTable = InMemoryEmployeeDb.getInstance();
  if(employeeTable.size() == 0) 
   System.out.println("Tidak Ada Pegawai!");
  else ListAllDataEmployee(employeeTable);
 }
 
 private void ListAllDataEmployee(InMemoryEmployeeDb employeeTable) {
  System.out.println("=======================================");
  for (Employee employee : employeeTable) {
   System.out.println("Nama : " + employee.getNama());
   System.out.println("Alamat : " + employee.getAlamat());
   System.out.printf("Tempat,Tanggal Lahir : %s, %s \n", 
         employee.getTempatLahir(), 
         new SimpleDateFormat("dd/MM/yyyy").format(employee.getTglLahir()));
   System.out.printf("User, Tgl Input: %s, %s \n", 
         employee.getCreatedBy(), 
         new SimpleDateFormat("dd/MM/yyyy").format(employee.getCreatedOn()));
   System.out.println("=======================================");
  }
  
  String reply = null;
  System.out.print("Simpan ke text[Y/N]?");
  reply = new Scanner(System.in).next();
  
  if(reply.equalsIgnoreCase("y")) {
   String fileName = new SimpleDateFormat("yyyyMMdd").
         format(System.currentTimeMillis()) + "_greenhornsjava.txt"; 
   FileUtil.persistArrayToFile(employeeTable, FILE_DIR + fileName);
  }
 }
}

15.Buat class [FileUtil] di package[greenhornsjava.util]
package greenhornsjava.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import greenhornsjava.model.Employee;

public class FileUtil {
 public static void persistArrayToFile(List<Employee> list, String fileName) { 
  FileWriter fstream = null;
  BufferedWriter out = null;
  File file = null;
  String COMMA_SEPARATOR = ",";
  
  try{
   file = new File(fileName);
   fstream = new FileWriter(file);    
   out = new BufferedWriter(fstream);
      
   for (int i=0;i<list.size();i++) {
    Employee employee = list.get(i);
    StringBuffer sb = new StringBuffer();
    sb.append(employee.getNama()).append(COMMA_SEPARATOR)
      .append(employee.getAlamat()).append(COMMA_SEPARATOR)
      .append(employee.getTempatLahir()).append(COMMA_SEPARATOR)
      .append(employee.getTglLahir()).append(COMMA_SEPARATOR)
      .append(employee.getCreatedBy()).append(COMMA_SEPARATOR)
      .append(employee.getCreatedOn());
    
    if( i < (list.size() - 1)) sb.append("\n");
    out.write(sb.toString()); 
   }
  }catch (Exception e){
      System.err.println("Error: " + e.getMessage());
  }finally {
   try {
    out.close();
   } catch (IOException e) {
    System.err.println("Error: " + e.getMessage());
   }
  }
 }
}


Sebelum melanjutkan, mari kita lihat sejenak struktur aplikasi kita sejenak. Pastikan struktur aplikasi anda sama sebelum melanjutkan.


Pada Tutorial Bagian 1 terdapat class [DisplayManager] yang direncanakan sebagai bagian dari Logic pada saat penampilan data yang tidak dibuat, akan tetapi digantikan dengan class [FileUtil] yang dirasakan lebih tepat dibandingkan dengan class [DisplayManager] yang telah direncanakan sebelumnya.
Dalam dunia Software development, perubahan rencana adalah hal yang wajar terjadi. Software yang dikembangkan oleh programmer harus dapat segera beradaptasi dengan perubahan yang ada.

Baiklah Kita telah menyelesaikan tahap akhir dari keseluruhan tahap dari aplikasi. Sekarang tiba saatnya kita menjalankan program yang telah kita tulis. Berikut adalah cuplikan gambar aplikasi.


Pada direktori yang telah ditentukan sebelumnya akan terbentuk sebuah file seperti pada gambar di bawah ini.




Berikut contoh isi dari file text yang digenerate oleh aplikasi :

Toni,Pacung-Bali,Palembang,Thu Aug 19 00:00:00 SGT 1982,admin,Sun Oct 03 22:53:45 SGT 2010
Haris,Dago-Bandung,Medan,Tue Oct 01 00:00:00 SGT 1985,admin,Sun Oct 03 22:54:12 SGT 2010
Frenti,Pacung-Bali,Bandung,Mon Nov 12 00:00:00 SGT 1984,admin,Sun Oct 03 22:54:37 SGT 2010


Sekian lengkap sudah seri "Menulis Program Aplikasi Java Sederhana". Semoga dapat membantu rekan-rekan dalam memahami Java programming secara lebih cepat dengan cara langsung membuat program. 
Jika terdapat saran, kritik atau pertanyaan silahkan tinggalkan pesan atau email. Saya akan mencoba untuk menanggapi secepat mungkin. Terima kasih.

Sabtu, 02 Oktober 2010

Menulis Program Aplikasi Java Sederhana (Bagian 2)

Melanjutkan Bagian 1 Menulis Program Alipkasi Java Sederhana, pada bagian 2 ini, kita akan menambahkan modul Menu dan Data Entry. Modul Menu akan menampilkan 3 pilihan yakni
  1. Entry Data Pegawai

    Modul ini akan menyimpan data pegawai yang dimasukan oleh user ke dalam penyimpanan in-memory, HashMap (Pembahasan lebih lanjut tentang Java Collection akan ditulis pada serie – serie berikutnya). Dan kemudian akan disimpan ke text pada menu Display Data Pegawai.
  2. Display Data Pegawai

    Modul ini akan menampilkan Data Pegawai yang telah diisi sebelumnya. Terdapat fitur [Simpan ke text] sehingga data yang telah disimpan di HashMap dapat disimpan di komputer pengguna dalam bentuk File CSV .
  3. Logout

    Modul ini akan mengarahkan pengguna kembali ke menu login dan menhapus semua data yang terdapat di HashMap.
Baiklah mari kita mulai.

Langkah #4 : Membangun View Menu

7. Buat class [Menu] di package [greenhornsjava.view]
package greenhornsjava.view; 

import greenhornsjava.model.User;
import greenhornsjava.business.EntryDataManager;
import greenhornsjava.business.MenuManager;
import java.util.Scanner;
public class Menu {
 private User user;
 public Menu(User user) {
  this.user = user;
 } 
 public void start() {
  int option;
  while (true) {
   System.out.println("[1].Input Data Pegawai");
   System.out.println("[2].Daftar Data Pegawai");
   System.out.println("[3].Logout");
   System.out.println("========================");
   System.out.print("Pilih Menu[1/2/3] : ");   
   option = Integer.valueOf(new Scanner(System.in).next());   
   MenuManager menuMgr = new MenuManager();
   try {
    menuMgr.verifyEntry(option);
    if(option == 3) {
     logout();
     return;
    }
    showMenu(user, option);
   } catch(Exception e) {
    System.out.println(e.getMessage());
   }
  }
 } 
 private void showMenu(User user, int option) {
  switch(option) {
   case 1 :  showMenuEntryData(); break;
   case 2 : System.out.println("Masuk Menu Daftar Data Pegawai"); break; 
  }
 }
 
 private void showMenuEntryData() {
  EntryData entryData = new EntryData(user);
  entryData.start(); 
 }
 
 private void logout() {
  EntryDataManager entryDataManager = new EntryDataManager();
  entryDataManager.clearAll();
 }
}

Langkah #5 : Membangun Logic Menu

8. Buat class [MenuManager ] di package [greenhornsjava.business]
package greenhornsjava.business; 

public class MenuManager {
 public void verifyEntry(int option) throws Exception {
  if(option == 1) return;
  if(option != 2) return; 
  if(option!= 3) return;  
  throw new Exception("Pilihan menu tidak valid");
 }
}

Ubahlah sebagian code pada [Login.java]




Menjadi berikut :
Menu menu = new Menu(user);
menu.start();

Langkah #6 : Membangun Model Data Pegawai

9. Buat class [Employee] di package [greenhornsjava.model]
package greenhornsjava.model;

import java.io.Serializable;
import java.util.Date;

public class Employee implements Serializable {
 private static final long serialVersionUID = 1L;
 private String nama;
 private String alamat;
 private String tempatLahir;
 private Date tglLahir;
 private Date createdOn;
 private String createdBy;
 
 public Employee() {}
 public Employee(String nama, String alamat, String tempatLahir,
   Date tglLahir, User user) {
  this.nama = nama;
  this.alamat = alamat;
  this.tempatLahir = tempatLahir;
  this.tglLahir = tglLahir;
  this.createdBy = user.getUserName();
  this.createdOn = new Date(System.currentTimeMillis());
 }
 
 public String getNama() {
  return nama;
 }
 public void setNama(String nama) {
  this.nama = nama;
 }
 public String getAlamat() {
  return alamat;
 }
 public void setAlamat(String alamat) {
  this.alamat = alamat;
 }
 public String getTempatLahir() {
  return tempatLahir;
 }
 public void setTempatLahir(String tempatLahir) {
  this.tempatLahir = tempatLahir;
 }
 public Date getTglLahir() {
  return tglLahir;
 }
 public void setTglLahir(Date tglLahir) {
  this.tglLahir = tglLahir;
 }
 public Date getCreatedOn() {
  return createdOn;
 }
 public void setCreatedOn(Date createdOn) {
  this.createdOn = createdOn;
 }
 public String getCreatedBy() {
  return createdBy;
 }
 public void setCreatedBy(String createdBy) {
  this.createdBy = createdBy;
 }
 
 public String toString() {
  return nama;
 }
}


Langkah #7 : Membangun In-Memory Database Pegawai

10. Buat class [InMemoryEmployeeDb] di package [greenhornsjava.db]
package greenhornsjava.db;

import greenhornsjava.model.Employee;
import java.util.ArrayList;

public class InMemoryEmployeeDb extends  ArrayList {
 private static InMemoryEmployeeDb fakeEmployeeTable = new InMemoryEmployeeDb();
 private InMemoryEmployeeDb() { }
 public static InMemoryEmployeeDb getInstance() {
  return (InMemoryEmployeeDb) fakeEmployeeTable;
 }
}

Langkah #8 : Membangun View Data Entry

11. Buat class [EntryData] di package [greenhornsjava.view]
package greenhornsjava.view;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import greenhornsjava.business.EntryDataManager;
import greenhornsjava.model.Employee;
import greenhornsjava.model.User;

public class EntryData {
 private User user;
 public EntryData(User user) {
  this.user = user;
 }

 public void start() {
  while(true) {
   String nama = null;
   String alamat = null;
   String tempatLahir = null;
   Date tglLahir = new Date(System.currentTimeMillis());
   String response = null;   
   System.out.println("Entry Data Pegawai");
   System.out.println("------------------");
   System.out.print("Nama : ");
   nama = new Scanner(System.in).next(); 
   
   System.out.print("Alamat : ");
   alamat = new Scanner(System.in).next();  
   
   System.out.print("Tempat Lahir : ");
   tempatLahir = new Scanner(System.in).next(); 
   
   while (true) {
    System.out.print("Tanggal Lahir(dd/MM/yyyy) : ");
    try {
     tglLahir = new SimpleDateFormat("dd/MM/yyyy").parse(new Scanner(System.in).next());
     break; 
    } catch (ParseException e) {
     System.out.println("Format tanggal salah.");
    }
   }
   
   System.out.print("[S]impan atau E[x]it?");
   response = new Scanner(System.in).next();    
   if(response.equalsIgnoreCase("x")) return;
   
   EntryDataManager entryDataManager = new EntryDataManager();
   entryDataManager.save(new Employee(nama, alamat, tempatLahir, tglLahir, user));   
   
   System.out.print("[L]anjut Entry atau E[x]it?");
   response = new Scanner(System.in).next();
   
   if(response.equalsIgnoreCase("x")) return;
  }  
 }
}

Langkah #9 : Membangun Logic Data Entry

12. Buat class [EntryDataManager] di package [greenhornsjava.business]
package greenhornsjava.business;

import greenhornsjava.db.InMemoryEmployeeDb;
import greenhornsjava.model.Employee;

public class EntryDataManager {

 public void save(Employee employee) {
  InMemoryEmployeeDb.getInstance().add(employee); 
  
  for (Employee emp : InMemoryEmployeeDb.getInstance()) {
   System.out.println(emp.getNama());
  }
 }
 
 public void clearAll() {
  InMemoryEmployeeDb.getInstance().clear();
 }
 
}

Sebelum melanjutkan, mari kita lihat sejenak struktur aplikasi kita sejenak. Pastikan struktur aplikasi anda sama sebelum melanjutkan.


Kita telah menyelesaikan tahap (4),(5),(6),(7.1) dan (7.2) dari keseluruhan tahap dari aplikasi. Sekarang tiba saatnya kita menjalankan program yang telah kita tulis. Pastikan program berjalan dengan baik seperti Gambar dibawah.


Sekian tutorial 'Menulis Program Aplikasi Java Sederhana (Bagian 2)'. Jika terdapat saran, kritik atau pertanyaan silahkan tinggalkan pesan atau email. Saya akan mencoba untuk menanggapi secepat mungkin. Terima kasih.