android (software) design pattern

Post on 16-Jul-2015

707 Views

Category:

Software

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

(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”

● omayib@gmail.com (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