(software) design pattern
Builder Pattern
Contoh penerapan software design pattern pada pemrograman aplikasi Android
Arif Akbarul Huda
● Android Developer di qiscus
● Penulis buku “Livecoding! 9 Aplikasi Android Buatan Sendiri”
● [email protected] (email) | @omayib (Twitter)
Isu...
Bagaimana teknik menangani objek personal yang dibuat berdasarkan formulir seperti
gambar ini?
public class Person { private final String firstName; //required private final String lastName; //required private final int age; //optional private final String phone; //optional private final String address; //optional //and many more optional variable…….}
● Bayangkan seandainya, class yang kamu buat memiliki banyak atribut/variabel
● Beberapa variabel diantaranya wajib diisi dan sisanya optional
Studi kasus….
Bagaimana cara menginisiasi objek Person?
public Person(String firstName, String lastName) { this(firstName, lastName, 0);}
public Person(String firstName, String lastName, int age) { this(firstName, lastName, age, '');}
public Person(String firstName, String lastName, int age, String phone) { this(firstName, lastName, age, phone, '');}
public Person(String firstName, String lastName, int age, String phone, String address) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.phone = phone; this.address = address;}
Membuat beberapa constructor….
Its work!, namun (nampak) membingungkan jika dilihat dari sisi client….
● Constructor yang mana yang harus dipilih?
● Cunstructor dengan 2 parameter atau 3 parameter?
● Apa isi default-value dari variabel yang tidak di-pass nilainya?
● Bagaimana jika ingin memberikan nilai pada variabel address, tapi tidak menganggu
variabel age dan phone?
● Kadang Bingung urutannya. Parameter String pertama merupakan phone atau
address?
● Apabila software berkembang, variabel bertambah banyak, maka constructor juga
Semakin bertambah. Lalu…. Bingung!?!!!
Arrrgggghhhh….. pucing pala berbi
Solution...
Aha… gunakan saja JavaBeans convention…
● No argument didalam constructor
● Setiap atribut/variabel punya setter & getter
public class Person {private String firstName; // requiredprivate String lastName; // requiredprivate int age; // optionalprivate String phone; // optionalprivate String address; //optional
public String getFirstName() {return firstName;
}public void setFirstName(String firstName) {
this.firstName = firstName;}public String getLastName() {
return lastName;}public void setLastName(String lastName) {
this.lastName = lastName;}public int getAge() {
return age;}public void setAge(int age) {
this.age = age;}public String getPhone() {
return phone;}public void setPhone(String phone) {
this.phone = phone;}public String getAddress() {
return address;}public void setAddress(String address) {
this.address = address;}
}
● Pendekatan ini paling mudah dilakukan , mudah
dibaca dan mudah di kelola.
● Client cukup menginisiasi sebuah object tanpa
melwatkan argument apapun kedalam
consturctor.
● Masing-masing variabel, nilainya diberikan
melalui setter.
Coba perhatikan dgn seksama, apakah kamu menemukan
ke-aneh-an?
Setter-getter issue
● Status objek menjadi tidak konsisten● Person Class menjadi mutable. Bisa diubah
sewaktu-waktu.● Kita akan kehilangan kelebihan-kelebihan dari immutable objek
Classes should be immutable unless there's a very good reason to make them mutable....If a class cannot be made immutable, limit its mutability as much as possible. by Joshua Bloch (taken from the book Effective Java)
Classes should be immutable unless there's a very good reason to make them mutable....If a class cannot be made immutable, limit its mutability as much as possible. by Joshua Bloch (taken from the book Effective Java)
Next solutionusing builder pattern
Tujuan builder pattern
Mengurangi kompleksitas berkaitan dengan hal berikut
● Constructor berlebihan (lebih dari 1)
● Banyak variabel
● Meminimalkan penggunaan setter
public class Person { private String firstName;//required private String address;//required private String phone;//required private String salary; //optional // .... others optional variable private String job;//optional
private Person(Builder b){ this.firstName=b.firstName; this.address=b.address; this.phone=b.phone; this.salary=b.salary; this.job=b.job; }
public String getFirstName() {return firstName;} public String getAddress() {return address;} public String getPhone() {return phone;} public String getJob() {return job;} public String getSalary() {return salary;}
public static class Builder{}
}
public static class Builder{ private String firstName;//required private String address;//required private String phone;//required private String salary; //optional // .... others optional variable private String job;//optional
public Builder firstName(String firstNamePerson){ this.firstName=firstNamePerson; return this; } public Builder address(String addressPerson){ this.address=addressPerson; return this; } public Builder phone(String phonePerson){ this.phone=phonePerson; return this; } public Builder salary(String salaryPerson){ this.salary=salaryPerson; return this; } public Builder job(String jobPerson){ this.job=jobPerson; return this; } public Person build(){ Person person= new Person(this); if(person.firstName==null){ throw new IllegalStateException("first name can not be empty"); } if(person.address==null){ throw new IllegalStateException("address can not be empty"); } if(person.phone==null){ throw new IllegalStateException("phone can not be empty"); } return person; } }
Bagaimana cara menginisiasi objek Person?
Person person=new Person.Builder().address("alamat") .birthDay("12/2/1990") .birthPlace("solo") .bodyHeight(120) .bodyWedight(70) .job("pekerjaan") .lastName("huda") .middleName("midle name") .phone("2232323") .firstName("ariff") .salary("23000000000").build();
menggunakan builder pattern :
● Tipe constructor adalah private, sehingga class tidak bisa di inisiasi secara langsung dari sisi client
● Class bersifat immutable, kita hanya perlu menyediakan getter.
● Builder menggunakan style Fluent interface, sehingga mudah dibaca
● Mudah dilakukan validasi utnuk membedakan atribut wajib dan optional.
Keunggulannya….
sourcode
Tersedia di Github (https://github.com/omayib/BuilderPatterOnAndroid)
Top Related