Pengenalan Corak Objek Null

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan melihat Corak Objek Null, kes khas dari Pola Strategi. Kami akan menerangkan tujuannya dan kapan kami harus mempertimbangkan untuk menggunakannya.

Seperti biasa, kami juga akan memberikan contoh kod ringkas.

2. Corak Objek Null

Dalam kebanyakan bahasa pengaturcaraan berorientasikan objek, kami tidak dibenarkan menggunakan rujukan kosong . Itulah sebabnya kami sering terpaksa menulis cek kosong :

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

Kadang-kadang, jika jumlah itu jika penyata mendapatkan tinggi, kod boleh menjadi hodoh, sukar untuk membaca dan kesilapan yang sering berlaku. Ini adalah ketika Pola Objek Null mungkin berguna.

Tujuan Corak Objek Null adalah untuk meminimumkan pemeriksaan nol semacam itu . Sebaliknya, kita dapat mengenal pasti tingkah laku nol dan merangkumnya dalam jenis yang diharapkan oleh kod pelanggan. Selalunya tidak, logik neutral seperti itu sangat mudah - jangan buat apa-apa. Dengan cara ini kita tidak perlu lagi menangani pengendalian rujukan nol khas .

Kita hanya boleh memperlakukan objek kosong dengan cara yang sama dengan memperlakukan kejadian lain dari jenis tertentu yang sebenarnya mengandungi logik perniagaan yang lebih canggih. Akibatnya, kod pelanggan tetap bersih.

Oleh kerana objek nol tidak boleh memiliki keadaan, tidak perlu membuat kejadian serupa beberapa kali. Oleh itu, kita akan sering melaksanakan objek kosong sebagai singlet .

3. Diagram UML Corak Objek Null

Mari lihat corak secara visual:

Seperti yang dapat kita lihat, kita dapat mengenal pasti peserta berikut:

  • Pelanggan memerlukan contoh AbstractObject
  • AbstractObject menentukan kontrak yang diharapkan oleh Pelanggan - mungkin juga mengandungi logik bersama untuk kelas pelaksana
  • RealObject menerapkan AbstractObject dan memberikan tingkah laku sebenar
  • NullObject menerapkan AbstractObject dan memberikan tingkah laku neutral

4. Pelaksanaan

Sekarang kita mempunyai idea teori yang jelas, mari kita lihat contohnya.

Bayangkan kita mempunyai aplikasi penghantar mesej. Setiap mesej harus mempunyai keutamaan yang sah. Sistem kami seharusnya merutekan pesan keutamaan tinggi ke gerbang SMS sedangkan pesan dengan keutamaan sederhana harus disalurkan ke antrian JMS.

Akan tetapi, dari semasa ke semasa, pesan dengan "tidak ditentukan" atau keutamaan kosong mungkin masuk ke aplikasi kami. Mesej seperti itu harus dibuang dari proses selanjutnya.

Pertama, kami akan membuat antara muka Router :

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

Seterusnya, mari buat dua implementasi antara muka di atas - yang bertanggungjawab untuk menghala ke gerbang SMS dan yang akan menghantar mesej ke barisan 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 } }

Akhirnya, mari kita laksanakan objek kosong kita:

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

Kami kini bersedia untuk mengumpulkan semua kepingan. Mari lihat bagaimana contoh kod pelanggan:

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

Seperti yang dapat kita lihat, kita memperlakukan semua objek Router dengan cara yang sama, tidak peduli apa implementasinya dikembalikan oleh RouterFactory. Ini membolehkan kita memastikan kod kita bersih dan mudah dibaca.

5. Bilakah Menggunakan Corak Objek Null

Kita harus menggunakan Corak Objek Null ketika Pelanggan sebaliknya akan memeriksa nol hanya untuk melangkau pelaksanaan atau melakukan tindakan lalai. Dalam kes seperti itu, kita mungkin merangkumi logik neutral dalam objek nol dan mengembalikannya kepada pelanggan dan bukannya nilai nol . Dengan cara ini kod pelanggan tidak perlu lagi diperhatikan sama ada contoh yang diberikan adalah batal atau tidak.

Pendekatan sedemikian mengikut prinsip berorientasikan objek umum, seperti Tell-Don't-Ask.

Untuk lebih memahami kapan kita harus menggunakan Corak Objek Null, mari kita bayangkan kita harus melaksanakan antara muka CustomerDao yang ditakrifkan sebagai berikut:

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

Sebilangan besar pembangun akan mengembalikan Collections.emptyList () dari findByNameAndLastname () sekiranya tiada pelanggan yang sesuai dengan kriteria carian yang disediakan. Ini adalah contoh yang sangat baik untuk mengikuti Corak Objek Null.

Sebaliknya, get ById () harus mengembalikan pelanggan dengan id yang diberikan. Seseorang yang memanggil kaedah ini mengharapkan untuk mendapatkan entiti pelanggan tertentu. Sekiranya tidak ada pelanggan seperti itu, kami harus secara eksplisit mengembalikan nol untuk memberi isyarat bahawa ada sesuatu yang salah dengan id yang diberikan.

Seperti semua corak lain, kita perlu mempertimbangkan kes penggunaan khusus kita sebelum melaksanakan Pola Objek Null secara membuta tuli . Jika tidak, kami mungkin sengaja memperkenalkan beberapa bug dalam kod kami yang sukar dicari.

6. Kesimpulannya

Dalam artikel ini, kami mempelajari apa itu Null Object Pattern dan kapan kami dapat menggunakannya. Kami juga menerapkan contoh ringkas corak reka bentuk.

Seperti biasa, semua contoh kod boleh didapati di GitHub.