Prinsip Terbuka / Tertutup di Jawa

1. Ikhtisar

Dalam tutorial ini, kita akan membahas Open / Closed Principle (OCP) sebagai salah satu prinsip SOLID dari pemrograman berorientasi objek.

Secara keseluruhan, kami akan menjelaskan secara rinci tentang apa prinsip ini dan bagaimana menerapkannya saat merancang perangkat lunak kami.

2. Prinsip Terbuka / Tertutup

Seperti namanya, prinsip ini menyatakan bahwa entitas perangkat lunak harus terbuka untuk ekstensi, tetapi ditutup untuk modifikasi. Akibatnya, ketika persyaratan bisnis berubah maka entitas dapat diperpanjang, tetapi tidak dapat diubah.

Untuk ilustrasi di bawah ini, kita akan fokus pada bagaimana antarmuka adalah salah satu cara untuk mengikuti OCP.

2.1. Tidak Patuh

Mari kita pertimbangkan kita sedang membangun aplikasi kalkulator yang mungkin memiliki beberapa operasi, seperti penjumlahan dan pengurangan.

Pertama-tama, kami akan menentukan antarmuka tingkat atas - CalculatorOperation :

public interface CalculatorOperation {}

Mari kita definisikan kelas Addition , yang akan menambahkan dua angka dan mengimplementasikan 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 }

Saat ini, kita hanya memiliki satu kelas Penjumlahan, jadi kita perlu mendefinisikan kelas lain bernama Pengurangan :

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 kita, yang akan melakukan operasi kalkulator kita:

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

Meskipun ini tampak bagus, ini bukan contoh OCP yang baik. Ketika persyaratan baru untuk menambahkan fungsi perkalian atau pembagian masuk, kami tidak punya cara selain mengubah metode penghitungan kelas Kalkulator .

Karenanya, kami dapat mengatakan kode ini tidak sesuai dengan OCP.

2.2. Sesuai OCP

Seperti yang telah kita lihat, aplikasi kalkulator kami belum sesuai dengan OCP. Kode dalam metode hitung akan berubah dengan setiap permintaan dukungan operasi baru yang masuk. Jadi, kita perlu mengekstrak kode ini dan meletakkannya di lapisan abstraksi.

Salah satu solusinya adalah dengan mendelegasikan setiap operasi ke kelasnya masing-masing:

public interface CalculatorOperation { void perform(); }

Akibatnya, kelas Addition dapat mengimplementasikan logika penambahan dua angka:

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

Demikian pula, kelas Pengurangan yang diperbarui akan memiliki logika yang serupa. Dan juga untuk Penambahan dan Pengurangan , sebagai permintaan perubahan baru, kita bisa melaksanakan pembagian logika:

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 terakhir, kelas Kalkulator kami tidak perlu mengimplementasikan logika baru saat 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 modifikasi tetapi terbuka untuk ekstensi.

3. Kesimpulan

Dalam tutorial ini, kita telah mempelajari apa itu OCP menurut definisi, kemudian menguraikan definisi tersebut. Kami kemudian melihat contoh aplikasi kalkulator sederhana yang memiliki cacat desain. Terakhir, kami membuat desain yang bagus dengan membuatnya sesuai dengan OCP.

Seperti biasa, kode tersedia di GitHub.