Parantezleri gerekli olmasa bile mantıklı ifadelerde kullanmalı mıyım?


100

Diyelim ki bir boole şartım var a AND b OR c AND dve ANDöncekinden daha yüksek bir işlem sırası olan bir dili kullanıyorum OR. Bu kod satırını yazabilirim:

If (a AND b) OR (c AND d) Then ...

Ama gerçekten, bu eşdeğerdir:

If a AND b OR c AND d Then ...

Yabancı parantezlerin dahil edilmesinde veya dışında herhangi bir argüman var mı? Pratik tecrübe onları okunabilirlik için dahil etmeye değer olduğunu gösteriyor mu? Yoksa bir geliştiricinin gerçekten oturması ve dillerinin temeline güvenmesi gerektiğinin bir işareti mi?


90
Tembel olabilirim, ancak çoğu durumda okunabilirlik için parantez almayı tercih ediyorum.
thorsten müller

6
Ben de. Sadece okunabilirlik için daha fazlasını ve daha azını yapmayı umuyorum çünkü dilbilgimin temelleri konusunda kendinden emin / yetkin olmak için fazla tembelim.
Jeff Bridgman

16
Parantezin iyi kullanılması, gramerin iyi kullanılması gibidir. 2 * 3 + 2aynı olabilir (2 * 3) + 2ama ikinci okumak daha kolaydır.
Reactgular

16
@Mathew Belki de matematikte zayıfsan. Daha karmaşık durumlarda, parantez kullanın. Ancak, gözle görülür şekilde belirgin olanlar için (BODMAS…) okunabilirliği karmaşa nedeniyle yardım etmekten daha fazla azaltırlar .
Konrad Rudolph

3
Bununla birlikte, aynı VE / VEYA önceliğinin Temel, Python, SQL'de de geçerli olduğunu düşünüyorum ... benim izlenimim, bunun modern dillerin büyük çoğunluğundaki kural olduğudur (hepsi olmasa da).
Tim Goodman,

Yanıtlar:


117

İyi geliştiriciler açık ve doğru kod yazmaya çalışır . Koşullu parantez içinde, kesinlikle gerekmese bile, her ikisine de yardımcı olun.

Açıklığa gelince , koddaki yorumlar gibi parantezleri düşünün: kesinlikle gerekli değiller ve teorik olarak yetkili bir geliştirici onlarsız kod çözebilmelidir. Ve yine de, bu ipuçları son derece yararlı, çünkü:

  • Kodu anlamak için gereken işi azaltırlar.
  • Geliştiricinin amacının onayını sağlarlar.

Ayrıca, girintiler, boşluklar ve diğer stil standartları gibi ekstra parantezler, kodu görsel olarak mantıklı bir şekilde düzenlemenize yardımcı olur.

Doğruluk için parantez içermeyen koşullar saçma hataların reçetesidir. Oldukları zaman, bulunmaları zor olan böcekler olabilir - çünkü çoğu zaman yanlış bir durum çoğu zaman doğru şekilde davranır ve yalnızca zaman zaman başarısız olur.

Doğru bulsanız bile, kodunuz üzerinde çalışacak bir sonraki kişi, ifadeye hata ekleyerek veya mantığınızı yanlış anlayarak başka bir yere (LarsH'nin doğru bir şekilde işaret ettiği gibi) hata ekleyemez.

Hep birleştirmek ifadeleri parantez kullanmak andve or(benzer öncelik konularla aritmetik işlemler için ve ayrıca).


3
Her ne kadar, yorumların özür dilendiğini duydum (yanlış / okunması zor bir kod için) ... daha iyi yazabilmeniz için iyi bir şans var. Sanırım parantez ile ilgili benzer şeyler söyleyebilirsiniz.
Jeff Bridgman

6
Doğruluğun bir başka yönü de değişikliklerle onu korumaktır: Orijinal geliştirici, ilk akılda tutulan amaç ve bağlamla kodu ilk yazdığında, parantezsiz olarak öncelikli olsa da, daha sonra gelen ve hepsini hatırlamıyor. Ayrıntılar, ifadeye daha fazla terim eklediklerinde karışabilir. (Bu zaten çoktan ima edildi ancak vurgulanmaya değer olduğunu hissettim.)
LarsH

1
@LarsH, teşekkürler, bunu açıkça cevaba ekledim.

8
+1 "Geliştiricinin amacını onaylıyorlar." - Herhangi bir programcı (Tamam, belki hepsi değil, ama burada yaşayanların hepsi ...), derleyicinin en karmaşık mantıkla ne yapacağını hesaplayabilir. Kesinlikle hiç kimse orijinal geliştiricinin neyi amaçladığını (kendisi de dahil olmak üzere) en
basitinin

2
@JeffBridgman'ın oldukça iyi bilinen bir noktaya atıfta bulunduğunu düşünüyorum "yorumlar bazen bir kod kokusu olabilir". Örn: Jeff Atwood'un "Kodu yeniden gözden geçirmeniz için yorum gerekmiyor mu?" Sorusunu içeren özetini görün . Eğer yorumunuz neden kodunuzun bu kadar sezgisel olmadığını açıklıyorsa, kesinlikle bir şeyin yanlış olduğuna dair bir ipucu olabilir. Bu gibi zamanlarda, kodu basitleştirmek iyi bir fikirdir. Yine de asıl cevabınıza tamamen katılıyorum ve parantez alıyorum.
Daniel B,

94

Daha az olmadığını önemli olan sen dili senin kavramak eminiz. Daha önemli olan, seni takip eden n00b'nin dilini kavramak.

Kodunuzu mümkün olan en açık şekilde yazın. Ekstra parantez sık sık (ancak her zaman değil) yardımcı olur. Bir satıra yalnızca bir ifade koymak genellikle yardımcı olur. Kodlama stilindeki tutarlılık çoğu zaman yardımcı olur.

Çok fazla parantez gibi bir şey var, ancak tavsiyeye ihtiyaç duymayacağınız durumlardan biri - gördüğünüzde bileceksiniz. Bu noktada, parantezi kaldırmak yerine ifadenin karmaşıklığını azaltmak için kodunuzu yeniden ayarlayın.


72
Unutmayınız ki, hasta, yorgun ya da geçen yıl yazdığınız kodlarla uğraşırken yalnız bir geliştirici olsanız bile; anlama seviyeniz n00b seviyesine düşürülür.
Dan Neely,

30
There is such a thing as too many parenthesis- Belli ki lisper değilsin;)
paul

18
Bu kötü bir tavsiye: Do acemi yazın. Bu, kod kalitenizi düşürür (önemli ölçüde) çünkü başlangıç ​​kitabının ilk iki bölümünün ötesine geçen doğrulanmış deyimler kullanamazsınız.
Konrad Rudolph

10
@KonradRudolph: belki öyleyse, ancak Bilgisayar Programcılığı Sanatını kapak programından tanıyan ya da daha sonra kodlarında hata ayıklamak zorunda olan ve neden böyle bir şey yaptığınıza dair bir ipucunuz olmadığı için yazmayın. . Kod yazıldığından çok daha fazla okunur.
haylem

15
@dodgethesteamroller: Çok fazla sayıda yetenekli / saygın geliştiricinin öncelikli böcekler ortaya koyduğunu gördüm (herkesin bugün ve sonrasında kötü bir gün geçirdi), yaşları için farkedilmeden kaldı. Öncelik kurallarını bilen iyi geliştiriciler için, tespit edilemeyen hatalar / yazım hataları riski çok yüksektir. Diğer herkes için risk daha yüksektir. En iyi geliştiriciler, dilin öncelikli kurallarını hatırlamakta kullanılan, ancak apaçık olmayan herhangi bir şey için parantezi alışkanlıkla kullandıkları için unutmuş olan geliştiricilerdir.
Brendan,

31

Evet

Her zaman parantez kullanmalısınız ... öncelik sırasını kontrol etmezsiniz ... derleyicinin geliştiricisi yapar. İşte parantez kullanmama konusunda başıma gelen bir hikaye. Bu iki hafta boyunca yüzlerce kişiyi etkiledi.

Gerçek Dünya Nedeni

Ana çerçeve uygulamasından miras kaldım. Bir gün, berrak mavi olanın dışında çalışmayı bıraktı. İşte bu ... sadece durdu.

Benim işim mümkün olduğunca çabuk çalışmasını sağlamaktı. Kaynak kodu iki yıl boyunca değiştirilmedi, ancak aniden durdu. Kodu derlemeye çalıştım ve XX. Satırda kırdı. XX no'lu çizgiye baktım ve XX no'lu çizginin kırılmasının ne olacağını söyleyemedim. Bu uygulama için ayrıntılı özellikleri istedim ve hiçbiri yoktu. XX hattı suçlu değildi.

Kodu yazdırdım ve en baştan aşağı incelemeye başladım. Neler olduğuna dair bir akış şeması oluşturmaya başladım. Kod o kadar karmaşıktı ki, neredeyse hiç anlamamıştım. Akış şeması yapmaya çalışmaktan vazgeçtim. Bu değişimin sürecin geri kalanını nasıl etkileyeceğini bilmeden değişiklikler yapmaktan korktum, özellikle uygulamanın ne yaptığı ya da bağımlılık zincirinde nerede olduğu konusunda hiçbir ayrıntıya sahip olmadığımdan.

Bu yüzden, kaynak kodunun başından başlamaya ve kodu daha okunaklı hale getirmek için boşluk ve el freni eklemeye karar verdim. Bazı durumlarda, vardı, fark ettiyseniz kombine koşullar ANDve ORve veri olmanın ne arasına açıkça ayırt değildi ANDed ve hangi verilerin ediliyordu ORed. Ben de onları daha okunaklı hale getirmek için parantez ANDve ORkoşulları koymaya başladım .

Yavaş yavaş temizlerken aşağıya doğru ilerlediğimde periyodik olarak işimi kurtaracağım. Bir noktada kodu derlemeye çalıştım ve garip bir şey oldu. Hata atlandı orijinal kod satırını geçti ve şimdi daha da aşağıdaydı. Böylece ben ANDve ORkoşulları parens ile ayrıştırmaya devam ettim . Temizlemeyi bitirdiğimde işe yaradı. Şekil git.

Daha sonra operasyon mağazasını ziyaret etmeye karar verdim ve ana kareye yakın zamanda yeni bir bileşen takıp takmadıklarını sordum. Evet dediler, yakın zamanda derleyiciyi yükselttik. Hmmmm.

Eski derleyicinin ifadesini soldan sağa ne olursa olsun değerlendirdiği ortaya çıktı. Derleyici yeni versiyonu da belirsiz kombinasyonu anlamına sağ ama belirsiz koda soldan ifadeleri değerlendirilerek ANDve ORçözülemedi.

Bundan öğrendiğim ders ... HER ZAMAN, HER ZAMAN, HER ZAMAN, birbirleriyle bağlantılı olarak kullanıldığında her zaman ayrı ANDkoşulları ve ORkoşulları kullanmak için parenler kullanırlar .

Basitleştirilmiş Örnek

IF Product = 191 OR Product = 193 AND Model = "ABC" OR Product = 201 OR Product = 202 AND Model = "DEF" ...(bunlardan bir kaçı ile kodlanmış kod)

Bu, karşılaştığımın basitleştirilmiş bir versiyonudur. Bileşik boole mantığı ifadeleriyle başka koşullar da vardı.

Şununla kovaladığımı hatırlıyorum:
IF ((Product = 191 OR Product = 193) AND Model = "ABC") OR ((Product = 201 OR Product = 202) AND Model = "DEF") ...



Bunu yazamadım çünkü hiç bir şey yoktu. Orijinal yazar çoktan gitmişti. Yoğun baskıyı hatırlıyorum. Bütün bir kargo gemisi limanda mahsur kaldı ve bu küçük program çalışmadığı için yüklenemedi. Uyarı yok. Kaynak kodunda değişiklik yok. Ağ Operasyonlarına sormak bana sadece paren eklemenin hataları değiştirdiğini fark ettikten sonra bir şeyleri değiştirip değiştirmediklerini sormaya başladı.


22
İyi bir derleyiciye sahip olmanın neden önemli olduğunu daha iyi gösteren bir örnek gibi görünüyor.
Ruakh

6
@CapeCodGunny: Yapmadığına eminim. Ancak buradaki problem, sizin için büyük bir değişiklik yapan kötü bir derleyici satıcısına sahip olmanız. Daha iyi derleyiciler kullanırken bile "HER ZAMAN, HER ZAMAN, HER ZAMAN" dersini nasıl çözdüğünüzü anlamıyorum.
ruakh

5
@ ruakh - Hayır, satıcı kod çözümleyicisini değiştirdi. Ben eski bir okulum, kodladığım veya dahil olduğum her sistemi hatırlama yeteneğime güvenmiyorum. Belgelendirme olmadan tek sahip olduğunuz kaynak kod. Kaynak kodun okunması ve izlenmesi zor olduğunda, oldukça stresli bir durum yaratır. Beyaz alanı kullanmayan programcılar muhtemelen karşılaştığım gibi bir durumla uğraşmak zorunda kalmamışlardır. Ayrıca şöyle bir kod yazmanın daha mantıklı olduğunu öğrendim: Bkz Dick; Jane'e bakınız; Bakınız Dick AND Jane; Okunması kolay basit ifadeler ... yorum yapın ... ve takip edin.
Michael Riley - AKA Gunny

2
Harika bir hikaye, ancak parantez kullanmak için bir neden olmadığına katılıyorum. ve / veya öncelik, neredeyse evrenseldir ve birinin düşünebileceğini değiştirmesi muhtemel bir şeydir. Bu kadar standart ve basit bir işlem için tutarlı bir davranışa güvenemiyorsanız, derleyiciniz çöptür ve ne yaparsanız yapın hortumludur. Hikayen% 100 bir derleyici problemi ve% 0 bir kod problemi. Özellikle varsayılan davranışın soldan sağa basit bir değerlendirme olduğu göz önüne alındığında - sıra her zaman açık olacaktır, peki neden parantez kullanılsın?

7
Her iki tarafta da burada öğrenilen dersler olduğunu düşünüyorum ... Özellikle alternatif belirsiz kodlarla ilgili bir derleyicinin belgelenmemiş davranışına güveniyorsa parantez kullanmaktan daha iyisin . Eğer programcı hangi ifadelerin belirsiz olduğunu bilmiyorsa, daha iyi parens kullanın. Diğer taraftan, bir derleyicinin davranışını değiştirmek tehlikelidir, ancak en azından davranışların değiştiği durumlarda bir hata attı. Derleyici olsaydı, daha kötü olurdu değil bir hata atılır, ama farklı derleme başlamıştı. Hata sizi farkedilmemiş böceklerden korudu.
LarsH

18

Evet, eğer 've' ve 'veya' karışıksa.

Ayrıca iyi fikir () mantıklı bir çek nedir.

En iyisi, iyi adlandırılmış yüklem işlevlerini kullanmak ve buradaki çoğu kontrol ve koşulu çıkarmak, basit ve okunabilir durumda bırakmaktır.


6
Doğru, a AND bmuhtemelen daha açıklayıcı bir ada sahip olan bir işlev veya önceden hesaplanmış bir boolen değeriyle değiştirilmesi gereken çok iyi bir şans var.
Jeff Bridgman

14

Parantezler anlamsal olarak gereksiz, bu nedenle derleyici umursamıyor, ama bu kırmızı bir ringa balığı - asıl mesele programcının okunabilirliği ve anlaşılması.

Buradaki radikal pozisyonu alıp parantez içindeki doyurucu bir "hayır" vereceğim a AND b OR c AND d. Her programcı Boole ifadelerde öncelik gider ezbere bilmeli DEĞİL> VE> VEYA sadece hatırlama gibi, My Dear Teyze Sally dilerim lütfen cebirsel ifadeler için. Gereksiz noktalama, çoğu zaman kodlayıcıda, programcının okunabilirliğinde hiçbir faydası olmadan, görsel karışıklık ekler.

Ayrıca, her zaman mantıksal ve cebirsel ifadelerde parantez kullanıyorsanız, bunları "zor bir şey oluyor - dikkat edin!" İçin bir işaretleyici olarak kullanma yeteneğinden vazgeçersiniz. Diğer bir deyişle, varsayılan önceliği geçersiz kılmak istediğinizde ve çarpmadan önce veya VE'den önce VEYA'dan önce ek olarak değerlendirilen eklerde parantezler bir sonraki programcı için hoş bir kırmızı bayraktır. İhtiyaç duymadıklarında onları çok fazla kullanırsanız, sen de Ağlayan Oğlan olursun.

Böyle C, ibre ifadeler olarak cebir (Boole veya değil), alanının dışında herhangi bir şey için bir istisna yapmak nerede standart gibi deyimler daha karmaşık şey *p++veya p = p->nextmuhtemelen dereferencing ve aritmetik düz tutmak için parantez içinde olmalı. Ve elbette, bunların hiçbiri, ifadeler için bir tür Lehçe gösterim kullanan Lisp, Forth veya Smalltalk gibi diller için geçerli değildir; ancak genel dillerin çoğunluğu için, mantıksal ve aritmetik öncelik tamamen standart hale getirilmiştir.


1
+1, açıklık için parantez içinde para cezası iyi, ama ANDvs vs ORekibimdeki diğer cihazların bilmesini istediğim oldukça basit bir durum. Bazen "açıklık için parantez kullanmak" ın gerçekten "parantez kullanmak, böylece önceliği öğrenmek için uğraşmak zorunda kalmamamdan" endişeleniyorum.
Tim Goodman

1
Birlikte çalıştığım tüm dillerde düzenli öyle .memberönce ikili operatörler önce tekli tekli operatörler, *ve /öncesinde +ve -öncesinde <ve >ve ==önce &&önce ||göreve kadar. Bu kuralların hatırlanması kolaydır, çünkü operatörlerin normal olarak nasıl kullanıldığı hakkındaki "sağduyumu" eşleştirirler (örneğin, çalışmamaya ==göre daha fazla öncelik vermez +veya 1 + 1 == 2çalışmayı durdurmaz) ve sahip olduğum öncelikli soruların% 95'ini kapsar .
Tim Goodman

4
@TimGoodman Evet, kesinlikle doğru, yorumlarınız için. Buradaki diğer cevaplayıcılar bunun siyah veya beyaz bir soru olduğunu düşünüyor gibi görünüyorlar - ya her zaman parantez kullanıyorlar, istisnasızlar, ya da dikkatsizce, pantolonunuzun koltuğuna rastgele ve hatırlanması imkansız bir kurallar denizi, kodunuzun kaynamasıyla uçuyorlar Potansiyel olarak tespit edilmesi zor böcekler. (Karma metaforlar çok kasıtlı.) Açıkçası, doğru yol ılımlılıktır; kod açıklığı önemlidir, ancak araçlarınızı iyi tanımanız gerekir ve takım arkadaşlarınızdan belirli bir minimum programlama ve CS ilkeleri anlayışı beklemelisiniz.
dodgethesteamroller 12:13 te

8

Gördüğüm kadarıyla:

EVET Artıları:

  • İşlem sırası açık.
  • Sizi işlem sırasını anlamayan gelecekteki geliştiricilerden korur.

EVET Eksileri:

  • Dağınıklığa neden olabilir, kodu okumak zor olabilir

NO Artıları:

  • ?

NO Eksileri:

  • İşlem sırası gizlidir
  • Kod, işlem sırası iyi bir şekilde anlaşılmadan geliştiriciler için daha az bakım gerektirebilir.

Söylemiştim, "Kodun dağılmasıyla sonuçlanabilir, kodun okunması zor olabilir" diye düşünüyorum .
SinirliFormsDesigner ile

2
Kodunuzun anlamını açıkça belirtmek, okumayı zorlaştırır mı?
Mason Wheeler

1
"Evet Dezavantajınızı" sorgularken diğerleri ile aynı fikirdeyim. Bence neredeyse her zaman tam tersi.

@Frustrated Karşı iddia kadar öznel. Anlam, gerçekten de değil. Sadece ölçmek zor.
Konrad Rudolph

1
@MasonWheeler: Açık parenlerin birçok durumda çok önemli olduğu konusunda hemfikir olsam da, birisinin anlambilim açık hale getirme konusunda nasıl bir şeyden vazgeçebileceğini görebilirim. Okumaktan 3 * a^2 + 2 * b^2daha kolay buluyorum (3 * (a^2)) + (2 * (b^2))çünkü format ve öncelik tanıdık ve standart. Aynı şekilde, (aşırı olmak üzere), kodunuzun anlamını daha açık hale getirmek için işlevlerin ve makroların (veya derleyicilerin!) Kullanılmasını yasaklayabilirsiniz. Belli ki bunu savunmuyorum, ama neden açık bir şey yapma konusunda kısıtlamalar (bir denge) gerektiğine dair sorunuzu yanıtlamayı umuyorum.
LarsH

3

Yabancı parantezlerin dahil edilmesinde veya dışında herhangi bir argüman var mı? Pratik tecrübe onları okunabilirlik için dahil etmeye değer olduğunu gösteriyor mu? Yoksa bir geliştiricinin gerçekten oturması ve dillerinin temeline güvenmesi gerektiğinin bir işareti mi?

Eğer hiç kimse bir daha koduma bakmak zorunda kalmazsa, umurumda olacağını sanmıyorum.

Ancak deneyimlerime göre:

  • Koduma tekrar tekrar bakıyorum (bazen yazdıktan yıllar sonra)
  • Diğerleri bazen koduma bakar
    • Ya da genişletmek / düzeltmek zorundasınız!
  • Ne kendim ne de diğeri tam olarak yazarken ne düşündüğümü hatırlıyor
  • Kriptik yazma "karakter sayımı minize" kodunun okunması zarar veriyor

Neredeyse her zaman bunu yapıyorum çünkü çabucak okuma yeteneğime güveniyorum ve küçük hatalar yapmayı diğerlerinden çok daha fazla.

Senin durumunda, neredeyse kesin olarak şöyle bir şey yapardım:

if (a AND b) then ab = true
if (c AND d) then cd = true
If (ab OR cd) Then ...

Evet, daha fazla kod. Evet, süslü bool operatörleri yerine yapabilirim. Hayır, gelecekte 1 + yıl kodları gözden geçirme şansını beğenmedim, süslü bool operatörlerini yanlış anladım. Ya farklı AND / VEYA önceliği olan ve bunu düzeltmek için geri atlamak zorunda kalmış bir dilde kod yazıyorsam? Gidecek miyim, "aha! Yaptığım bu zekice küçük şeyi hatırlıyorum! Bunu geçen yıl yazarken parens'i dahil etmek zorunda değildim, şimdi hatırladığım iyi bir şey!" Eğer bu gerçekleşirse (veya daha kötüsü, bu zekanın farkında olmayan veya "en kısa zamanda düzelt" tipi bir duruma atılan başka biri)?

() İle ayırmak, daha sonra hızlı bir şekilde kayma ve anlama konusunda çok daha kolay ...


7
Bunu yapacaksan neden olmasın ab = a AND b?
Eric

1
Belki de abolmasa bile değişmeden kalacaktır a AND b.
Armali

3

Genel dava

C # 'da çarpma ve bölme toplama ve çıkarma işlemine göre önceliklidir.

Yine de, kod üssü genelinde ortak bir stil uygulayan ve yeterince net olmayan kodla ortaya çıkan hata riskini azaltmak için ek bir amaç olan StyleCop, SA1407 kuralına sahiptir . Bu kural şöyle bir kod parçasına sahip bir uyarı üretecektir:

var a = 1 + 2 * 3;

Sonucun açık 7ve açık olduğu açıktır 9, ancak yine de, StyleCop parantez koymayı önerir:

var a = 1 + (2 * 3);

Senin özel durum

Özel bir durumda, kullandığınız belirli dilde VEYA ile karşılaştırıldığında VE'in önceliği vardır.

Her dilin davranışı böyle değil. Birçoğu, VE ve VEYA'ya eşit davranır.

Çoğunlukla C # ile çalışan bir geliştirici olarak, sorunuzu ilk kez gördüğümde ve daha önce yazdıklarınızı okumadan kod parçasını okuduğumda, ilk cazibem, iki ifadenin aynı olmadığını yorumlamaktı. Umarım, yorum yapmadan önce tüm soruyu tamamen okudum.

Bu özellik ve bazı geliştiricilerin AND ve OR'nin aynı önceliğe sahip olduğuna inanmaları riski, parantez eklemeyi daha da önemli kılmaktadır.

Akıllı olduğunuzu göstermek için kod yazmayın. Dilin her yönüne aşina olmayan kişiler de dahil olmak üzere okunabilirlik hedefiyle kod yazın.


1
"Bu çok nadir": Stroustrup2013'e göre, C ++ 11'in farklı VE ve VEYA önceliği olduğu görülmektedir (s. 257). Python için de aynı: docs.python.org/2/reference/expressions.html
Dirk

10
Re: "Bildiğim her dil AND ve VEYA'ya eşit davranıyor": Bunun doğru olduğundan şüpheliyim. O takdirde ise gerçek, o zaman bilmiyorum herhangi bir on en popüler diller (C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL ve Ruby) ve üzerinde yorum edilecek konumda değiller "nadir" olan, "çok nadir" olanlardan bağımsız olarak.
Ruakh

1
Ruakh ile aynı fikirdeyim ve C ++ 11, python, matlab ve java'yı aradım.
Dirk

3
AND ve OR'nin ikili operatör olduğu ve VE'ye OR'dan daha yüksek bir önceliğe sahip olmadığı, yazarları bilgisayar bilimleri uçağı olan beyinsiz bir dildir. Bu mantık gösteriminden geliyor. Merhaba, "ürün toplamı" bir şey ifade etmiyor mu? VE için çarpım (faktörlerin yan yana) ve OR için + sembolünü kullanan bir boolean gösterimi bile vardır.
Kaz

3
@ruakh Sen benim için bir şey ifade ettin. Çünkü bir avuç patolojik vaka var, standart Boole önceliğini öğrenmemeniz ve aksi ispat edilmediği sürece geçerli olduğunu varsaymanız gerektiği anlamına gelmiyor. Burada rastgele tasarım kararlarından bahsetmiyoruz; Boolean cebiri, bilgisayarlardan çok önce icat edildi. Ayrıca, bana bahsettiğin Pascal özelliğini göster. Burada ve burada VEYA'dan önce VE'yi göster.
dodgethesteamroller 12:13 te

1

Herkesin dediği gibi, ifadeyi daha okunaklı hale getiren her seferinde parantez kullanın. Ancak ifade karmaşıksa , alt ifadeler için yeni işlevler eklemenizi öneririm .


0

Yoksa bir geliştiricinin gerçekten oturması ve dillerinin temeline güvenmesi gerektiğinin bir işareti mi?

Eğer dili kesinlikle tekil olarak kullanıyorsanız, belki. Şimdi , eskiden en modernine, derlenmiş yazıdan SQL'e, geçen ay icat ettiğin kendi DSL'inize kadar bildiğiniz tüm dilleri alın .

Bakmadan, bu dillerin her biri için kesin öncelik kurallarını hatırlıyor musunuz?


1
Yukarıda @Cape Cod Gunny'nin belirttiği gibi, soğuk dilini bildiğinizi düşünüyorsanız bile, derleyici / çalışma zamanı sizin altınızda değişebilir.
Jordan,

0

"Gerekmiyorsa bile parantezleri mantıksal ifadelerde kullanmalı mıyım?"

Evet, çünkü iki kişi onlara yardımcı olacak:

  • Bir sonraki programcı, bilgisi, yeterliliği veya tarzı farklı olabilir

  • Bu koda geri dönen, daha sonraki bir tarihte!


-1

Kompleks şartlandırmalar "boolean cebiri" dir, bazı şekillerde tam olarak cebir gibi görünmesini sağlayan ve kesinlikle cebir için parens kullanırsınız , yazıyorsunuz, değil mi?

Gerçekten yararlı olan kurallar olumsuzlama kuralları:

!(A || B) <=> !A && !B
!(A && B) <=> !A || !B

Veya biraz daha net bir biçimde:

!(A + B) <=> !A * !B
!(A * B) <=> !A + !B

hangi gerçekten açıkça sadece cebir olduğu gibi yazılır:

-1*(A + B) = -A + -B
-1*(A * B) = -A * -B

Ancak, cebirsel basitleştirme ve genişleme düşüncesini de uygulayabiliriz:

(A && B) || (C && D) => 
((A && B) || C) && ((A && B) || D) => 
(AC && BC) && (AD && BD) =>
AC && BC && AD && BD

kodda yazmanız gerekse de:

(A||C) && (B||C) && (A||D) && (B||D)

veya biraz daha net bir biçimde:

(A + B) * (C + D) => 
((A + B) * C) + ((A + B) * D) => 
(AC + BC) + (AD + BD) =>
AC + BC + AD + BD

Temel olarak, bir koşullu hala sadece bir cebirsel ifadedir ve açıkça parantez kullanarak, "bu formülü basitleştirmek veya genişletmek" kavramını da dahil olmak üzere, ifadeye zaten bildiğiniz çeşitli cebirsel kuralları daha kolay uygulayabilirsiniz.


2
Aslında soruyu cevapladığınızdan emin değilim, çünkü cevabınızı mutlaka doğru olmayan bir varsayımla yönlendirirsiniz. Cebir için parantez kullanır mıyım? Her zaman değil. Okunabilirliğe yardımcı olursa, o zaman kesinlikle, ama diğerleri zaten burada ifade etmişlerdir. Ve matematik cebirini başka biçimlere genişletmek, programlama ile bire bir uyuşmazlığa sahip değildir - peki ya birkaç string değerin durumunu kontrol ediyorsanız?
Derek

Karşılık gelen boolean cebiri parensi garanti altına alacak kadar karmaşıksa, şartlı durumunuz muhtemelen parens kullanmalıdır. Ebeveynleri garanti etmemek için yeterince basitse, ya yapmak zorunda değilsindir ya da yapmamalısın. Her iki durumda da, onu matematiksel bir ifade gibi düşünmek muhtemelen sorunu açıklığa kavuşturur.
Narfanator

Yukarıdaki örneklerim iki ve dört boolean kullanıyor. İki veya daha fazla dize değerinin durumunu kontrol ediyorsanız, haritalandırır. Her kontrol bir boole değişkenine karşılık gelir; Bu kontrolün tamsayı veya string eşitliği olup olmadığına bakılmaksızın; dizi, dizi veya karma içerme; karmaşık bir ifadenin kendisi ... Önemli değil; tek önemli olan ifadenizde birden fazla doğru / yanlış ölçümü yapmanızdır .
Narfanator

2
Sadece nitpicking fakat içinde !(A + B) <=> !A + !Bve -1*(A + B) = -A + -Boperatör den çevrilmiş olması gerektiğini +etmek *ikinci ifadesinde?
Jeff Bridgman

-1

İsteğe bağlı olsa bile parantez kullanacağım, neden kodu daha iyi anlamaya yardımcı olacağı için, o kodu görmeye hazır olanlar için de. Sizin durumunuzda, boolean operatörleri bile ilk başta işe yarayabilir, ama her durumda size yardımcı olacağını söyleyemeyiz. bu yüzden kullanıcının parantezini, gerektirebileceği herhangi bir koşulda veya isteğe bağlı olarak tercih ederim.


-1

Evet. Her durumda, kodunuzun daha net olacağını düşündüğünüzde kullanmalısınız. Kodunuzun yeterince açık olması gerektiğini unutmayın; böylece diğerleri kod içindeki yorumlarınızı okumadan anlayabilir. Bu yüzden parantez ve kaşlı ayraç kullanmak iyi bir uygulamadır. Ayrıca, şirketinizin / ekibinizin özel uygulamasına bağlı olabileceğini unutmayın. Sadece bir yaklaşımı sürdürün ve karıştırmayın.

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.