Pemfaktoran Ulang Kode - Mendapatkan Enkapsulasi Contoh Pengkodean DELPHI Pemfaktoran ulang kode adalah cara untuk mendapatkan struktur yang baik. Melalui pemfaktoran ulang, kita dapat meningkatkan kualitas kode dan meningkatkan tingkat penggunaan kembali kode sambil menjaga fungsinya tidak berubah. Berikut adalah contoh nyata tentang cara meningkatkan kualitas kode dan mendapatkan enkapsulasi. (Contohnya menggunakan DELPHI) Fungsi kode: Mengatur filter untuk kumpulan data (TClientDataSet). Pengguna dapat memilih bidang yang akan difilter di TComboBox, lalu memasukkan nilai yang akan difilter di kotak Tedit. Seperti yang ditunjukkan pada Gambar 1: Metode yang paling umum adalah dengan melakukan hard-code pada nama bidang dalam kumpulan data kita di atribut Items di TComboBox, lalu menambahkan banyak pernyataan case atau if ke kode untuk menentukan bidang yang dipilih oleh pengguna untuk mengatur filter untuk perangkat data. ...... kasus ComboBox1.ItemIndex of0: ClientDataSet.Filtered := Salah; ClientDataSet.Filter := ' F_CODE = ''' + Edit2.Text + ''''; .Difilter := Salah; ClientDataSet.Filter := ' F_CHINESE_NAME = ''' + Edit2.Teks + ''''; ClientDataSet.Filtered := True;... end; Atau gunakan... if ComboBox1.Text = 'Material Code' lalu mulai ClientDataSet.Filtered := False ClientDataSet.Filter := ' F_CODE = ''' + Edit2.Text + ''''; ClientDataSet.Filtered := True;endelse if ComboBox1.Text = 'nama' lalu mulai ClientDataSet.Filtered := False; ClientDataSet.Filter := ' F_CHINESE_NAME = ''' + Edit2.Text + ''''; ClientDataSet.Filtered := True;end... Kode ini juga mengimplementasikan filter pengaturan untuk kumpulan data melalui fungsi pengkodean keras memenuhi kebutuhan, tetapi kode di atas tidak fleksibel. Jika kumpulan data memiliki banyak bidang, pembuat kode harus memasukkan bidang tersebut satu per satu di Item, dan urutannya harus diperiksa saat menulis kasus. Jika tidak, filter kumpulan akan salah dan akan mudah bagi pengembang untuk memperkenalkannya SERANGGA. Hal ini juga menyakitkan untuk mempertahankan sejumlah besar pernyataan if saat menggunakan if, dan itu tidak mendukung perubahan permintaan. Saat pengguna meminta untuk mengubah nama tampilan berbahasa Mandarin dari bidang kumpulan data, ia juga harus ingat untuk mengubah data yang dikodekan secara keras di TComboBox Items. Jika Anda lupa, BUG akan diperkenalkan. Jadi pada rekonstruksi pertama, saya mencoba memuat data secara dinamis di TComboBox Items, dan pada saat yang sama, untuk mencapai perbandingan ketika pengguna memilih setelah memuat. Saya menambahkan bidang pribadi FFields: array[0..20, 0..2] of string; ke FORMULIR kueri ini untuk menyimpan data informasi bidang dalam kumpulan data. Pada saat yang sama, proses memuat data diimplementasikan: PROcedure TFrmSPARealStorageQuery.GetQueryFields;var i, iFieldsCount: Integer;begin iFieldsCount := 0 dengan DBGride1.DataSource.DataSet dimulai untuk i := 0 hingga Fields.Count - 1; lakukan jika Fields[ i].Visible lalu mulai FFields[iFieldsCount, 0] := Bidang[i].FieldName; FFields[iFieldsCount, 1] := Bidang[i].DisplayLabel; Inc(iFieldsCount); (FFields[i, 1]); end;end; Ini memungkinkan pemuatan informasi lapangan secara dinamis saat runtime. Jadi pengaturan filter saya terlihat seperti ini. jika ComboBox1.Text <> '' makabeginClientDataSet.Filtered := Salah; ClientDataSet.Filter := FFields[ComboBox1.ItemIndex, 0] + '''' + Edit2.Text + ''''; end; Metode ini tidak diragukan lagi meningkatkan fleksibilitas kode dan meningkatkan penggunaan kembali kode, karena kode tersebut terisolasi dengan baik dari perubahan data. Oleh karena itu, dapat dikatakan nyaman selama Anda menambahkan bidang pribadi FFields: array[0..20, 0..2] string dalam FORMULIR lain yang juga ingin mengimplementasikan fungsi ini dan menggunakan proses di atas secara dinamis memuat bidang kumpulan data. Namun penggunaan kembali ini tidak terlalu baik karena kita belum mencapai enkapsulasi yang baik. Hal ini menyebabkan kode duplikat tersebar di mana-mana di program Anda (Anda sering menggunakan COPY untuk menggunakan kembali fungsi ini, karena kode di atas tidak memiliki enkapsulasi yang baik). Jika suatu hari Anda ingin mengubah fungsi pemuatan data, Anda harus mencari tempat untuk menyalin fungsi tersebut - dan Anda harus mengubah kode yang tersebar di tempat lain. Jadi saya memfaktorkannya lagi dan merangkum kodenya lebih lanjut. Kodenya adalah sebagai berikut: unit uDataSetFieldsInfo; // Deskripsi: Unit ini menyertakan kelas TDataSetFieldsInfo, yang merangkum perolehan informasi sub-segmen kumpulan data. // Dan menyediakan antarmuka metode untuk menampilkan informasi di bidang tampilan daftar kombo dan mendapatkan nama subbagian yang sesuai // Dibuat : wuchhao // Tanggal : 2003.5interfaceuses Classes, DBClient, StdCtrls;type TDataSetFieldsInfo = class private FFieldsList: TStrings; Buat ; destruktor Hancurkan; prosedur GetDataSetFields (Sumber: TClientDataSet); prosedur ShowFieldsInfo(Target: TComboBox); fungsi GetFieldsNameByDisplayLabel(DisplayLabel: string): string; akhir;implementasi{ TDataSetFieldsInfo }konstruktor TDataSetFieldsInfo.Create;mulai FFieldsList := TStringList.Create;end;destructor TDataSetFieldsInfo.Destroy;mulai FFieldsList.Free; diwariskan;akhir;prosedur TDataSetFieldsInfo.GetDataSetFields(Sumber: TClientDataSet);var i: Integer;mulai FFieldsList.Clear; dengan Sumber dimulai untuk i := 0 hingga Fields.Count - 1 lakukan jika Bidang[i].Terlihat lalu mulai FFieldsList.Add(Fields[i].DisplayLabel); FFieldsList.Add(Fields[i].FieldName); end; end;end;function TDataSetFieldsInfo.GetFieldsNameByDisplayLabel( DisplayLabel: string): string;var indeks: Integer;mulai Hasil: = ''; indeks := FFieldsList.IndexOf(DisplayLabel); <> -1 lalu Hasil := FFieldsList.Strings[index+1] ;end;prosedur TDataSetFieldsInfo.ShowFieldsInfo(Target: TComboBox);var i: Integer;mulai Target.Items.Clear; .Hitung mulai Target.Items.Add(FFieldsList.Strings[i]); i:= i+ 2; end;end;end. Unit uDataSetFieldsInfo merangkum data dan metode yang terkait dengan realisasi fungsi yang dijelaskan dalam artikel ini, dan merangkumnya dalam sebuah kelas, sehingga mewujudkan prinsip Buka - Tutup dalam desain berorientasi objek. Kelas menjadi kotak hitam, sehingga dapat dengan mudah digunakan kembali (black-box reuse) tanpa khawatir akan duplikasi kode. Pada saat yang sama, karena merangkum informasi terkait fungsi, tanggung jawab kelas didefinisikan dengan jelas (tanggung jawab tunggal), dan memiliki rincian yang cukup serta enkapsulasi yang baik. TdataSetFieldsInfo secara efektif mengisolasi kotak kombo dari perubahan data, yang pada akhirnya meningkatkan tingkat penggunaan kembali kode sekaligus mengurangi tanggung jawab kelas FORM dan jumlah angka ajaib hard-coding. Berikut kode barunya: Pertama, deklarasikan referensi ke kelas TdataSetFieldsInfo di FORM. ...Panggil saat FORM dibuat: FFieldsInfo := TDataSetFieldsInfo.Create;FFieldsInfo.GetDataSetFields(cdMaster);FFieldsInfo.ShowFieldsInfo(ComboBox1); := Salah; ClientDataSet.Filter := FFieldsInfo.GetFieldsNameByDisplayLabel(ComboBox1.Text) + '''' + Edit2.Text + ''''; ClientDataSet.Filtered := True;end; nama. Artikel ini adalah contoh sederhana dari kode refactoring. Saya rasa kelas yang saya terapkan di atas dapat ditulis dengan banyak cara dan memiliki algoritma yang lebih baik. Ini hanya untuk memberikan gambaran tentang pemfaktoran ulang kode. Untuk meningkatkan kualitas kode kita serta pemeliharaan dan skalabilitasnya, kita akan mengeksplorasi ide-ide tentang metode pemrograman OOD.