Definisi: Satu objek harus tahu paling sedikit tentang objek lain
Konsep inti hukum Dimitri adalah memisahkan antara kelas dan kopling yang lemah. Hanya setelah kopling lemah dapat digunakan kembali kelas dapat ditingkatkan.
Metafora yang lebih jelas mirip dengan: tahanan di penjara tidak boleh menghubungi orang di luar, tentu saja mungkin ada kerabat yang berkunjung. Penjara di sini adalah kelas, para tahanan di dalam adalah informasi di dalam kelas, dan penjaga penjara di penjara setara dengan penegak hukum Dimit.
Hukum Dimit mengklaim:
(1) dalam hal divisi kelas, kelas dengan kopling yang lemah harus dibuat;
(2) dalam desain struktur kelas, setiap kelas harus meminimalkan hak akses anggota;
(3) dalam desain kelas, jika memungkinkan, kelas harus dirancang sebagai kelas yang tidak berubah;
(4) dalam hal referensi ke kelas lain, referensi suatu objek ke objek lain harus diminimalkan;
(5) cobalah untuk meminimalkan hak akses ke kelas;
(6) menggunakan fungsi serialisasi dengan hati -hati;
(7) Jangan mengekspos anggota kelas, tetapi berikan aksesor (properti) yang sesuai.
Untuk memberi contoh: ada perusahaan grup, dan unit bawahan memiliki cabang dan departemen langsung. Sekarang diperlukan untuk mencetak ID karyawan dari semua unit bawahan. Pertama -tama mari kita lihat desain yang melanggar aturan Dimit.
// Kepala Pegawai Kantor Pusat {Private String ID; public void setid (string id) {this.id = id; } public String getId () {return id; }} // Cabang Kelas Karyawan Subpajar {ID Private String; public void setid (string id) {this.id = id; } public String getId () {return id; }} kelas subkompanyManager {daftar publik <subsployee> getAllEmployee () {Daftar <Subsployee> Daftar = ArrayList baru <SubeMregneree> (); untuk (int i = 0; i <100; i ++) {Subpajar EMP = Subpajar baru (); // Tetapkan ID ke Personel Cabang di urutan emp.setId ("Cabang"+i); list.add (emp); } daftar pengembalian; }} class CompanyManager {Daftar publik <Proudge> getAlleMreyee () {Daftar <Proudgleee> Daftar = ArrayList baru <ereackleee> (); untuk (int i = 0; i <30; i ++) {karyawan emp = karyawan baru (); // Tetapkan ID ke personel kantor pusat agar emp.setid ("Kepala Perusahaan"+i); list.add (emp); } daftar pengembalian; } public void printAllEmployee (subcompanyManager sub) {list <subsployee> list1 = sub.getAlleMreyee (); untuk (subsployee e: list1) {system.out.println (e.getid ()); } Daftar <eployee> list2 = this.getAllEmployee (); untuk (karyawan e: list2) {system.out.println (e.getid ()); }}} klien kelas publik {public static void main (string [] args) {companyManager e = new CompanyManager (); e.printallemployee (SubcompanyManager baru ()); }} Masalah utama dari desain ini sekarang adalah di CompanyManager. Menurut Hukum Dimit, hanya komunikasi dengan teman -teman langsung yang terjadi, dan kelas sub -karyawan bukanlah teman langsung dari kelas perusahaan perusahaan (kopling yang muncul sebagai variabel lokal bukan milik teman langsung). Secara logis, kantor pusat hanya perlu digabungkan dengan cabangnya dan tidak memiliki hubungan dengan karyawan cabang. Desain ini jelas menambahkan kopling yang tidak perlu. Menurut hukum Dimit, hubungan hubungan teman tidak langsung seperti itu harus dihindari di kelas. Kode yang dimodifikasi adalah sebagai berikut:
kelas SubcompanyManager {Daftar Publik <Subsployee> getAllEmployee () {Daftar <Subsployee> Daftar = ArrayList baru <subsployee> (); untuk (int i = 0; i <100; i ++) {Subpajar EMP = Subpajar baru (); // Tetapkan ID ke Personel Cabang di urutan emp.setId ("Cabang"+i); list.add (emp); } daftar pengembalian; } public void printEmployee () {List <Pristyee> list = this.getAllEmployee (); for (subsployee e: list) {System.out.println (e.getId ()); }}} class CompanyManager {Daftar publik <Proudge> getAlleMreyee () {Daftar <Prodesseee> Daftar = ArrayList baru <ereackleee> (); untuk (int i = 0; i <30; i ++) {karyawan emp = karyawan baru (); // Tetapkan ID ke personel kantor pusat agar emp.setid ("Kepala Perusahaan"+i); list.add (emp); } daftar pengembalian; } public void printAllEmployee (subcompanymanager sub) {sub.printemployee (); Daftar <eployee> list2 = this.getAllemployee (); untuk (karyawan e: list2) {system.out.println (e.getid ()); }}} Setelah modifikasi, metode pencetakan ID personel ditambahkan ke cabang, dan kantor pusat secara langsung memanggilnya untuk mencetak, sehingga menghindari penggabungan dengan karyawan cabang.
Tujuan asli dari undang -undang Dimitter adalah untuk mengurangi kopling antar kelas. Karena setiap kelas mengurangi dependensi yang tidak perlu, memang mungkin untuk mengurangi hubungan kopling. Tapi semuanya memiliki standar sendiri. Meskipun dapat menghindari komunikasi dengan tipe tidak langsung, untuk berkomunikasi, Anda pasti akan menghubungi cabang melalui "perantara". Misalnya, dalam hal ini, kantor pusat menghubungi karyawan cabang melalui cabang sebagai "perantara". Penggunaan prinsip dimit yang berlebihan akan menghasilkan sejumlah besar kelas perantara dan transmisi tersebut, menghasilkan kompleksitas sistem yang lebih besar. Oleh karena itu, ketika mengadopsi hukum Dimitr, kita harus berulang kali menimbang pertukaran, yang tidak hanya memastikan struktur yang jelas, tetapi juga membutuhkan kohesi tinggi dan kopling rendah.