Bagikan melalui


Desain Parameter

Catatan

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 memberikan panduan luas tentang desain parameter, termasuk bagian dengan panduan untuk memeriksa argumen. Selain itu, Anda harus mengacu pada panduan yang dijelaskan dalam Parameter Penamaan.

✔️ PASTIKAN untuk menggunakan jenis parameter yang paling sedikit diturunkan yang menyediakan fungsionalitas yang dibutuhkan oleh anggota.

Misalnya, Anda ingin merancang metode yang menghitung koleksi dan mencetak setiap item ke konsol. Metode seperti itu harus menggunakan IEnumerable sebagai parameter, bukan ArrayList atau IList.

❌ JANGAN menggunakan parameter yang dicadangkan.

Jika lebih banyak input ke anggota diperlukan di beberapa versi mendatang, overload baru dapat ditambahkan.

❌ JANGAN menggunakan metode yang diekspos secara terbuka yang menggunakan pointer, larik pointer, atau larik multidimensi sebagai parameter.

Pointer dan larik multidimensi relatif sulit digunakan dengan benar. Di hampir semua kasus, API dapat dirancang kembali untuk menghindari penggunaan jenis ini sebagai parameter.

✔️ PASTIKAN untuk menempatkan semua parameter out mengikuti semua by-value dan parameter ref (tidak termasuk larik parameter), meskipun hal ini mengakibatkan inkonsistensi dalam pengurutan parameter di antara overload (lihat Overloading Anggota).

Parameter out dapat dilihat sebagai nilai pengembalian ekstra, dan mengelompokkannya bersama membuat tanda tangan metode lebih mudah dipahami.

✔️ PASTIKAN untuk konsisten dalam memberi nama parameter saat mengganti anggota atau menerapkan anggota antarmuka.

Hal ini harus mengkomunikasikan hubungan antara metode.

Memilih Antara Parameter Enum dan Boolean

✔️ PASTIKAN untuk menggunakan enum jika anggota memiliki dua atau lebih parameter Boolean.

❌ JANGAN menggunakan Boolean kecuali Anda benar-benar yakin tidak akan pernah membutuhkan lebih dari dua nilai.

Enum memberi Anda ruang untuk penambahan nilai di masa mendatang, tetapi Anda harus menyadari semua implikasi menambahkan nilai ke enum, yang dijelaskan dalam Desain Enum.

✔️ PERTIMBANGKAN untuk menggunakan Boolean untuk parameter konstruktor yang benar-benar merupakan nilai dua-status dan hanya digunakan untuk menginisialisasi properti Boolean.

Memvalidasi Argumen

✔️ PASTIKAN untuk memvalidasi argumen yang diteruskan ke anggota publik, dilindungi, atau diterapkan secara eksplisit. Munculkan System.ArgumentException, atau salah satu subkelasnya, jika validasi gagal.

Perhatikan bahwa validasi sebenarnya tidak harus terjadi di publik atau anggota yang dilindungi itu sendiri. Validasi dapat terjadi pada tingkat yang lebih rendah dalam beberapa rutinitas privat atau internal. Poin utamanya adalah bahwa seluruh area permukaan yang diperlihatkan ke pengguna akhir memeriksa argumen.

✔️ PASTIKAN untuk memunculkan ArgumentNullException jika argumen null diteruskan dan anggota tidak mendukung argumen null.

✔️ PASTIKAN untuk memvalidasi parameter enum.

Jangan berasumsi bahwa argumen enum akan berada dalam rentang yang ditentukan oleh enum. Runtime bahasa umum memungkinkan mengonversi nilai bilangan bulat apa pun secara eksplisit menjadi nilai enum bahkan jika nilai tidak ditentukan dalam enum.

❌ JANGAN menggunakan Enum.IsDefined untuk pemeriksaan rentang enum.

✔️ PASTIKAN untuk mengetahui bahwa argumen yang dapat diubah mungkin telah berubah setelah divalidasi.

Jika anggota sensitif terhadap keamanan, Anda dianjurkan untuk membuat salinan dan memvalidasi serta memproses argumen.

Penerusan Parameter

Dari perspektif perancang kerangka kerja, ada tiga grup parameter utama: parameter by-value, parameter ref, dan parameter out.

Saat argumen diteruskan melalui parameter by-value, anggota menerima salinan argumen aktual yang diteruskan. Jika argumen adalah jenis nilai, salinan argumen diletakkan di tumpukan. Jika argumen adalah jenis referensi, salinan referensi diletakkan di tumpukan. Bahasa runtime bahasa umum paling populer, seperti C#, VB.NET, dan C++, default untuk meneruskan parameter berdasarkan nilai.

Saat argumen diteruskan melalui parameter ref, anggota menerima referensi ke argumen aktual yang diteruskan. Jika argumen adalah jenis nilai, referensi ke argumen diletakkan di tumpukan. Jika argumen adalah jenis referensi, referensi ke referensi diletakkan di tumpukan. Parameter Ref dapat digunakan untuk mengizinkan anggota mengubah argumen yang diteruskan oleh pemanggil.

Parameter Out mirip dengan parameter ref, dengan beberapa perbedaan kecil. Parameter awalnya dianggap tidak ditetapkan dan tidak dapat dibaca di bagian anggota sebelum diberi beberapa nilai. Selain itu, parameter harus diberi beberapa nilai sebelum anggota kembali.

❌ HINDARI menggunakan parameter out atau ref.

Menggunakan parameter out atau ref 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 jenis referensi berdasarkan referensi.

Ada beberapa pengecualian terbatas pada aturan, seperti metode yang dapat digunakan untuk menukar referensi.

Anggota dengan Jumlah Variabel Parameter

Anggota yang dapat mengambil sejumlah variabel argumen diekspresikan dengan menyediakan parameter larik. Misalnya, String menyediakan metode berikut:

public class String {
    public static string Format(string format, object[] parameters);
}

Pengguna kemudian dapat memanggil metode String.Format, sebagai berikut:

String.Format("File {0} not found in {1}",new object[]{filename,directory});

Menambahkan kata kunci params C# ke parameter larik akan mengubah parameter menjadi parameter larik params dan menyediakan pintasan untuk membuat larik sementara.

public class String {
    public static string Format(string format, params object[] parameters);
}

Melakukan hal ini memungkinkan pengguna memanggil metode dengan meneruskan elemen larik secara langsung dalam daftar argumen.

String.Format("File {0} not found in {1}",filename,directory);

Perhatikan bahwa kata kunci params hanya dapat ditambahkan ke parameter terakhir dalam daftar parameter.

✔️ PERTIMBANGKAN untuk menambahkan kata kunci params ke parameter larik jika Anda mengharapkan pengguna akhir meneruskan larik dengan sejumlah kecil elemen. Jika diharapkan banyak elemen akan diteruskan dalam skenario umum, pengguna mungkin tidak akan meneruskan elemen ini sebaris, sehingga kata kunci params tidak diperlukan.

❌ HINDARI menggunakan larik params jika pemanggil hampir selalu memiliki input dalam larik.

Misalnya, anggota dengan parameter larik byte hampir tidak akan pernah dipanggil dengan meneruskan masing-masing byte. Untuk alasan ini, parameter larik byte di .NET Framework tidak menggunakan kata kunci params.

❌ JANGAN menggunakan larik params jika larik diubah oleh anggota yang mengambil parameter larik params.

Karena fakta bahwa banyak kompilator mengubah argumen ke anggota menjadi larik sementara di situs panggilan, larik mungkin menjadi objek sementara, dan oleh karena itu modifikasi apa pun pada larik akan hilang.

✔️ PERTIMBANGKAN untuk menggunakan kata kunci params dalam overload sederhana, bahkan jika overload yang lebih kompleks tidak dapat menggunakannya.

Tanyakan pada diri Anda sendiri apakah pengguna akan menghargai memiliki larik params dalam satu overload meskipun tidak dalam semua overload.

✔️ PASTIKAN untuk mencoba mengurutkan parameter untuk memungkinkan menggunakan kata kunci params.

✔️ PERTIMBANGKAN untuk menyediakan overload khusus dan jalur kode untuk panggilan dengan sejumlah kecil argumen di API yang sangat sensitif terhadap performa.

Hal ini memungkinkan menghindari dari membuat objek larik saat API dipanggil dengan sejumlah kecil argumen. Bentuk nama parameter dengan mengambil bentuk tunggal dari parameter larik dan menambahkan sufiks numerik.

Anda hanya boleh melakukan hal ini jika Anda akan mengkhususkan seluruh jalur kode, bukan hanya membuat larik dan memanggil metode yang lebih umum.

✔️ PASTIKAN untuk mengetahui bahwa null dapat diteruskan sebagai argumen larik params.

Anda harus memvalidasi bahwa larik bukan merupakan null sebelum diproses.

❌ JANGAN menggunakan metode varargs, atau dikenal sebagai elipsis.

Beberapa bahasa runtime bahasa umum, seperti C++, mendukung konvensi alternatif untuk meneruskan daftar parameter variabel yang disebut metode varargs. Konvensi tidak boleh digunakan dalam kerangka kerja, karena tidak sesuai dengan CLS.

Parameter Pointer

Secara umum, pointer tidak boleh muncul di area permukaan publik dari kerangka kerja kode aman yang dirancang dengan baik. Sebagian besar waktu, pointer harus disertakan. Tetapi, dalam beberapa kasus pointer diperlukan untuk alasan interoperabilitas, dan menggunakan pointer dalam kasus tersebut adalah tepat.

✔️ PASTIKAN untuk memberikan alternatif untuk setiap anggota yang mengambil argumen pointer, karena pointer tidak sesuai dengan CLS.

❌ HINDARI melakukan pemeriksaan argumen yang mahal dari argumen pointer.

✔️ PASTIKAN untuk mengikuti konvensi terkait pointer yang umum saat merancang anggota dengan pointer.

Misalnya, tidak perlu meneruskan indeks awal, karena aritmetika pointer sederhana dapat digunakan untuk mencapai hasil yang sama.

Portions © 2005, 2009 Microsoft Corporation. Semua hak dilindungi undang-undang.

Dicetak ulang dengan izin dari Pearson Education, Inc. dari Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition oleh Krzysztof Cwalina dan Brad Abrams, diterbitkan 22 Okt 2008 oleh Addison-Wesley Professional sebagai bagian dari Seri Pengembangan Microsoft Windows.

Lihat juga