Pengantar Pola Objek Null

1. Ikhtisar

Dalam tutorial singkat ini, kita akan melihat Pola Objek Null, kasus khusus dari Pola Strategi. Kami akan menjelaskan tujuannya dan kapan kami benar-benar harus mempertimbangkan untuk menggunakannya.

Seperti biasa, kami juga akan memberikan contoh kode sederhana.

2. Pola Objek Nol

Di sebagian besar bahasa pemrograman berorientasi objek, kami tidak diizinkan menggunakan referensi null . Itulah mengapa kami sering dipaksa untuk menulis cek nol :

Command cmd = getCommand(); if (cmd != null) { cmd.execute(); }

Terkadang, jika jumlah pernyataan if menjadi tinggi, kodenya menjadi jelek, sulit dibaca dan rawan kesalahan. Ini adalah saat Pola Objek Null mungkin berguna.

Maksud dari Pola Objek Null adalah untuk meminimalkan jenis pemeriksaan nol tersebut . Sebaliknya, kita dapat mengidentifikasi perilaku null dan merangkumnya dalam tipe yang diharapkan oleh kode klien. Lebih sering daripada tidak, logika netral seperti itu sangat sederhana - tidak melakukan apa-apa. Dengan cara ini kita tidak perlu lagi berurusan dengan penanganan khusus referensi null .

Kami hanya dapat memperlakukan objek null dengan cara yang sama seperti kami memperlakukan instance lain dari jenis tertentu yang sebenarnya berisi beberapa logika bisnis yang lebih canggih. Akibatnya, kode klien tetap bersih.

Karena objek null seharusnya tidak memiliki status apa pun, tidak perlu membuat instance identik beberapa kali. Jadi, kita akan sering mengimplementasikan objek null sebagai singletons .

3. Diagram UML Pola Objek Nol

Mari kita lihat polanya secara visual:

Seperti yang bisa kita lihat, kita bisa mengidentifikasi peserta berikut:

  • Klien membutuhkan sebuah instance dari AbstractObject
  • AbstractObject mendefinisikan kontrak yang diharapkan Klien - itu mungkin juga berisi logika bersama untuk kelas-kelas yang mengimplementasikan
  • RealObject mengimplementasikan AbstractObject dan menyediakan perilaku nyata
  • NullObject mengimplementasikan AbstractObject dan menyediakan perilaku netral

4. Implementasi

Sekarang kita memiliki gagasan yang jelas tentang teori tersebut, mari kita lihat contoh.

Bayangkan kita memiliki aplikasi router pesan. Setiap pesan harus memiliki prioritas yang valid. Sistem kami seharusnya merutekan pesan prioritas tinggi ke gateway SMS sedangkan pesan dengan prioritas sedang harus dirutekan ke antrean JMS.

Namun, dari waktu ke waktu, pesan dengan "tidak ditentukan" atau prioritas kosong mungkin datang ke aplikasi kita. Pesan semacam itu harus dibuang dari pemrosesan lebih lanjut.

Pertama, kami akan membuat antarmuka Router :

public interface Router { void route(Message msg); }

Selanjutnya, mari buat dua implementasi dari antarmuka di atas - yang bertanggung jawab untuk merutekan ke gateway SMS dan yang akan merutekan pesan ke antrian JMS:

public class SmsRouter implements Router { @Override public void route(Message msg) { // implementation details } }
public class JmsRouter implements Router { @Override public void route(Message msg) { // implementation details } }

Terakhir, mari kita implementasikan objek null kita:

public class NullRouter implements Router { @Override public void route(Message msg) { // do nothing } }

Kami sekarang siap untuk menggabungkan semua bagian. Mari kita lihat bagaimana contoh kode klien terlihat:

public class RoutingHandler { public void handle(Iterable messages) { for (Message msg : messages) { Router router = RouterFactory.getRouterForMessage(msg); router.route(msg); } } }

Seperti yang bisa kita lihat, kita memperlakukan semua objek Router dengan cara yang sama, tidak peduli implementasi apa yang dikembalikan oleh RouterFactory. Ini memungkinkan kami untuk menjaga kode kami tetap bersih dan dapat dibaca.

5. Kapan Menggunakan Pola Objek Null

Kita harus menggunakan Pola Objek Null ketika Klien akan memeriksa null hanya untuk melewatkan eksekusi atau melakukan tindakan default. Dalam kasus seperti itu, kami dapat merangkum logika netral dalam objek null dan mengembalikannya ke klien alih-alih nilai null . Dengan cara ini, kode klien tidak lagi perlu diperhatikan jika instance yang diberikan bernilai null atau tidak.

Pendekatan semacam itu mengikuti prinsip berorientasi objek umum, seperti Katakan-Jangan-Tanyakan.

Untuk lebih memahami kapan kita harus menggunakan Pola Objek Null, mari kita bayangkan kita harus mengimplementasikan antarmuka Customer Dao yang didefinisikan sebagai berikut:

public interface CustomerDao { Collection findByNameAndLastname(String name, String lastname); Customer getById(Long id); }

Sebagian besar pengembang akan mengembalikan Collections.emptyList () dari findByNameAndLastname () jika tidak ada pelanggan yang cocok dengan kriteria pencarian yang diberikan. Ini adalah contoh yang sangat bagus untuk mengikuti Pola Objek Null.

Sebaliknya, get ById () harus mengembalikan pelanggan dengan id yang diberikan. Seseorang yang memanggil metode ini berharap mendapatkan entitas pelanggan tertentu. Jika tidak ada pelanggan seperti itu, kami harus secara eksplisit mengembalikan nol untuk memberi sinyal ada yang salah dengan id yang diberikan.

Seperti semua pola lainnya, kita perlu mempertimbangkan kasus penggunaan khusus kita sebelum menerapkan Pola Objek Null secara membabi buta . Jika tidak, kami mungkin secara tidak sengaja memasukkan beberapa bug dalam kode kami yang akan sulit ditemukan.

6. Kesimpulan

Di artikel ini, kita mempelajari apa itu Pola Objek Null dan kapan kita dapat menggunakannya. Kami juga menerapkan contoh sederhana dari pola desain.

Seperti biasa, semua contoh kode tersedia di GitHub.