Saya baru-baru ini memilah spesifikasi perusahaan, dan di antaranya, "jumlah parameter suatu fungsi tidak boleh melebihi 4" agak kontroversial selama promosi. Jika tugas dapat diselesaikan, semakin sedikit parameter, semakin baik kontroversial, namun Melakukan hal ini dapat menyebabkan kesulitan ketika membuat program, dan terdapat perdebatan mengenai apakah hal tersebut layak dilakukan. Menurut saya, hal ini bermanfaat untuk memudahkan orang yang menggunakan fungsi. Adapun kesulitan dalam pemrograman, sering kali karena kita tidak memahami beberapa metode pengurangan parameter.
1. Gunakan struktur untuk merangkum parameter
Contoh: Tambahkan pengguna
Badan fungsi asli: AddUser (string nama pengguna, kata sandi string, alamat string, telepon string, usia int)
Refactor: tambahkan kelas Pengguna:
Pengguna kelas
{
string publik Nama Pengguna { dapatkan;
string publik Kata sandi { dapatkan;
string publik Alamat { dapatkan;
string publik Telepon { dapatkan;
public int Usia { dapatkan; }
}
Ubah AddUser menjadi: AddUser(Pengguna pengguna)
Masalah: Jika kelas yang ditambahkan tidak digunakan di tempat lain, kami sering merasa bahwa kelas tersebut tidak layak digunakan. Saat ini, kami dapat mempertimbangkan untuk menggunakan kelas anonim untuk merangkum parameter.
2. Gunakan atribut untuk mengganti parameter
Jika metode AddUser di 1 ditempatkan di kelas Pengguna, maka parameter pengguna dalam metode AddUser dapat dihilangkan. Terkadang beberapa atribut dapat ditambahkan untuk mengurangi jumlah parameter di beberapa metode. Dalam desain berorientasi objek, objek harus bertanggung jawab terhadap dirinya sendiri, dan tanggung jawab harus didefinisikan dengan jelas. Alasan mengapa suatu metode memiliki terlalu banyak parameter mungkin karena metode tersebut ditulis di tempat yang tidak seharusnya ada. Model "pakar informasi" yang disebutkan dalam prinsip GRASP dapat mengurangi jumlah parameter dalam banyak kasus.
Contoh : Transfer rekening
Fungsi asli: Transfer (Rekening dari, Rekening ke, uang desimal)
Pemfaktoran ulang:
kode
Proses Transfer kelas publik
{
Akun pribadi Dari;
Akun pribadi Ke;
Proses Transfer publik (Rekening dari, Rekening ke)
{
ini.Dari = dari;
ini.Ke = ke;
}
Public void Transfer (uang desimal)
{
jika (uang<Dari.Uang)
{
Dari.Uang = Dari.Uang - uang;
Ke.Uang = Ke.Uang + uang;
//perbarui basis data
}
kalau tidak
{
throw new Exception("Saldo terlampaui");
}
}
}
Catatan: Pola pakar informasi adalah prinsip paling dasar dari desain berorientasi objek. Saat kita mendesain objek (kelas), jika suatu kelas memiliki semua informasi yang diperlukan untuk menyelesaikan tanggung jawab tertentu, maka tanggung jawab ini harus ditugaskan ke kelas ini untuk implementasi. . Saat ini, kelas ini adalah ahli informasi yang sesuai dengan tanggung jawab ini.
3. Gunakan fungsi pribadi
Saat memanggil suatu fungsi, seringkali kita tidak memerlukan banyak parameter interaktif, namun saat kita menyediakan parameter, kita perlu menyediakan semua kondisi. Saat ini, kita dapat mengklasifikasikan fungsi, merangkum fungsi yang paling kompleks sebagai fungsi pribadi, dan mengeksposnya Panggil fungsi kompleks ini untuk menyelesaikan fungsi tersebut. Mari kita lihat implementasi metode TextBox di mvc:
kode
public static string TextBox(HtmlHelper htmlHelper ini, nama string, nilai objek, IDictionary<string, object> htmlAttributes) {
return InputHelper(htmlHelper, InputType.Text, nama, nilai, (nilai == null) /* useViewData */, false /* isChecked */, true /* setId */, true /* isExplicitValue */, htmlAttributes);
}
string statis pribadi InputHelper(HtmlHelper htmlHelper ini, InputType inputType, nama string, nilai objek, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, IDictionary<string, object> htmlAttributes) {
if (String.IsNullOrEmpty(nama)) {
melempar ArgumentException baru(MvcResources.Common_NullOrEmpty, "nama");
}
TagBuilder tagBuilder = TagBuilder baru("input");
... ...
Namun terkadang untuk memberikan fleksibilitas maksimum kepada pemanggil, kami juga dapat mengekspos fungsi yang paling rumit secara berlebihan.
4. kata kunci params
Menentukan bahwa jika jumlah parameter adalah variabel, parameter metode dari parameter tersebut digunakan.
penggunaan:
kode
kekosongan statis Utama (string[] args)
{
UseParams(1, 2, 3);
}
public static void UseParams(params int[] daftar)
{
untuk (int i = 0; i < daftar.Panjang; i++)
{
Console.WriteLine(daftar[i]);
}
Konsol.WriteLine();
}
Cara ini sebenarnya tidak mengurangi jumlah parameter, namun hanya menyederhanakan fungsi body.
5. Gunakan kelas anonim untuk merangkum parameter
Pengetahuan persiapan: Mari kita lihat RouteValueDictionary terlebih dahulu
kode
kekosongan statis Utama (string[] args)
{
RouteValueDictionary r = RouteValueDictionary baru(baru { id=1,name="lfm"});
foreach (item var di r)
{
Console.WriteLine("{0}:{1}", item.Key, item.Value);
}
//Konsol.WriteLine();
}
hasil:
nomor identitas:1
nama:lfm
RouteValueDictionary dapat menyimpan nama atribut dan nilai atribut instance ke dalam kamus.
Banyak tempat di mvc menggunakan metode ini untuk meneruskan parameter.
Misalnya: <%= Html.ActionLink("Detail", "Detail", baru { id=item.id })%>
Di badan metode ActionLink, RouteValueDictionary digunakan untuk menguraikan objek anonim dan kemudian merakitnya ke dalam tautan.