android (software) design pattern

19

Click here to load reader

Upload: arif-huda

Post on 16-Jul-2015

707 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Android (software) Design Pattern

(software) design pattern

Builder Pattern

Contoh penerapan software design pattern pada pemrograman aplikasi Android

Page 2: Android (software) Design Pattern

Arif Akbarul Huda

● Android Developer di qiscus

● Penulis buku “Livecoding! 9 Aplikasi Android Buatan Sendiri”

[email protected] (email) | @omayib (Twitter)

Page 3: Android (software) Design Pattern

Isu...

Page 4: Android (software) Design Pattern

Bagaimana teknik menangani objek personal yang dibuat berdasarkan formulir seperti

gambar ini?

Page 5: Android (software) Design Pattern

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….

Page 6: Android (software) Design Pattern

Bagaimana cara menginisiasi objek Person?

Page 7: Android (software) Design Pattern

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….

Page 8: Android (software) Design Pattern

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!?!!!

Page 9: Android (software) Design Pattern

Arrrgggghhhh….. pucing pala berbi

Page 10: Android (software) Design Pattern

Solution...

Aha… gunakan saja JavaBeans convention…

● No argument didalam constructor

● Setiap atribut/variabel punya setter & getter

Page 11: Android (software) Design Pattern

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?

Page 12: Android (software) Design Pattern

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)

Page 13: Android (software) Design Pattern

Next solutionusing builder pattern

Page 14: Android (software) Design Pattern

Tujuan builder pattern

Mengurangi kompleksitas berkaitan dengan hal berikut

● Constructor berlebihan (lebih dari 1)

● Banyak variabel

● Meminimalkan penggunaan setter

Page 15: Android (software) Design Pattern

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; } }

Page 16: Android (software) Design Pattern

Bagaimana cara menginisiasi objek Person?

Page 17: Android (software) Design Pattern

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();

Page 18: Android (software) Design Pattern

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….

Page 19: Android (software) Design Pattern

sourcode

Tersedia di Github (https://github.com/omayib/BuilderPatterOnAndroid)