Prinsip Terbuka / Tertutup di Jawa

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan membincangkan Prinsip Terbuka / Tertutup (OCP) sebagai salah satu prinsip SOLID pengaturcaraan berorientasikan objek.

Secara keseluruhan, kami akan memperincikan prinsip ini dan bagaimana menerapkannya semasa merancang perisian kami.

2. Prinsip Terbuka / Tertutup

Seperti namanya, prinsip ini menyatakan bahawa entiti perisian harus terbuka untuk peluasan, tetapi ditutup untuk pengubahsuaian. Akibatnya, apabila keperluan perniagaan berubah maka entiti dapat diperluas, tetapi tidak diubah.

Untuk ilustrasi di bawah ini, kami akan memfokuskan bagaimana antarmuka adalah salah satu cara untuk mengikuti OCP.

2.1. Tidak Mematuhi

Mari kita pertimbangkan untuk membuat aplikasi kalkulator yang mungkin mempunyai beberapa operasi, seperti penambahan dan pengurangan.

Pertama sekali, kami akan menentukan antara muka peringkat teratas - KalkulatorOperasi :

public interface CalculatorOperation {}

Mari tentukan kelas Penambahan , yang akan menambah dua nombor dan melaksanakan C alculatorOperation :

public class Addition implements CalculatorOperation { private double left; private double right; private double result = 0.0; public Addition(double left, double right) { this.left = left; this.right = right; } // getters and setters }

Setakat ini, kami hanya mempunyai satu kelas Penambahan, jadi kami perlu menentukan kelas lain bernama Penolakan :

public class Subtraction implements CalculatorOperation { private double left; private double right; private double result = 0.0; public Subtraction(double left, double right) { this.left = left; this.right = right; } // getters and setters }

Sekarang mari kita tentukan kelas utama kami, yang akan melakukan operasi kalkulator kami:

public class Calculator { public void calculate(CalculatorOperation operation) { if (operation == null) { throw new InvalidParameterException("Can not perform operation"); } if (operation instanceof Addition) { Addition addition = (Addition) operation; addition.setResult(addition.getLeft() + addition.getRight()); } else if (operation instanceof Subtraction) { Subtraction subtraction = (Subtraction) operation; subtraction.setResult(subtraction.getLeft() - subtraction.getRight()); } } }

Walaupun ini kelihatan baik, ini bukan contoh OCP yang baik. Apabila keperluan baru untuk menambah fungsi pendaraban atau membahagi, kita tidak ada cara selain mengubah kaedah mengira kelas Kalkulator .

Oleh itu, kita boleh mengatakan kod ini tidak mematuhi OCP.

2.2. Mematuhi OCP

Seperti yang kita lihat, aplikasi kalkulator kami belum mematuhi OCP. Kod dalam kaedah kiraan akan berubah dengan setiap permintaan sokongan operasi baru yang masuk. Oleh itu, kita perlu mengekstrak kod ini dan memasukkannya ke dalam lapisan abstraksi.

Salah satu penyelesaiannya adalah dengan mewakilkan setiap operasi ke kelas masing-masing:

public interface CalculatorOperation { void perform(); }

Hasilnya, kelas Penambahan dapat menerapkan logik penambahan dua nombor:

public class Addition implements CalculatorOperation { private double left; private double right; private double result; // constructor, getters and setters @Override public void perform() { result = left + right; } }

Begitu juga, kelas Pengurangan yang dikemas kini mempunyai logik yang serupa. Dan serupa dengan Penambahan dan Pengurangan , sebagai permintaan perubahan baru, kami dapat menerapkan logik pembahagian :

public class Division implements CalculatorOperation { private double left; private double right; private double result; // constructor, getters and setters @Override public void perform() { if (right != 0) { result = left / right; } } }

Dan akhirnya, kelas Kalkulator kami tidak perlu menerapkan logik baru kerana kami memperkenalkan operator baru:

public class Calculator { public void calculate(CalculatorOperation operation) { if (operation == null) { throw new InvalidParameterException("Cannot perform operation"); } operation.perform(); } } 

Dengan cara itu kelas ditutup untuk pengubahsuaian tetapi terbuka untuk peluasan.

3. Kesimpulannya

Dalam tutorial ini, kita telah mengetahui apa itu OCP secara definisi, kemudian menghuraikan definisi tersebut. Kami kemudian melihat contoh aplikasi kalkulator sederhana yang cacat dalam reka bentuknya. Terakhir, kami membuat reka bentuk yang baik dengan mematuhi OCP.

Seperti biasa, kodnya tersedia di GitHub.