Tekankan negasi


13

Saya hanya menulis pernyataan if dengan nama properti yang cukup panjang dan menemukan masalah ini.

Katakanlah kita memiliki pernyataan if seperti ini:

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
   !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}

Properti kedua adalah tipe boolean dan tidak masuk akal untuk memiliki stetement seperti

if(boleanValue == true)

Apakah ada cara yang lebih baik untuk menekankan negasi kemudian meletakkannya !di depan. Bagi saya sepertinya ini dapat dengan mudah diawasi ketika membaca kode dan berpotensi menyebabkan masalah dengan debug


7
Ekstrak kondisi menjadi metode dengan nama yang bermakna.
Joachim Sauer

2
... atau tetapkan nilai yang dinegasikan ke variabel dengan nama yang bermakna dan gunakan dalam kondisi if.
scrwtp

+1 apa yang dikatakan @JoachimSauer, jika mungkin letakkan metode itu pada objek yang sedang ditanyakan .. Dalam hal ini seluruh kondisi dapat dienkapsulasi dengan metode di_someViewModelNameThatIsLong
MattDavey

2
Suatu hal umum yang sering saya lakukan adalah mengelilingi negasi dengan ruang di setiap sisi untuk membuatnya lebih terlihat. if( ! something)vsif(!something)
Svish

Jika Anda menekankan negasi, mengapa tidak digunakan ... && model.Prop == false)? Secara pribadi saya sangat jarang menggunakan !, terlalu mudah untuk diabaikan.

Jawaban:


22
if(_someViewModelNameThatIsLong.NeedsMeToDoSomething(someValue))
{
    //Do something
}

Dan kemudian, dalam objek model tampilan

public bool NeedsMeToDoSomething(string someValue)
{
    return AnotherPropertyINeedToCheck == someValue &&
        !ThisIsABooleanPropertyThatIsImportant;
}

(dengan asumsi someValue adalah string dan tidak dikenal oleh objek model)

Ini tidak hanya menekankan! operator, tetapi membuatnya lebih mudah dibaca secara umum. Sekarang, dalam metode pemanggilan, saya dapat melihat satu kondisi, yang seharusnya dinamai dengan baik untuk menggambarkan kondisi dalam konteks objek pemanggilan. Dan dalam objek model, saya bisa melihat apa artinya itu dalam konteks objek model.


1
+1, ini adalah penerapan prinsip pakar informasi yang baik .
MattDavey

1
Perlu dicatat, someValuemungkin perlu menjadi parameter untuk NeedsMeToDoSomethingmetode ini, tergantung pada situasi Anda.
MattDavey

@MattDavey: Oh, bagus.
pdr

@ pdr Mungkin Anda harus membuat properti ke model tampilan dengan boolean yang sama dan menggunakan kembali bendera itu di lebih banyak tempat. Saya yakin Anda akan menemukannya berguna.
radu florescu

5

Letakkan di blok if sendiri sebelum mengevaluasi kondisi yang kurang penting. Tidak hanya akan lebih mudah untuk membaca tanpa kekacauan dari kondisi lain, tetapi juga kondisi pertama yang akan dibaca oleh seorang programmer. Gabungkan ini dengan ide yang telah disebutkan oleh @scrwtp untuk menetapkan ke variabel dengan nama yang bermakna dan Anda mendapatkan:

var isValid = !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant;
if( isValid ) 
{
    if( _someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue ) 
    {
        //Do something
    }
}

Jika Anda memprogram dalam bahasa kompiler, sering kali blok-blok ini bersarang jika digabungkan pada akhirnya, asalkan Anda tidak memasukkan kode antara outer if dan inner if, jadi itu seharusnya tidak mempengaruhi kinerja di dalamnya kasus.


2

Jika Anda menggunakan C / C ++ maka preprocessor dapat memberikan keterbacaan.

#define NOT !

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
    NOT _someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}

atau mungkin ... berfungsi bukan (x) {return! x; } // javascript
Alex

2
Operator di C dan C ++ Sudah ada sinonim standar untuk berbagai operator.
Joel

0

Saya baru saja mengekstrak

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

Dalam Metode yang mengembalikan ini. Jika Anda memberi nama metode ini NotThisIsABooleanPropertyThatIsImportant Anda harus baik-baik saja.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.