Kapan "Coba" seharusnya digunakan dalam nama metode C #?

180

Kami sedang berdiskusi dengan rekan kerja kami tentang apa artinya jika nama metode dimulai dengan "Coba".

Ada beberapa pendapat berikut:

  • Gunakan "Coba" ketika metode dapat mengembalikan nilai nol.
  • Gunakan "Coba" ketika metode tidak akan melempar pengecualian.

Apa definisi resmi? Apa yang "Coba" katakan dalam nama metode? Apakah ada pedoman resmi tentang ini?

ms007
sumber
83
+1 Orang yang menaruh banyak perhatian pada nama fungsi mereka sebenarnya mencari "orang berikutnya". Tidak yakin mengapa ini mendapatkan suara yang dekat (dan itu datang dari seorang pria yang memberikan banyak dari mereka malam ini.)
Jonathon Reinhart
7
@JonathonReinhart, mendapat suara hampir karena "Seperti saat ini, pertanyaan ini tidak cocok untuk format Tanya Jawab kami. Kami berharap jawaban didukung oleh fakta, referensi, atau keahlian khusus, tetapi pertanyaan ini kemungkinan akan mengundang debat, argumen , jajak pendapat, atau diskusi panjang. "
Pranav Hosangadi
16
Ada adalah pernyataan resmi oleh Microsoft yang menjawab pertanyaan (lihat jawaban saya). Bagaimana itu bukan fakta?
Erik Schierboom
6
@PranavHosangadi seperti yang disebutkan Erik, didukung oleh fakta. Juga, ada banyak pengembang C # yang sangat berpengalaman di sini yang memiliki keahlian khusus untuk memberikan jawaban yang valid. Sial, Eric Lippert adalah kepala arsitek bahasa C #. Saya pikir Anda dapat memanggil keahlian khusus itu .
Jonathon Reinhart
4
@ErikSchierboom Bahwa itu pedoman MS adalah fakta. Bahwa pedoman MS adalah pedoman yang tepat untuk digunakan adalah subjektif dan dapat diperdebatkan.
Servy

Jawaban:

148

Ini dikenal sebagai pola TryParse dan telah didokumentasikan oleh Microsoft. Halaman Pengecualian dan Kinerja MSDN resmi mengatakan :

Pertimbangkan pola TryParse untuk anggota yang dapat melempar pengecualian dalam skenario umum untuk menghindari masalah kinerja yang terkait dengan pengecualian.

Jadi, jika Anda memiliki kode yang menggunakan case biasa berarti bahwa ia mungkin mengeluarkan pengecualian (seperti parsing int), pola TryParse masuk akal.

Erik Schierboom
sumber
2
Tautan lain yang bermanfaat yang mendokumentasikan pola ini (mencari TryParse) blogs.msdn.com/b/kcwalina/archive/2005/03/16/396787.aspx
Vivek Maharajh
2
Pada dasarnya, jika Anda memiliki metode TryParse, Anda harus memiliki metode Parse yang melempar ketika TryParse akan mengembalikan false. Sebaliknya, jika Anda memiliki metode Parse, Anda harus mempertimbangkan memiliki metode TryParse yang mengembalikan false ketika Parse akan melempar
3Doubloons
5
+1. Hanya untuk menambah ini, pengecualian biasanya untuk keadaan "luar biasa". Jika Anda melakukan sesuatu yang dapat dengan mudah gagal dan kegagalan itu tidak terlalu menonjol, maka menggunakan pola ini lebih idiomatis daripada mencoba / menangkap
Adam Robinson
Apakah pola seperti itu benar-benar memerlukan pedoman dari Microsoft? Sepertinya hal yang cukup mendasar.
Dave Lawrence
19
Ini adalah hal-hal mendasar, tetapi itu tidak berarti bahwa pedoman tidak berguna. Mendapatkan hal-hal dasar dengan benar bisa sangat sulit jika Anda tidak tahu platformnya dengan cukup baik.
Erik Schierboom
119

(Dikoreksi) Ada pedoman resmi, seperti yang disarankan Erik.

Ketika saya melihat TrySomethingmetode, saya menganggapnya

  • tidak melempar
  • kembali bool
  • jika saya mengharapkan nilai, itu dikembalikan melalui parameter 'keluar'
  • ada Somethingmetode, yang memungkinkan saya untuk menangani pengecualian apa pun sendiri. (sunting, disarankan oleh Jesse Webb)
tidak ada
sumber
4
Koreksi - Ini memiliki pedoman resmi. Lihat jawaban Erik.
nothrow
8
+1 Tetapi saya juga memiliki ekspektasi ke-4: Jika ada TryFoometode, akan ada Foometode serupa yang memungkinkan saya untuk menangani pengecualian `` sendiri. Tanda tangan metode ini kemungkinan akan berbeda sehingga penggunaannya tidak dapat dipertukarkan tanpa perubahan kode lainnya.
Jesse Webb
1
@ JesseWebb, terima kasih sudah menunjukkannya. Saya telah menambahkan komentar Anda ke dalam jawaban saya, jika Anda tidak keberatan.
nothrow
1
"Tidak melempar" menurut saya terlalu umum. Misalnya, Int32.TryParse (String, NumberStyles, IFormatProvider, Int32) melempar ArgumentException jika tidak menyukai parameter style.
Jirka Hanika
Saya setuju bahwa "tidak melempar" dapat dianggap terlalu umum, tetapi saya percaya maksudnya adalah untuk menyampaikan bahwa itu tidak melempar sebagai hasil dari eksekusi daripada sebagai hasil dari nilai parameter.
ConfusingBoat
8

Saya pikir Anda harus menggunakan tryketika Anda ingin melanjutkan. Tidak masalah bahwa suatu metode mengembalikan beberapa nilai atau tidak.

Kasus 1: jika kembali baik, Anda dapat melanjutkan dengan beberapa cara.

Kasus 2: jika tidak kembali: masih baik; Anda dapat melanjutkan dengan cara lain.

Dan jika Anda mengharapkan beberapa nilai sebagai output dari metode itu maka gunakan outparameter tersebut.

Contoh

int value
if (dictionary.TryGetValue("key", out value))
{
    // Proceed in some way
}
else
{
    // Proceed in some other way
}
Ashok Damani
sumber
6

Anda harus menggunakan "Coba" dalam nama metode, ketika Anda ingin memanifestasikan fakta bahwa metode invokation dapat menghasilkan hasil yang tidak valid. Mengikuti standar. NET itu, omong-omong, bukan fungsi yang menimbulkan pengecualian, tetapi fungsi yang mengembalikan beberapa VALIDatauNON_VALID , dari perspektif program, nilai.

Pada akhirnya, ini semua tentang konvensi penamaan yang Anda putuskan untuk digunakan dalam grup Anda.

Tigran
sumber
5

Pastikan tryAnda memasukkan nama metode Anda jika:

  • Anda tidak membuang pengecualian
  • metode Anda memiliki tanda tangan berikut: bool TrySomething(input, out yourReturn)

Jadi pada dasarnya jika kita gunakan try -metode kita hanya mendapatkan hasil boolean kembali.

Jadi kode berikut tidak akan memberikan pengecualian:

string input = "blabla";
int number;
if (int.TryParse(input, out number))
{
// wooohooo we got an int!
} else
{
//dooh!
}

Sedangkan kode ini dapat (dan dalam hal ini akan) memberikan pengecualian:

string input = "blabla";
int number;
try
{
     number = int.Parse(input); //throws an exception
}
catch (Exception)
{
     //dooh!
}

Menggunakan metode Coba adalah cara yang lebih aman dan lebih defensif untuk kode. Cuplikan kode # 2 membutuhkan lebih banyak kinerja untuk dijalankan jika bukan bilangan bulat.

Fabian Bigler
sumber
Cuplikan kode # 2 Anda harus dibaca int number = int.Parse(input);jika Anda menginginkannya lebih bermakna dalam konteks ini.
Pierre Arnaud
@PierreArnaud Terima kasih, ubah!
Fabian Bigler
Anda masih melewatkan int number;deklarasi sebelum blok coba dan number = ...tugas.
Pierre Arnaud
@PierreArnaud Terima kasih, saya juga memasukkan 'int number' sekarang.
Fabian Bigler
Perhatikan bahwa Anda mungkin masih melempar pengecualian jika pengecualian tersebut agak tidak terkait dengan tindakan langsung yang dilakukan, seperti TryLoadFile(path, out file)woah, dari RAM. Jadi penelepon akan mengharapkan tidak ada kesalahan untuk jalur yang buruk atau akses ditolak, tetapi pengecualian untuk hal-hal aneh yang juga bisa salah. Dan mendokumentasikannya.
Luke Puplett
0

Paman Bob memberikan contoh di bawah ini dalam bukunya Clean Code . Setiap kali kami mengharapkan pengecualian dilemparkan, kami dapat menggunakan Tryawalan ke nama metode:

public void sendShutDown()
{
    try{
        tryToShutDown();
    } catch (DeviceShutDownError e) {
        logger.log(e);            
    }
}

Dan kemudian (diadaptasi):

private void tryToShutDown()
{
    //some code with no error handling, but
    //something might go wrong here
}

The tryToShutDownMetode tidak membuat penanganan kesalahan, karena itulah tanggung jawab sendShutDownmetode.

The TryParsepola Microsoft melanggar pedoman kode yang bersih yang mengatakan bahwa kita harus menghindari parameter output.

Jika kami tidak mengembangkan versi baru C #, kami tidak harus mematuhi semua pedoman Microsoft. Terkadang mereka bukan yang terbaik.

Glauber
sumber