En iyi uygulama boole ataması [kapalı]


10

Başka bir geliştiriciden devraldığım bir programda aşağıdaki koşulla karşılaştım:

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.NeedsChange = false;
}

Bu kod gereksiz ve çirkin olduğuna inanıyorum, bu yüzden bir karşılaştırma dayalı basit bir boole atama olduğunu düşündüm ne değiştirdim:

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE;

Bunu gördükten sonra, kodumu inceleyen biri, değişikliğimin işlevsel olarak doğru olmasına rağmen, başka birisinin ona baktığını karıştırabileceğini söyledi. Üçlü bir operatör kullanmanın bu atamayı daha açık hale getirdiğine inanıyor, oysa daha fazla kod eklemeyi sevmiyorum:

obj.NeedsChange = (obj.Performance <= LOW_PERFORMANCE) ? true : false;

Onun akıl yürütmesi, başka bir geliştiricinin tam olarak ne yaptığınızı durdurup bulması gerektiğine neden olursa, bir şeyi en özlü bir şekilde yapmaya değmez.

Buradaki asıl soru, boole değer atamak için kullanılan bu üç yöntemden hangisinin obj.NeedsChangeen açık ve en sürdürülebilir olmasıdır.


25
Üçüncü form saçma; sadece ikinci formda neyin açıkça bariz olması gerektiğini belirtiyor.
Robert Harvey

6
Bu tamamen kişisel tercihinize bağlıdır. Aksi taklit edebiliriz, ancak hepsi işlevsel olarak eşdeğer oldukları için stil haline gelir . Elbette, okunabilirlikte bir fark var, ancak "okunabilir ve şeffaf"
durumum

3
@ scriptin 5-8 satır v 1 satır tercihten daha fazladır, 5-8 astar genellikle daha net ve daha iyidir. Bu basit örnekte, 1 çizgisini tercih ediyorum, ancak genel olarak rahatlık için 1 astarlara gizlenmiş çok fazla 10 astar gördüm. Bu nedenle, varyant 1'den asla şikayet etmem, hoş olmayabilir ama işi açıkça ve açıkça yapıyor.
gbjbaanb

4
Seçenek 1 ve 3 bana "Yazar boole mantığını gerçekten anlamıyor" diyor.
17 arasında 26

2
Değere bağlı olarak sık sık bir kesme noktası ayarlamanız gerekiyorsa 1 değişkeni yararlı olabilir.
Ian

Yanıtlar:


39

2'yi tercih ederim, ancak küçük bir ayarlamaya gidebilirim:

obj.NeedsChange = ( obj.Performance <= LOW_PERFORMANCE );

Bana göre parantezler satırın ayrıştırılmasını kolaylaştırır ve bir bakışta bir karşılaştırmanın sonucunu atadığınızı ve bir çift atama gerçekleştirmediğinizi netleştirir. Neden (emin değilim olarak parantez aslında bir çift atama önleyeceğini bir dil düşünemiyorum) emin değilim, ama gözden geçiren tatmin tatmin ederseniz, o zaman bu belki de kabul edilebilir bir uzlaşma olacaktır.


4
bu doğru cevaptır - sorudaki kod doğru olmasına rağmen, parantez eklemek okuyucuya ödev olmadığını söyler. Hızlı bir şekilde kodu inceliyor olsaydınız, köşeli parantezler, kodun böyle olup olmadığını ve kazara bir hata olmadığını görmek için size daha yakından bakmanızı engelleyen anında ekstra bilgi verir. Örneğin, çizginin a = b == cbir bool atamasını mı kastettiniz, yoksa hem b'ye hem de a'ya c atamayı mı kastettiniz?
gbjbaanb

Parantezler Python'da çift atamayı önleyecektir. Çift atamayı engellemedikleri dillerde bile, parantezler kesinlikle iki tür işlemle uğraştığınızı belirtmeye yardımcı olur.
user2357112 Monica

23

Varyant 1 kolayca anlaşılabilir, ancak tek avantajı budur. Bu şekilde yazan herkesin boolean'ların ne hakkında olduğunu gerçekten anlamadığını ve diğer birçok açıdan benzer şekilde çocukça kod yazacağını otomatik olarak varsayıyorum.

Varyant 2 her zaman yazacağım ve okumayı umduğum şeydir. Bence o deyim tarafından kafası karışmış olan kimsenin profesyonel bir yazılım yazarı olmaması gerekir.

Varyant 3, hem 1 hem de 2'nin dezavantajlarını birleştirir.


Varyant 1, avantajını varyant 2 ile paylaşıyor ...
Deduplicator

1
İnfantil kod için +1. Yıllardır böyle bir koda bakıyorum, onu tanımlamak için doğru kelimeden yoksundum.
Lilienthal

1
Varyant 1 gibi kodla ilgili ilk varsayımım, geçmişte bir noktada iki dalın daha karmaşık olduğu ve birisinin yeniden düzenleme yaparken dikkat etmediğidir. Bununla birlikte, ilk yazıldığında
böyleyse

13

Herzaman kodu "bunun ne yapması gerekiyor?" okuyucuda koku.

Örneğin, ilk örnek beni merak ediyor, "if / else deyiminde kaldırılan bir noktada başka işlevler var mıydı?"

Örnek (2) basit, açık ve tam olarak ne gerekiyorsa yapıyor. Ben okudum ve hemen kodun ne yaptığını anlıyorum.

(3) 'deki ekstra tüyler, yazarın (2) yerine neden böyle yazdığını merak etmeme neden olacaktı. Orada gereken bir sebebi olmalı, ama bu sözdizimi yoktur şey mevcut anlaşılacağı çünkü okumak zordur hiç yararlı değil ve bu yüzden bu durumda, orada görünmüyor. Neyin var olduğunu (hiçbir şey olmadığında) öğrenmeye çalışmak, kodun okunmasını zorlaştırır.


2

Varyant 2 ve Varyant 1'in bir dizi açık ve basit yeniden düzenleme yoluyla ilişkili olduğunu görmek kolaydır:

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.NeedsChange = false;
}

Burada, gereksiz kod çoğaltmamız var, atamayı etkisiz hale getirebiliriz:

obj.NeedsChange = if (obj.Performance <= LOW_PERFORMANCE)
{
    true
}
else
{
    false
}

ya da daha kısaca yazılmışlar:

obj.NeedsChange = if (obj.Performance <= LOW_PERFORMANCE) true else false

Şimdi, koşul doğruysa bunun doğru atayacağı ve koşul yanlışsa yanlış atayacağı hemen anlaşılmalıdır, IOW sadece koşulun değerini atayacaktır, yani

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE

Varyant 1 ve 3, karşılaştırmanın dönüş değerinin ne olduğunu anlamayan biri tarafından yazılmış tipik çaylak kodudur.


Eğer güzel olandan önce yorum olarak if (...) ... yanlış kısmını eklerdim, daha sonra kod netliği ve daha iyi kod ile basit bir tarama elde edersiniz.
DaveM

2

"Kodunuzu korumak biter adam nerede yaşadığını bilen bir şiddet psikopat olacak sanki" programlama örtülü üzerinde açık doğru eğiliminde gerekirken, sen yapabilirsiniz birkaç temel sanmaya senin psiko halefi yetkili olacağı.

Bunlardan biri , kullandığı dilin sözdizimidir .

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE;

C / C ++ / C # / Java / Javascript sözdizimini bilen herkese çok açıktır.

Ayrıca 8 satırdan çok daha okunabilir.

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.NeedsChange = false;
}

ve hatalara daha az eğilimli

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.Needschange = false;
}

Ve gereksiz karakterleri eklemekten daha iyidir, sanki dilin sözdizimini yarı unuttum:

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE ? true : false;

obj.NeedsChange = (obj.Performance <= LOW_PERFORMANCE);

Birçok dilin C benzeri sözdizimi hakkında çok yanlış olduğunu düşünüyorum: tutarsız işlem sırası, tutarsız sol / sağ ilişkilendirilebilirlik, sembollerin aşırı kullanımı, parantez / girinti çoğaltma, üçlü operatörler, infix gösterimi, vb.

Ancak çözüm, kendi tescilli versiyonunuzu icat etmek değildir. Bu şekilde çılgınlık yatar, çünkü herkes kendi yarattığını yaratır.


Genellikle Real World TM kodunu okunamaz kılan # 1 şey bunun miktarıdır.

Patolojik olmayan 200 hat programı ve önemsiz özdeş 1.600 hat programı arasında, daha kısa olanın ayrıştırılması ve anlaşılması neredeyse her zaman daha kolay olacaktır. Değişikliğinizi her gün memnuniyetle karşılarım.


1

Geliştiricilerin çoğu 2. formu bir bakışta anlayabilecek. Benim görüşüme göre, sadeleştirme üzerine 1. formda olduğu gibi gereksizdir.

Aşağıdakiler gibi boşluklar ve kaşlı ayraçlar ekleyerek okunabilirliği artırabilirsiniz:

obj.NeedsChange =    obj.Performance <= LOW_PERFORMANCE;

veya

obj.NeedsChange = ( obj.Performance <= LOW_PERFORMANCE );

Jacob Raihle tarafından belirtildiği gibi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.