(Konum <boyut) neden şartlarda böyle yaygın bir örüntü?


9

Bir koşul ifadesinde (IF) herkes kullanır (position < size), ama neden?
Sadece konvansiyon mu yoksa bunun için iyi bir sebep var mı?

Vahşi doğada bulundu:

if (pos < array.length) {
   // do some with array[pos];
}

Nadiren bulundu:

if (array.length > pos) {
   // do some with array[pos];
}

7
Sağda "değişken" olması önemli değil bir durumda if (MIN <= x && x <= MAX). ( Bazı dillerde bu şu şekilde yazılabilir MIN <= x <= MAX; C'de mükemmel bir şekilde yasaldır, ancak ne anlama geldiğini düşündüğünüz anlamına gelmez).
Keith Thompson


5
Aralıkların nasıl yazıldığına [min, max]ve yazılmadığına bağlı olabilir [max, min]. Bu nedenle, bir elemanın xaralığa ait olduğunu yazarak kontrol etmek sadece doğaldır min <= x <= max.
Andres F.

Ne büyük bir ibadet.
Tulains Córdova

İkinci örnek, (! (Array.lengh <= pos)) ...
OldFart

Yanıtlar:


48

Daha derin kalıp, doğal olarak standart düzen olarak "[değişen şey] [karşılaştırma] [değişmeyen şey]" kullanmamızdır. Bu ilke, örnek için geçerlidir, çünkü boyut değişmeyebilir, ancak boyut değişmez.

Tek yaygın istisna, bazı programcılar hatadan ziyade ortaklardan kaçınmak için zıt düzeni ( Yoda koşulları olarak bilinir) kullanmak için kendilerini eğitirken eşittir - Bu fikre sahip değilim çünkü tarif edilen doğal düzeni buluyorum çok daha okunaklı, çünkü öncelikle bu fikri İngilizce ifade etme şeklimizdir ve modern derleyicilerin çoğu bunu tespit edip bir uyarı verir.variable = constantvariable == constant


3
Geliştirme araçlarınıza bağlı olarak, birçoğu yapı hakkında da uyarır (veya hata verir) variable = constant.
GalacticCowboy

5
+1. constant == variableOlay hakkında daha fazla bilgi için "Yoda Koşulları" ifadesini arayın .
John M Gant

Aynı şeyi son zamanlarda kendi kod if(DBNull == row["fieldName"]) methodCall()tabanımda da gördüm (örneğin ve çıldırıp gitmediğimi merak ettim, çünkü çoğu zaman başka bir şekilde yapıldığını gördüm.
Andrew Gray

1
Ayrıca, (position < size)genellikle bir üst sınırı ifade ettiğini de ekleyeceğim , bu yüzden aslında bir kısmını yeniden lowerbound <= position < upperboundboyutlandırıyor, üst sınırdaki boyutla. İki kısıtlama açık olduğunda position, sadece ortada olabilir.
Steve314

4
Muhtemelen dil ile ilgilidir; " X operatörü Y " yi " X bir ( operatör Y )" olarak ayırırız, örneğin ilişki X'in bir özelliğidir . Karşılaştırmayı sorarak X'in iyi veya kötü bir değere sahip olup olmadığını soruyoruz (ve Y yerel olarak sabit olarak değerlendiriliyor). "Pos <array.length" sorusu, "Konum iyi mi (dizi uzunluğundan daha küçük)?" Hayır ise, pozisyonla ilgili bir sorun var; bana başka bir pozisyon ver, istediğini yapmaktan mutluluk duyarım. Ancak dizi uzunluğu hakkında hiçbir şey yanlış değil. "Array.length> pos" sorusunu sormak, diziyi çok kısaysa artırmamız gerektiği anlamına gelir.

14

Bunun için şimdiye kadar gördüğüm tek gerekçe, sayı satırları veya okulda öğrendiğimiz diğer düzen şeyleri gibi. Örneğin, aşağıdaki gibi sayı satırları yazıyoruz:

<--|--|--|--|--|--|-->
   1  2  3  4  5  6

Daha küçük şeyler, daha büyük şeylerin solunda görünür. Aynı şey tarihler gibi diğer şeyler için de geçerlidir (takvimin nasıl düzenlendiğini düşünün).

Temel olarak, şeylerin düzeni hakkında doğal olarak nasıl düşündüğümüze dayanır. İlk formu okumak daha kolaydır çünkü üzerinde fazla zihinsel işlem yapmak zorunda değilsiniz.


1
Daha küçük bir değere göre değerlendirilen ifade, koşulda önce gelir mi? Değerler bir çalışma zamanını değiştirirse bunun doğru olacağından nasıl emin olabilirsiniz?
Tulains Córdova

@ user61852 Çalışma zamanında değerlerin ne olduğunu bilmenize gerek yoktur. Örnek: Çalışma zamanı değeri A ve değer B'de hesapladığım 2 değerim var ve bu değer A'nın değerB'den küçük olduğunu test etmek istiyorum. "İf (valueA <valueB)" yazarım. A değerinin B değerinden küçük olup olmadığı önemsizdir. (En azından benim için) buna bakmak ve valueA değeri B'den küçük olduğunda aradığımı bilmek daha kolay. Eğer "if (valueB> valueA)" görmek için olsaydı ben durdurmak ve kod bu dalını takip edecek zaman hangi şey küçük şey olduğunu düşünmek zorunda.
Becuzz

1
Yanlış anladım. Cevabı oyladım. Şimdi oy vermek istiyorum, ancak site cevabın düzenlenmesini istiyor, böylece oyumu değiştirebiliyorum. Oy vermek için lütfen biraz düzenleme yapın.
Tulains Córdova

@ user61852 Oyunuzu şimdi değiştirebilmeniz gerekir.
Becuzz

11

Esas olarak bir konvansiyon meselesi olsa da, bunun düşüncemize en uygun olduğunu düşünüyorum - vurguladığımız öğeyi gösteriyor.

Bunları İngilizceye çevirirsek, cümlenin öznesi geçici öğe olan "Konum, dizi uzunluğundan küçükse" ifadesi olacaktır.

Başka bir şekilde ifade etmek gerekirse, "dizi uzunluğu konumdan büyükse" dizi uzunluğunu (sabit bir değer olduğu varsayılır) özneye koyar ve konum (geçici) doğrudan nesne olur.


3
Aslında (son cümlenizde) konum bir edatın nesnesi haline gelir. Ama söylediklerinize katılıyorum. Dilbilimde, konumun konu olduğunu ve "dizi uzunluğundan daha az" yorum olduğunu söyleyebiliriz . "Topikalize edilmiş bileşenleri başlangıçta cümle yerleştirme eğilimi (konu önü) yaygındır." en.wikipedia.org/wiki/…
LarsH

4

Benim düşüncem ve bu sadece benim görüşüm, okunabilirlik için bir kural olduğu. İkisi aynı olmasına rağmen beynimde farklı hissediyorlar. Dizi boyutu pos daha büyük olup olmadığını bilmek istemiyorum. Pos dizi boyutundan daha küçük olup olmadığını bilmek istiyorum.

Yarı boş, yarı dolu bir tartışma gibi. Matematiksel olarak aynı, ancak beynim bağlama göre onları farklı görecek.

Şahsen, görürsem

if (array.lengh > pos) {
    // do some with array[pos];
}

Bunun bir hata olup olmadığını ve programcının ne anlama geldiğini düşünmeye başlayacağım. Sınırları kontrol etmekten başka bir şey yapmaya mı çalışıyor?

Belki sadece parlak değilim, ama her kod satırında bu tür bir analiz yapmak zorunda kalırsam beynim ağrıyor.


3

Bazılarının ulaşmaya çalıştıklarını farklı bir şekilde ifade etmek için ...

Düzen, programın davranışında hiçbir fark yaratmadığında, fark açıkça insanlar için en okunabilir olanın meselesidir. Solda "konuyu" koymak mantıklı bir neden:

Dilbilimde, bir cümlenin konusu hakkında konuşulan şey, yorum ise konu hakkında söylenen şeydir. Bu örnekte, varsayabiliriz positionolan konu "dizi uzunluğundan daha az" olduğunu ve açıklama . İngilizce ve diğer birçok dilde, konu genellikle yorumdan önce ifade edilir.
" Topikalize edilmiş bileşenleri başlangıçta cümle yerleştirme eğilimi (konu önü) yaygındır. "

Bu nedenle, iyi bir kural, kod satırınızı bir cümle (veya bu durumda, madde) olarak düşünmek, cümlenin ne hakkında olduğuna karar vermek ve mümkünse ilk önce koymaktır. Genellikle, cümlenin "hakkında" olduğu şey sabit olmaktan ziyade bir değişken olacaktır. Ancak bazen yorum da bir değişken içerecektir, bu yüzden sadece bunu yapamazsınız.


1

Bu, her ikisi de, erken dillerin derlendiği temel derleyiciden gelen iki şeyin birleşimidir (ve bir çok güncel dil de).

  1. Diziler, bellekte sıfır tabanlı ofsetlerdir (yani, ilk veri parçası tahsis edilen bellek bloğunun başlangıcındadır ... 0-endeksi). Bu nedenle değişen parça için 0..n-1 kullanımı.

  2. Bir değer başka bir değerden (veya kayıt vb.) Küçükse dallanma genellikle tek bir komuttur. Bu nedenle basit (<) değerinden daha az işleç kullanımı.

Böylece, desen eski timey birleştiriciden ANSI-C'ye (bazı yönlerden daha çok bir makro birleştirici gibi) ve oradan Java'ya ve diğer C benzeri dillere taşındı.


0

Diğer birçok cevabın söylediği gibi, okumak genellikle daha kolaydır:

[thing that varies] [comparison] [thing that does not vary]

Bildiğim hemen hemen herkes bu stili sadece kullanıyor.

=Atama ve ==karşılaştırma için kullanılan C tarzı diller için bir istisna vardır . Yanlışlıkla yazarsanız:

if (variable = 5) ...

onun yerine:

if (variable == 5) ...

bu geçerli bir kod satırı olduğu için hata almazsınız. (Bazı derleyiciler ve IDE'ler bunu yapmak konusunda sizi uyarır, ancak bu kadar basit bir yazım hatası yapmak hala çok kolaydır.)

Ancak, yazarsanız:

if (5 == variable) ...

derleyici / yorumlayıcı bu geçerli bir yapı olmadığı için hata verecektir (çoğu dilde, zaten).

Bu geçiş genellikle Yoda Koşulu olarak adlandırılır .

GÜNCELLEME : İşte Yoda Koşullarının yararlı olduğu yerlerin listesi .


-1

Şahsen bunu tercih ederim:

bool positionIsWithinBounds = pos < array.length;
if (positionIsWithinBounds) {
   // do some with array[pos];
}

... daha fazla kod, ama okunması da çok kolay.


4
Karşılaştırmaya bir ad vermek için +1. Gerçekten de, bu yaklaşımı daha karmaşık şartlar için daha çok seviyorum ve böyle basit durumlar için çok fazla değil. Aslında "dahilinde" "sınırları", bana "dizisi" düşünmek durdurmak yapar ve ortalama neyi olanlar hepsi, ne zaman içgüdüsel ne için ne anlama geldiğini biliyor posolmak > array.length. Başka bir deyişle, şartlılığın anlamını çok netleştirmesine rağmen, aslında IMO'yu okumayı biraz zorlaştırıyor.
John M Gant

İzlemek için başka bir isim ...
Deduplicator

-1

Bu bir tercih veya kongre meselesi. Tutarlı olmak istiyorsanız, bununla ilgili iki makul yol vardır:

  1. Her zaman "özneyi" ilk sıraya koyun (bir cümle olarak düşünün) - testin değeri. Mesela sen yazarsınif (age>5)

  2. Ya da her zaman önce küçük öğeyi koyun (değerleri ekranınızda doğal sırada sıralandığı gibi düşünün). Örneğin if (a<b), bu kodun çoğunlukla a veya çoğunlukla b hakkında olup olmadığına bakılmaksızın yazabilirsiniz .

Her iki sözleşme de ikincisi yerine gösterdiğiniz ilk pasajı önerecektir, bu yüzden sanırım bu özel durumda cevabınız var. Çoğu insan için okumayı zorlaştıracağından, burada hem (1) hem de (2) ihlal eden kod yazmamaktan kaçınmanın akıllıca olduğunu söyleyebilirim.

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.