Metode Boolean Penamaan Afirmatif vs Negatif

44

Haruskah metode boolean selalu mengambil bentuk afirmatif, bahkan ketika mereka hanya akan digunakan dalam bentuk negatif?

Katakanlah saya ingin memeriksa apakah suatu entitas ada sebelum membuat entitas, argumen saya adalah bahwa bentuk pertama di bawah ini lebih baik daripada bentuk kedua, apakah metode tersebut pernah digunakan dalam bentuk afirmatif atau tidak.

Singkatnya, saya menemukan if(!affirmative)lebih mudah dibaca daripada if(negative). Saya punya rekan yang tidak setuju, pikir?

Bentuk pertama:

int entity_id = 42;
if(!entity_exists(entity_id)) create_entity(entity_id);

Bentuk kedua:

int entity_id = 42;
if(entity_not_exist(entity_id)) create_entity(entity_id);
lynks
sumber
3
C ++? bagaimanaif (not entity_exists(entity_id))
Kos
to-may-to to mah-to. Jujur, saya telah kehilangan !karakter berkali-kali menyebabkan saya salah mengerti kode sampai saya membacanya lagi. Jadi saya mungkin lebih setuju dengan rekan kerja Anda. Saya suka formulir yang bernilai true saat Anda memeriksanya.
Berin Loritsch
Hanya ingin berpadu untuk mengatakan bahwa itu if (!exists) create()dapat dilihat sebagai praktik buruk dalam banyak bahasa / kerangka kerja, karena cenderung tidak aman. Biasanya, pendekatan yang disukai adalah memanggil create()dan menangani pengecualian khusus atau mengembalikan kode yang mengatakan bahwa entitas sudah ada. Ini tentu saja bukan jawaban untuk pertanyaan yang sebenarnya (itulah sebabnya ini hanya komentar).
julealgon

Jawaban:

61

Haruskah metode boolean selalu mengambil bentuk afirmatif, bahkan ketika mereka hanya akan digunakan dalam bentuk negatif?

Membuat aturan tentang hal-hal seperti itu tampaknya sedikit banyak - saya tidak ingin melihat pedoman dalam dokumen standar pengkodean yang mengatakan bahwa Anda tidak boleh menggunakan nama negatif untuk properti boolean . Tetapi sebagai masalah gaya pribadi, saya pikir berusaha untuk menjaga nama tetap positif bisa menjadi cita-cita yang bagus. Namun, saya pikir itu juga baik untuk menghindari kebutuhan untuk yang kurus dan mudah terjawab !. Orang sering dapat menemukan cara untuk mengubah nama negatif menjadi nama positif:

  • accountHasCharges
  • accountIsClear(sama seperti !accountHasCharges)

Kejelasan adalah pertimbangan yang paling penting, dan alasan yang baik untuk menghindari nama metode negatif adalah bahwa mereka dapat menyebabkan dua kali lipat negatif atau lebih buruk:

  • isComplete // baik
  • isNotComplete //! IsComplete biasanya lebih baik
  • isIncomplete // bisa masuk akal jika 'tidak lengkap' adalah keadaan objek yang diketahui
  • !isNotComplete // mengerikan
  • !isNotComplete == 0 // dapat menyebabkan liburan permanen
Caleb
sumber
5
"Saya tidak ingin melihat pedoman dalam dokumen standar pengkodean yang mengatakan bahwa Anda tidak boleh menggunakan nama negatif untuk properti boolean ." - Saya akan meninggalkan ini di sini ...
AakashM
16
Anda lupa!isNotIncomplete
Ben Lee
Jadi apakah kebalikan dari entity_existsmenjadi entity_should_be_created(bukan entity_not_exists)? Atau mungkin entity_missingsesuai saran Dan?
ADTC
1
Di sinilah dokumen standar pengkodean dapat menggunakan kata "prefer" daripada "should" atau "must".
Wayne Conrad
15

Saya setuju bahwa afirmatif lebih mudah dibaca. Anda mungkin mencoba

Bentuk ketiga

int entity_id = 42;
if (entity_is_missing(entity_id)) create_entity(entity_id);

atau

Formulir Keempat

int entity_id = 42;
if (is_entity_missing(entity_id)) create_entity(entity_id);
Dan Pichelman
sumber
2

Ini juga tergantung pada bagaimana metode Anda akan digunakan. Jika itu akan digunakan dalam kasus afirmatif dan negatif, misalnya

if (!entity_exists(entity_id)) create_entity(entity_id);

if (entity_exists(entity_id)) publish_entity(entity_id);

Maka nama metode harus dalam afirmatif, seperti di atas. Jika Anda tidak yakin bagaimana ini akan digunakan, maka pertahankan di atas.

Tetapi jika itu HANYA digunakan dalam kasus negatif, maka yang berikut ini dapat diterima (bahkan mungkin diinginkan)

if (entity_not_exists(entity_id)) create_entity(entity_id);

atau bahkan lebih baik reword untuk lebih afirmatif

if (entity_is_absent(entity_id)) create_entity(entity_id);
Zack Xu
sumber