Apakah praktik yang baik untuk memanggil metode yang mengembalikan nilai benar atau salah dalam pernyataan if?
Sesuatu seperti ini:
private void VerifyAccount()
{
if (!ValidateCredentials(txtUser.Text, txtPassword.Text))
{
MessageBox.Show("Invalid user name or password");
}
}
private bool ValidateCredentials(string userName, string password)
{
string existingPassword = GetUserPassword(userName);
if (existingPassword == null)
return false;
var hasher = new Hasher { SaltSize = 16 };
bool passwordsMatch = hasher.CompareStringToHash(password, existingPassword);
return passwordsMatch;
}
atau apakah lebih baik menyimpannya dalam suatu variabel kemudian membandingkannya menggunakan jika ada nilai-nilai seperti ini
bool validate = ValidateCredentials(txtUser.Text, txtPassword.Text);
if(validate == false){
//Do something
}
Saya tidak hanya merujuk pada .NET, saya merujuk pada pertanyaan dalam semua bahasa pemrograman, kebetulan saya menggunakan .NET sebagai contoh.
if (!validate)
bukanif (validate == false)
.IsValidCredentials
, meskipun secara tata bahasa canggung, adalah format umum untuk menunjukkan nilai pengembalian boolean.!
adalah operator "BUKAN", itu meniadakan ekspresi boolean. Begituif (!validate)
juga sebaliknyaif (validate)
. Pernyataan if akan dimasukkan jikavalidate
tidak benar.Jawaban:
Seperti semua hal ini tergantung.
Jika Anda tidak akan menggunakan hasil panggilan Anda
ValidateCredentials
maka tidak perlu (selain untuk keperluan debugging) untuk menyimpan hasilnya dalam variabel lokal. Namun, jika itu membuat kode lebih mudah dibaca (dan karenanya lebih dapat dipelihara) untuk memiliki variabel pergi dengan itu.Kode tidak akan kurang efisien secara terukur.
sumber
!ValidateCredentials
lebih mudah dibaca karena secara eksplisit mengatakan apa yang dilakukannya dalam kode. Sangat jelas. Jika fungsi yang Anda panggil tidak memiliki nama "mendokumentasikan sendiri" maka mungkin lebih baik untuk pergi dengan variabel. Seperti berdiri, saya akan merekomendasikan menghilangkan variabel dan tetap dengan kode dokumentasi diri yang Anda miliki.Mengapa menggunakan variabel tambahan? Saya lebih suka menggunakan pendekatan pertama, lebih mudah dibaca dan sederhana.
sumber
Ya, jika persyaratannya tidak cukup sederhana untuk sebaris dan membuatnya dapat dibaca.
Anda hanya harus melakukan ini jika Anda menggunakan nilai di banyak tempat atau memerlukannya untuk membuat kode lebih mudah dibaca. Kalau tidak, penugasan ke variabel tidak perlu. Kode yang tidak perlu paling tidak boros dan paling buruk merupakan sumber cacat.
sumber
Biarkan melihat...
Karena ini semua tentang KISS , tidak perlu membuat variabel tambahan ketika Anda bisa melakukannya tanpa itu. Juga, tidak perlu mengetik lagi ... saat tidak perlu.
Tetapi karena Anda KERING , jika nanti Anda menelepon
ValidateCredentials
dan menemukan diriValidateCredentials(txtUser.Text, txtPassword.Text)
Anda mengetik, Anda tahu Anda harus membuat variabel tambahan.sumber
Ya, biasanya baik-baik saja untuk menggunakan metode seperti jika kondisi. Akan sangat membantu jika nama metode menunjukkan bahwa metode mengembalikan bool; misalnya CanValidateCredentials. Dalam bahasa C-style metode ini sering mengambil bentuk awalan Is and Can, dan di Ruby dengan '?' akhiran.
sumber
if (cat.canOpenCanOfCatFood())
.Ada kekhawatiran lain yang belum ditunjukkan: evaluasi hubungan pendek . Apa perbedaan antara kedua fragmen kode ini?
Kelima # 1:
Kelima # 2:
Kedua fragmen kode ini tampaknya melakukan hal yang sama, tetapi jika bahasa Anda mendukung evaluasi hubung singkat, kedua fragmen ini berbeda. Evaluasi hubungan pendek berarti bahwa kode akan mengevaluasi minimum yang diperlukan untuk melewati atau gagal suatu kondisi. Jika contoh # 1, jika foo () mengembalikan false, bar () dan baz () bahkan tidak dievaluasi. Ini berguna jika baz () adalah panggilan fungsi yang telah berjalan lama karena Anda dapat melewatkannya jika foo () mengembalikan false atau foo () mengembalikan true dan bar () mengembalikan false.
Ini tidak terjadi pada contoh # 2. foo (), bar (), dan baz () selalu dievaluasi. Jika Anda mengharapkan bilah () dan baz () menunjukkan efek samping, Anda akan mengalami masalah dengan Contoh # 1. Contoh # 1 di atas sebenarnya setara dengan ini:
Kelima #:
Waspadai perbedaan ini dalam kode Anda saat memilih antara contoh # 1 dan # 2.
sumber
Memperluas sedikit pada masalah keterbacaan ...
Saya dapat memikirkan dua alasan bagus untuk menyimpan hasilnya dalam sebuah variabel:
Jika Anda akan menggunakan kondisi lebih dari sekali, menyimpannya dalam variabel berarti Anda hanya perlu memanggil fungsi satu kali. (Ini mengasumsikan bahwa nilai yang disimpan masih valid; jika Anda perlu mengujinya kembali, tentu saja ini tidak berlaku.)
Jika menyimpannya dalam variabel meningkatkan keterbacaan dengan memberikan kondisi nama yang lebih bermakna daripada apa yang Anda lihat dalam panggilan fungsi.
Sebagai contoh, ini:
tidak membantu keterbacaan, tetapi ini:
mungkin tidak, karena tidak segera jelas itu
feof(file1) && feof(file2)
berarti bahwa kami sudah selesai memproses.The
passwordsMatch
variabel dalam pertanyaan mungkin contoh yang lebih baik dari saya.Variabel sekali pakai berguna jika mereka memberikan nama yang berarti untuk beberapa nilai. (Ini tentu saja untuk kepentingan pembaca manusia.)
sumber
done_processing
variabel. Lagi pula, nama itudone_processing
berfungsi sebagai komentar. Dan komentar nyata memungkinkan saya untuk mengatakan satu atau dua kata tentang mengapa kondisi ini menandakan kami selesai memproses. Bukannya aku seorang komentator hebat, mungkin aku tidak akan melakukan keduanya dalam kode nyata ...done_processing
adalah cara yang lebih tahan lama untuk mengekspresikan maksud.