Küme parantezleri olmadan bir if ifadesini kullanmak kötü bir uygulama mı? [kapalı]


131

Bunun gibi bir kod gördüm:

if(statement)
    do this;
else
    do this;

Ancak bunun daha okunaklı olduğunu düşünüyorum:

if(statement){
    do this;
}else{
    do this;
}

Her iki yöntem de işe yaradığına göre, bu yalnızca hangisinin kullanılacağı bir tercih meselesi mi yoksa bir yol diğerine göre tavsiye edilir mi?



Bence bu kötü çünkü neredeyse hiçbir zaman tam olarak tutarlı olmayan boşluk girintisine güvenmeye başlıyorsunuz. Bu tür şeyler hakkında endişelenmeleri gerektiğinde okuyucunun düşünce trenini raydan çıkarır.
Sridhar Sarnobat

Yanıtlar:


214

İlk sürümle ilgili sorun, eğer geri dönüp if veya else cümlelerine küme parantezlerini eklemeyi hatırlamadan ikinci bir ifade eklerseniz, kodunuzun beklenmedik ve eğlenceli şekillerde kırılacağıdır.

Sürdürülebilirlik açısından, ikinci formu kullanmak her zaman daha akıllıcadır.

DÜZENLEME: Ned yorumlarda buna dikkat çekiyor, ancak bence buraya da bağlanmaya değer. Bu sadece bir fildişi kulesi varsayımsal saçmalık değil: https://www.imperialviolet.org/2014/02/22/applebug.html


17
Ve her zaman sürdürülebilirlik için kodlamalısınız. Sonuçta, derleyicinin hangi formu kullandığınızı umursamadığından oldukça eminim. Bununla birlikte, aptalca bir küme ayracı hatası nedeniyle bir hata ortaya koyarsanız, iş arkadaşlarınız pist olabilir.
Esteban Araya

12
Ya da kod blokları için parantez kullanmayan bir dil kullanabilirsiniz ...
Tor Valamo

10
@ lins314159 - Hayır, python gibi. Çünkü bu konuda şovenistim.
Tor Valamo

17
Daha fazla kanıt hatası olabilir (ve olabilir): imperialviolet.org/2014/02/22/applebug.html
Ned

8
SSL hatasının kaşlı ayraçlar lehine bir argüman olduğunu iddia etmek samimiyetsizdir. Sanki geliştirici yazmak istemiyor if (…) { goto L; goto L; }ama kaşlı ayraçları unutmuş gibi. Tamamen rastlantısaldır, `` if (…) {goto L; Goto L; } `bir güvenlik hatası değildir, çünkü yine de bir hatadır (güvenlik sonuçları olan bir hata değildir). Başka bir örnekte, işler ters yönde gidebilir ve ayraçsız kod yanlışlıkla güvenli olabilir. Üçüncü bir örnekte, parantezsiz kod başlangıçta hatasız olacaktır ve geliştirici parantezleri eklerken bir yazım hatası ortaya koyacaktır.
Pascal Cuoq

113

İfade bloklarını dışarıda bırakmakla ilgili bir sorun, başka belirsizliktir. Bu C'den ilham alan diller girintiyi görmezden gelir ve bu nedenle bunu ayırmanın hiçbir yolu yoktur:

if(one)
    if(two)
        foo();
    else
        bar();

Bundan:

if(one)
    if(two)
        foo();
else
    bar();

8
Bu, en üstteki yanıtta belirtilenden çok daha ciddi bir sorundur (ikinci bir ifade ekleyerek).

3
aslında, bu cevap beni bu cevapları alaycı bir şekilde okumaktan biraz endişeli olmaya götürdü. Aslında bu hatayı yapmış olabilirim.
omikes

3
C'nin onu hangi şekilde yorumladığımı merak eden biri varsa, GCC ile yaptığım bir test bu kodu ilk olarak yorumluyor. tpcg.io/NIYeqx
horta

3
"belirsizlik" yanlış terimdir. Ayrıştırıcının bunu nasıl göreceğine dair hiçbir belirsizlik yoktur: elseaçgözlülükle en yakın, en içteki ile bağlanır if. Sorun, C veya benzeri dillerin bunu bilmeyen, bunu düşünmeyen veya henüz yeterince kahvesi olmayan kişiler tarafından kodlandığı durumlarda ortaya çıkar - bu yüzden bir şeyi yapacaklarını düşündükleri kodu yazarlar, ancak dil spesifikasyonu, ayrıştırıcının çok farklı olabilecek başka bir şey yapması gerektiğini söylüyor. Ve evet, bu, gramer onları teorik olarak 'gereksiz' olarak işaretlese bile, her zaman diş tellerinin dahil edilmesini destekleyen bir başka sağlam argümandır.
underscore_d

35

Genel modelim, bir satıra sığarsa şunu yapacağımdır:

if(true) do_something();

Başka bir cümle varsa veya yürütmek istediğim kod trueönemli bir uzunluktaysa, tüm yol boyunca parantezler:

if(true) {
    do_something_and_pass_arguments_to_it(argument1, argument2, argument3);
}

if(false) {
    do_something();
} else {
    do_something_else();
}

Sonuçta, sübjektif bir stil ve okunabilirlik meselesine varılır. Bununla birlikte, genel programlama dünyası, hemen hemen iki tarafa ayrılır (parantez kullanan diller için): ya bunları istisnasız her zaman kullanın ya da istisnasız her zaman kullanın. Ben ikinci grubun bir parçasıyım.


4
Her ne kadar yazmak kadar kolay olsa da, if(true){ do_something(); }neden başka bir programcıya ciddi bir hata getirme şansını deneyelim (Apple'ın "başarısız olma" toplam ssl kodunu bozma).
Craig

9
Hiçbir parantez, bakımcıyı beynini kullanmaktan kurtaramaz. "Bir satıra uyuyorsa parantez yok" fikrini destekliyorum çünkü benim için böyle bir if, üç terimin yalnızca bir sürümü ise, operatörün "after:" bölümünde hiçbir şey yapmasına gerek yoktur. üçlü. Ve eğer biri neden üçlüye parantez koysun ki ?
Michal M

Nihayetinde bunun öznel olduğu ya da sadece stil ve okunabilirliği etkilediği konusunda kesinlikle hemfikir değilim. Ortaya çıkan sorunları gidermeye çalışırken zaman harcayan biri olarak, blok sınırlayıcıların eksikliğinden (ve bunların yokluğunun fark edilmemesinden) kaynaklanıyordu, çünkü 'gereksiz' olduğunda bunları atlayan bir kodlama stili kullanmak zorunda kaldım - ve çok sayıda kitap okuyan Muhtemelen bu tür kodlama stillerinin neden olduğu korkunç hatalar - bence bu çok nesnel ve pratik bir konu. Elbette, sınırlayıcıları zorunlu kılan bir stille onları yine de unutabiliriz, ama kesinlikle - en azından - kas hafızası bizi çok daha az olası kılar.
underscore_d

10

Kullandığım IDE'nin kod biçimlendiricisini kullanıyorum. Bu farklı olabilir, ancak Tercihler / Seçenekler'den ayarlanabilir.

Bunu beğendim:

if (statement)
{
    // comment to denote in words the case
    do this;
    // keep this block simple, if more than 10-15 lines needed, I add a function for it
}
else
{
    do this;
}

5
Bu tamamen öznel bir stil meselesi, kişisel olarak sadece küme ayracı hatlarının fazlalığını sevmiyorum. Ama hey.
Maç

14
Ben bu stili destekliyorum. Çoğu kişi kodu soldan sağa okur ve bu, gözlerimizi ekranın sol kenarına sabitler. Kodu görsel olarak ayırmaya ve mantıksal adım bloklarına çıkarmaya yardımcı olur.
mloskot

6
Hep bu stili tercih ettim. İlgili kapanış parantezini bulmak çok daha kolay. Yani çok yer kaplıyor? Daha küçük bir yazı tipi kullanın.
timday

4
Küme parantezleri ayrı satırlarda olduğunda kodu "taramayı" her zaman daha kolay bulurum. Bu her şey için geçerli; sınıflar, yöntemler, if- ve while-cümleleri vb. İlk korsenin aynı çizgide olmasını hiç sevmedim ...
Svish

2
Whitespace ucuzdur, özellikle kod katlama özellikli bir IDE'niz olduğunda.
Moo

10

Takip ettiğim "kural" şudur:

Eğer "if" ifadesi bir şeyler yapmak için test yapıyorsa (IE çağrı fonksiyonları, değişkenleri yapılandırma vb.), Kaşlı ayraçlar kullanın.

if($test)
{
    doSomething();
}

Bunun nedeni, hangi işlevlerin çağrıldığını ve programın akışının hangi koşullar altında nereye gittiğini netleştirmeniz gerektiğini hissediyorum. Programcının tam olarak hangi işlevlerin çağrıldığını ve bu koşulda hangi değişkenlerin ayarlandığını anlamasını sağlamak, programınızın tam olarak ne yaptığını anlamalarına yardımcı olmak için önemlidir.

"İf" ifadesi bir şeyi yapmayı durdurmak için test yapıyorsa (bir döngü veya işlev içinde IE akış kontrolü), tek bir satır kullanın.

if($test) continue;
if($test) break;
if($test) return;

Bu durumda, programcı için önemli olan, kodun çalıştırılmasını istemediğiniz istisnai durumların ne olduğunu hızlı bir şekilde keşfetmektir ve bu, yürütme bloğunda değil, $ test ile kapsanmaktadır.


8

Diş tellerinin ilk andan itibaren doğru olması, bu konuda hata ayıklamak zorunda kalmanızı önlemeye yardımcı olacaktır:

if (statement)
     do this;
else
     do this;
     do that;

1
Bu kabul edilen mantık gibi görünüyor, ancak (burada şeytanın savunucusunu oynamak için) bir satır kaydederken ek bir sözdizimi vurgulama kuralı da bunu çözmez mi?
Ken

2
Böylece, vurduğunuzda girintiyi düzelten bir IDE'ye sahip olacaksınız ;:)
Sam Harwell

6

Basit olanlar dahil tüm if ifadeleri için parantez kullanın. Veya üçlü operatörünü kullanmak için basit bir if ifadesini yeniden yazın:

if (someFlag) {
 someVar= 'someVal1';
} else {
 someVar= 'someVal2';
}

Bunun gibi çok daha hoş görünüyor:

someVar= someFlag ? 'someVal1' : 'someVal2';

Ancak üçlü operatörü yalnızca if / else bloklarında gitmesi gereken başka bir şey olmadığından kesinlikle eminseniz kullanın!



2

Tecrübelerime göre, birinci formun tek (çok) küçük avantajı kod okunabilirliğidir, ikinci form "gürültü" ekler.

Ancak modern IDE'ler ve otomatik kod oluşturma (veya otomatik tamamlama) ile ikinci formu kullanmanızı şiddetle tavsiye ederim, kaşlı ayraçlar yazmak için fazladan zaman harcamayacaksınız ve en sık karşılaşılan hatalardan bazılarını önleyeceksiniz.

Yeterince enerji tüketen böcekler var, insanlar sadece büyük zaman kaybı için kapı açmamalı.

Kod yazarken hatırlanması gereken en önemli kurallardan biri tutarlılıktır. Kim yazarsa yazsın, her kod satırı aynı şekilde yazılmalıdır. Titiz olmak, hataların "olmasını" önler;)

Bu, değişkenlerinizi, yöntemlerinizi, dosyalarınızı açık ve net bir şekilde adlandırmak veya onları doğru şekilde girintilemekle aynıdır ...

Öğrencilerim bu gerçeği kabul ettiklerinde, kendi kaynak kodlarına karşı savaşmayı bırakırlar ve kodlamayı gerçekten ilginç, uyarıcı ve yaratıcı bir aktivite olarak görmeye başlarlar. Zihinlerine meydan okurlar, sinirlerine değil!


2

Bu bir tercih meselesidir. Şahsen ben her iki stili de kullanıyorum, daha fazla ifade eklememe gerek kalmayacağından makul ölçüde eminsem, birinci stili kullanıyorum, ancak bu mümkünse ikincisini kullanıyorum. Birinci stile daha fazla ifade ekleyemeyeceğiniz için, bazı insanların onu kullanmamayı önerdiğini duydum. Bununla birlikte, ikinci yöntem ek bir kod satırına neden olur ve siz (veya projeniz) bu tür bir kodlama stilini kullanırsanız, basit if ifadeleri için ilk yöntem çok tercih edilir:

if(statement)
{
    do this;
}
else
{
    do this;
}

Ancak bu soruna en iyi çözümün Python'da olduğunu düşünüyorum. Boşluk tabanlı blok yapısıyla, if ifadesi oluşturmak için iki farklı yönteme sahip değilsiniz: yalnızca bir tane var:

if statement:
    do this
else:
    do this

Bu, parantezleri hiç kullanamama "sorununa" sahip olsa da, ilk stilin artık satır olmaması ve daha fazla ifade ekleme gücüne sahip olması avantajını elde edersiniz.



1

Her zaman kodumu standart yapmaya ve mümkün olduğunca aynı görünmeye çalıştım. Bu, başkalarının güncellemekten sorumlu olduklarında okumalarını kolaylaştırır. İlk örneğinizi yaparsanız ve ortasına bir çizgi eklerseniz başarısız olur.

Çalışmayacak:

if (ifade) bunu yap; ve bu; yoksa bunu yap;


1

Şahsen ben ilk stili yalnızca bir istisna atmak veya bir yöntemden vaktinden önce geri dönmek kullanıyorum. Argüman gibi Bir fonksiyonun başında kontrol etme, çünkü bu durumlarda, nadiren yapacak birden fazla şeyim olur ve asla başka bir şey olmaz.

Misal:

if (argument == null)
    throw new ArgumentNullException("argument");

if (argument < 0)
    return false;

Aksi takdirde ikinci stili kullanırım.


1

Kişisel tercihim şuna benzer bir boşluk ve parantez karışımı kullanmaktır:

if( statement ) {

    // let's do this

} else {

    // well that sucks

}

Bunun temiz göründüğünü ve kodumu okumayı ve en önemlisi - hata ayıklamayı çok kolaylaştırdığını düşünüyorum.


0

Kodunuzda açık olmanın ve parantez kullanmanın daha iyi olduğu gerçeği için çoğu yanıta katılıyorum. Şahsen ben bir dizi kodlama standardı benimseyip ekipteki herkesin bunları bilmesini ve uymasını sağlardım. Çalıştığım yerde , IDesign.net tarafından .NET projeleri için yayınlanan kodlama standartlarını kullanıyoruz .


0

Küme parantezi kullanmayı tercih ederim. Ancak bazen üçlü operatör yardımcı olur.

Onun yerine :

int x = 0;
if (condition) {
    x = 30;
} else {
    x = 10;
}

Basitçe yapılması gerekenler: int x = condition ? 30 : 20;

Ayrıca bir vaka hayal edin:

if (condition)
    x = 30;
else if (condition1)
    x = 10;
else if (condition2)
    x = 20;

Küme ayracı takarsanız çok daha iyi olur.

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.