Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Nota
Konten ini dicetak ulang oleh izin Pearson Education, Inc. dari Panduan Desain Kerangka Kerja: Konvensi, Idiom, dan Pola untuk Pustaka .NET yang Dapat Digunakan Kembali, Edisi ke-2. Edisi itu diterbitkan pada tahun 2008, dan buku tersebut telah sepenuhnya direvisi pada edisi ketiga. Beberapa informasi di halaman ini mungkin sudah kedaluarsa.
Bagian ini menyediakan panduan luas tentang desain parameter, termasuk bagian dengan panduan untuk memeriksa argumen. Selain itu, Anda harus merujuk ke panduan yang dijelaskan dalam Parameter Penamaan.
✔️ DO menggunakan jenis parameter yang paling tidak diturunkan yang menyediakan fungsionalitas yang diperlukan oleh anggota.
Misalnya, Anda ingin merancang metode yang menghitung koleksi dan mencetak setiap item ke konsol. Metode seperti itu harus mengambil IEnumerable sebagai parameter, bukan ArrayList atau IList, misalnya.
❌ JANGAN gunakan parameter yang tidak boleh digunakan.
Jika lebih banyak input ke anggota diperlukan dalam beberapa versi mendatang, kelebihan beban baru dapat ditambahkan.
❌ JANGAN memiliki metode yang diekspos secara publik yang mengambil pointer, array penunjuk, atau array multidimensional sebagai parameter.
Pointer dan array multidmensional relatif sulit digunakan dengan benar. Dalam hampir semua kasus, API dapat dirancang ulang untuk menghindari mengambil jenis ini sebagai parameter.
✔️ DO menempatkan semua parameter out
setelah semua parameter berdasarkan nilai dan ref
(tidak termasuk array parameter), bahkan jika menghasilkan inkonsistensi dalam urutan parameter antara overload (lihat Member Overloading).
Parameter out
dapat dilihat sebagai nilai pengembalian ekstra, dan mengelompokkannya bersama-sama membuat tanda tangan metode lebih mudah dipahami.
Pastikan konsistensi dalam penamaan parameter saat menimpa atau menerapkan anggota antarmuka.
Ini lebih baik mengomunikasikan hubungan antara metode.
Memilih Antara Parameter Enum dan Boolean
✔️ DO gunakan enum jika suatu anggota akan memiliki dua atau lebih parameter Boolean.
❌ JANGAN gunakan Boolean kecuali Anda benar-benar yakin tidak akan pernah ada kebutuhan untuk lebih dari dua nilai.
Enum memberi Anda beberapa ruang untuk penambahan nilai di masa mendatang, tetapi Anda harus mengetahui semua implikasi penambahan nilai ke enum, yang dijelaskan dalam Desain Enum.
✔️ PERTIMBANGKAN menggunakan Boolean untuk parameter konstruktor yang benar-benar memiliki dua keadaan dan hanya digunakan untuk menginisialisasi properti Boolean.
Memvalidasi Argumen
✔️ DO memvalidasi argumen yang diteruskan ke anggota publik, dilindungi, atau diimplementasikan secara eksplisit. Lempar System.ArgumentException, atau salah satu subkelasnya, jika validasi gagal.
Perhatikan bahwa validasi aktual tidak harus terjadi di publik atau anggota yang dilindungi itu sendiri. Ini bisa terjadi pada tingkat yang lebih rendah dalam beberapa rutinitas privat atau internal. Poin utamanya adalah bahwa seluruh area permukaan yang terekspos kepada pengguna akhir bertugas memverifikasi argumen.
✔️ DO memunculkan ArgumentNullException jika argumen null diberikan dan anggota tersebut tidak mendukung argumen null.
✔️ DO memvalidasi parameter enum.
Jangan asumsikan argumen enum akan berada dalam rentang yang ditentukan oleh enum. CLR memungkinkan transmisi nilai bilangan bulat apa pun ke dalam nilai enum bahkan jika nilai tidak ditentukan dalam enum.
❌ JANGAN gunakan Enum.IsDefined untuk pemeriksaan rentang enum.
✔️ PERLU diketahui bahwa argumen yang dapat diubah mungkin telah berubah setelah divalidasi.
Jika anggota sensitif terhadap keamanan, Anda dianjurkan untuk membuat salinan lalu memvalidasi dan memproses argumen.
Pengoperan Parameter
Dari perspektif perancang kerangka kerja, ada tiga grup parameter utama: parameter berdasarkan nilai, parameter ref
, dan parameter out
.
Saat argumen diteruskan melalui parameter berdasarkan nilai, anggota menerima salinan argumen aktual yang diberikan. Jika argumen adalah jenis nilai, salinan argumen diletakkan pada tumpukan. Jika argumen adalah jenis referensi, salinan referensi diletakkan pada tumpukan. Bahasa CLR paling populer, seperti C#, VB.NET, dan C++, default untuk meneruskan parameter menurut nilai.
Saat argumen diteruskan melalui ref
parameter, anggota menerima referensi ke argumen aktual yang diteruskan. Jika argumen adalah jenis nilai, referensi ke argumen diletakkan pada tumpukan. Jika argumen adalah tipe referensi, rujukan ke referensi tersebut diletakkan pada tumpukan.
Ref
parameter dapat digunakan untuk memungkinkan anggota mengubah argumen yang diteruskan oleh pemanggil.
Out
parameter-parameter serupa dengan ref
parameter-parameter, dengan beberapa perbedaan kecil. Parameter pada awalnya dianggap belum ditetapkan dan tidak dapat dibaca dalam isi anggota sebelum diberi nilai. Selain itu, parameter harus diberi beberapa nilai sebelum anggota kembali.
❌ HINDARI menggunakan parameter out
atau ref
.
Menggunakan out
atau ref
parameter memerlukan pengalaman dengan pointer, memahami perbedaan jenis nilai dan jenis referensi, dan menangani metode dengan beberapa nilai pengembalian. Selain itu, perbedaan antara parameter out
dan ref
tidak dipahami secara luas. Arsitek kerangka kerja yang merancang untuk audiens umum seharusnya tidak mengharapkan pengguna menjadi mahir dalam bekerja dengan parameter out
atau ref
.
❌ JANGAN meneruskan tipe referensi dengan cara referensi.
Ada beberapa pengecualian terbatas untuk aturan, seperti metode yang dapat digunakan untuk menukar referensi.
Anggota dengan Jumlah Parameter Variabel
Anggota yang dapat mengambil jumlah variabel argumen dinyatakan dengan menyediakan parameter array. Misalnya, String berikan metode berikut:
public class String {
public static string Format(string format, object[] parameters);
}
Pengguna kemudian dapat memanggil String.Format metode , sebagai berikut:
String.Format("File {0} not found in {1}",new object[]{filename,directory});
Menambahkan kata kunci params C# ke parameter array mengubah parameter menjadi parameter array params dan menyediakan pintasan untuk membuat array sementara.
public class String {
public static string Format(string format, params object[] parameters);
}
Melakukan ini memungkinkan pengguna untuk memanggil metode dengan meneruskan elemen array langsung dalam daftar argumen.
String.Format("File {0} not found in {1}",filename,directory);
Perhatikan bahwa kata kunci param hanya dapat ditambahkan ke parameter terakhir dalam daftar parameter.
✔️ PERTIMBANGKAN untuk menambahkan kata kunci param ke parameter array jika Anda mengharapkan pengguna akhir meneruskan array dengan sejumlah kecil elemen. Jika diharapkan bahwa banyak elemen akan diteruskan dalam skenario umum, pengguna mungkin tidak akan meneruskan elemen-elemen ini sebaris, dan jadi kata kunci param tidak diperlukan.
❌ HINDARI menggunakan array param jika pemanggil hampir selalu memiliki input yang sudah ada dalam array.
Misalnya, anggota dengan parameter array byte hampir tidak akan pernah dipanggil dengan melewati byte individual. Untuk alasan ini, parameter array byte di .NET Framework tidak menggunakan kata kunci params.
❌ JANGAN gunakan array param jika array dimodifikasi oleh anggota yang mengambil parameter array params.
Karena fakta bahwa banyak pengkompilasi mengubah argumen ke anggota menjadi array sementara di situs panggilan, array mungkin merupakan objek sementara, dan oleh karena itu setiap modifikasi pada array akan hilang.
✔️ PERTIMBANGKAN untuk menggunakan kata kunci param dalam kelebihan beban sederhana, bahkan jika kelebihan beban yang lebih kompleks tidak dapat menggunakannya.
Tanyakan pada diri Anda apakah pengguna akan menghargai memiliki array param dalam satu kelebihan beban meskipun tidak dalam semua kelebihan beban.
✔️ LAKUKAN pengurutan parameter untuk memungkinkan penggunaan kata kunci params.
✔️ PERTIMBANGKAN untuk menyediakan kelebihan beban khusus dan jalur kode untuk panggilan dengan sejumlah kecil argumen dalam API yang sangat sensitif terhadap performa.
Ini memungkinkan untuk menghindari pembuatan objek array ketika API dipanggil dengan sejumlah kecil argumen. Bentuk nama parameter dengan mengambil bentuk tunggal dari parameter array dan menambahkan akhiran numerik.
Anda harus melakukan ini hanya jika Anda akan membuat kasus khusus untuk seluruh jalur pemrograman, bukan hanya membuat array dan memanggil metode yang lebih umum.
✔️ PERLU diketahui bahwa null dapat diteruskan sebagai argumen array params.
Anda harus memvalidasi bahwa array tidak null sebelum diproses.
❌ JANGAN gunakan varargs
metode , atau dikenal sebagai elipsis.
Beberapa bahasa CLR, seperti C++, mendukung konvensi alternatif untuk meneruskan daftar parameter variabel yang disebut varargs
metode. Konvensi tidak boleh digunakan dalam kerangka kerja, karena tidak sesuai dengan CLS.
Parameter Penunjuk
Secara umum, pointer tidak boleh muncul di area permukaan publik dari kerangka kerja kode terkelola yang dirancang dengan baik. Pada umumnya, pointer harus dienkapsulasi. Namun, dalam beberapa kasus pointer diperlukan untuk alasan interoperabilitas, dan menggunakan pointer dalam kasus seperti itu sesuai.
✔️ HARUS menyediakan alternatif untuk setiap anggota yang menerima argumen pointer, karena pointer tidak sesuai dengan CLS.
❌ HINDARI melakukan pemeriksaan yang memakan biaya tinggi terhadap argumen terkait pointer.
✔️ HARUS mengikuti konvensi umum terkait pointer saat merancang anggota kode dengan pointer.
Misalnya, tidak perlu meneruskan indeks awal, karena aritmatika pointer sederhana dapat digunakan untuk mencapai hasil yang sama.
© Sebagian 2005, 2009 Microsoft Corporation. Seluruh hak cipta dilindungi.
Dicetak ulang oleh izin Pearson Education, Inc. dari Panduan Desain Kerangka Kerja: Konvensi, Idiom, dan Pola untuk Pustaka .NET yang Dapat Digunakan Kembali, Edisi ke-2 oleh Krzysztof Cwalina dan Brad Abrams, diterbitkan 22 Okt 2008 oleh Addison-Wesley Professional sebagai bagian dari Seri Pengembangan Microsoft Windows.