Neden “eğer öyleyse” ifadeleri neredeyse hiç tablo biçiminde değildir?


73
if   i>0 : return sqrt(i)  
elif i==0: return 0  
else     : return 1j * sqrt(-i)

VS

if i>0:  
   return sqrt(i)  
elif i==0:  
   return 0  
else:  
   return 1j * sqrt(-i)  

Given the above examples, I don't understand why I virtually never see the first style in code bases. To me, you turn the code into a tabular format that shows clearly what you want. First column can virtually be ignored. Second column identifies the condition and the third column gives you the output you want. It seems, at least to me, straight-forward and easy to read. Yet I always see this simple kind of case/switch situation come out in the extended, tab indented format. Why is that? Do people find the second format more readable?

Bunun sorunlu olabileceği tek durum, kodun değişip uzaması. Bu durumda, kodu uzun, girintili formata yeniden yerleştirmenin tamamen makul olduğunu düşünüyorum. Herkes bunu ikinci yoldan mı yapıyor, çünkü her zaman olduğu gibi mi? Şeytanın avukatı olmak, sanırım başka bir neden, insanların kafa karıştırıcı if / else ifadelerinin karmaşıklığına bağlı olarak iki farklı biçim bulmaları olabilir. Herhangi bir fikir takdir edilecektir.


91
Çünkü insanlar 2. seçeneği daha okunaklı buluyor?
GrandmasterB

65
Hepsi aynı tipte bir değer döndüren, birbirini dışlayan dalların kullanımı, zorunlu olmayan dillerde, değerleri döndürmeyen, çoklu satırlara yayılabilen ve muhtemelen yan etkilere sahip olan şubelere kıyasla sık sık ortaya çıkmamaktadır. İşlevsel programlama dillerine bakarsanız, ilk örneğinize çok benzeyen bir kod görürsünüz.
Doval

47
@horta "Bunun sorunlu olabileceği tek durum kodun değişmesi ve uzamasıdır." - Bir kodun değiştirilmeyeceğini ASLA varsaymamalısınız. Kod yenileme, bir yazılımın kullanım ömrünün büyük bir bölümünü alır.
Charles Addis,

7
@horta: Benimle ilgisi yok. Kod bu. Okuduğum kod temeli bağlamında, ifadelerin (ve diğer dil yapılarının) herhangi bir kenar vakası olmadan tutarlı biçimde biçimlendirilip biçimlendirilmediğini görmek istiyorum. Ben, ben belirli bir şekilde kod okumayı öğrendi bu değil edebilir ya sadece iyi okumak, ama her şey aynı ise daha okunabilir bu. Yine, benim için aynı değil, kodun geri kalanıyla aynı.
GManNickG

44
Ayrıca, çoğu hata ayıklayıcı satır tabanlıdır. ifAynı satırdaysa, içindeki bir ifadeye kesme noktası koyamazsınız .
isanae,

Yanıtlar:


93

Bunun bir nedeni, popüler olduğu dilleri kullanmamanız olabilir.

Birkaç karşı örnek:

Muhafızlarla ve desenlerle Haskell:

sign x |  x >  0        =   1
       |  x == 0        =   0
       |  x <  0        =  -1

take  0     _           =  []
take  _     []          =  []
take  n     (x:xs)      =  x : take (n-1) xs

Desenli Erlang:

insert(X,Set) ->
    case lists:member(X,Set) of
        true  -> Set;
        false -> [X|Set]
    end.

Emacs Lisp:

(pcase (get-return-code x)
  (`success       (message "Done!"))
  (`would-block   (message "Sorry, can't do it now"))
  (`read-only     (message "The shmliblick is read-only"))
  (`access-denied (message "You do not have the needed rights"))
  (code           (message "Unknown return code %S" code)))

Genel olarak, tablo formatının işlevsel diller (ve genel olarak ifadeye dayalı diller) arasında oldukça popüler olduğunu, satırları kesmenin ise diğerlerinde en popüler olduğunu (çoğunlukla ifade tabanlı) görüyorum.


10
Bunu reddettim ve genel olarak aynı fikirdeyim ama şunu belirtmek zorunda hissediyorum: 1. Bunların hepsi önemsiz geri dönüşlerdir 2. Haskellers, dilin kendisinin tersine ve 3'e ek olarak, kısa komik tanımlayıcılara düşkündür. İşlevsel diller, ifadeye dayalı olma eğilimindedir. ve zorunlu dillerin bile ifadelerde ifadelerden farklı standartları vardır. OP, orijinal örneği işlev uygulamaları olarak yeniden yazdıysa, farklı tavsiyelerde bulunabilir ...
Jared Smith,

3
@JaredSmith İfade / ifade tabanlı bölünme için teşekkürler - İşlevsel / zorunlu olmaktan çok daha uygun olabileceğini düşünüyorum. Bir kez daha yakut neredeyse ifadeye dayanıyor ve bu sözleşmeyi sık sık kullanmıyor. (her şeyin istisnası) 1 ve 2 numaralı noktalara gelince, gerçek Haskell kodunun% 50'sini + sadece daha büyük bir şeyin parçaları olan "önemsiz geri dönüşler" olarak görüyorum - bu sadece bu kodun nasıl yazıldığını - sadece örneklerde değil. Fonksiyonların yarısına yakın Örneğin burada bir sadece bir / iki gömlekleri vardır. (bazı satırlar tablo düzenini kullanır)
viraptor

Evet. Ben bir Haskeller değilim ama biraz ocaml yapıyorum ve kalıp eşleştirmenin mantıksal olarak eşdeğer anahtarlardan çok daha özlü olduğunu ve polimorfik fonksiyonların da bu zeminin çoğunu kapsadığını görüyorum. Haskell'in sınıf sınıflarının bu kapsamı daha da genişleteceğini hayal ediyorum.
Jared Smith,

Sanırım bunu destekleyen örnek durum sözdizimi. Daha özlü ve genellikle kısa bir anahtar çantasına daha yakın olduğu için tek gömlek olarak ifade etmek daha kolaydır. Bunu sık sık benzer sebeplerle kısa anahtar durum açıklamalarıyla da yapıyorum. Edebi if-elseifadeler, genellikle basit bir üçlü olmasa da genellikle birden fazla satıra yayılır.
Isiah Meadows,

@viraptor Teknik olarak, haskell kodunun diğer% 50'si "önemsiz olmayan iadeler" dır, çünkü tüm haskell işlevleri işlevsel olarak saftır ve yan etkileri olamaz. Komut satırından okunan ve yazdırılan fonksiyonlar bile sadece uzun dönüş ifadeleridir.
Pharap

134

Daha okunaklı. Bunun birkaç nedeni:

  • Neredeyse her dil bu sözdizimini kullanır (hepsi değil, çoğu - örneğin Python gibi görünüyor)
  • isanae , çoğu hata ayıklayıcısının satır tabanlı olduğunu (açıklama temelli değil) yorumunda belirtti.
  • Noktalı virgül veya parantez içine almak zorunda kalırsanız daha çirkin görünmeye başlar
  • Yukarıdan aşağıya daha sorunsuz okur
  • Önemsiz iade ifadelerinden başka bir şeyiniz varsa korkunç derecede okunaksız görünüyor
    • Koşullu kod artık görsel olarak ayrı olmadığından kod girmediğinizde girintili anlamlı sözdizimi kaybolur ( Dan Neely'den )
    • Bu, özellikle ifadeleri 1 satırına öğe eklemeye / eklemeye devam ederseniz kötü olacaktır
  • Sadece eğer tüm çekleriniz aynı uzunluktaysa okunabilir
  • Bu ifadeler, çok satırlı ifadeler halinde ifadelerin oneliner olması gerektiğine göre karmaşık bir biçimde biçimlendirilemeyeceğiniz anlamına gelir
  • Satır satır dikey olarak okurken, birden fazla satırı birlikte ayrıştırmaya çalışmadığımda hataları / mantık akışını farketme ihtimalim çok daha fazla
  • Beyinlerimiz daha dar, uzun metinleri, uzun metinlerden çok daha hızlı okur

Bunlardan herhangi birini yapmaya çalıştığınız an, çok satırlı ifadelere yeniden yazmanız gerekecek. Bu sadece zamanını boşa harcadığın anlamına geliyor!

Ayrıca insanlar kaçınılmaz olarak şöyle bir şey ekler:

if i>0:  
   print('foobar')
   return sqrt(i)  
elif i==0:  
   return 0  
else:  
   return 1j * sqrt(-i)  

Bu formatın, alternatifinizden çok daha iyi olduğuna karar vermeden önce bunu yapmanız çok sık olmaz. Ah, ama hepsini bir satırda sıraya sokabilirsin! enderland içten ölür .

Veya bu:

if   i>0 : return sqrt(i)  
elif i==0 and bar==0: return 0  
else     : return 1j * sqrt(-i)

Bu gerçekten, gerçekten sinir bozucu. Kimse böyle şeyleri biçimlendirmekten hoşlanmaz.

Ve son olarak, "sekmeler için kaç tane boşluk" sorunu olan kutsal savaşa başlayacaksınız. Ekranda bir tablo formatı olarak mükemmel şekilde ortaya çıkan şey, ayarlara bağlı olarak mayın üzerinde işlemeyebilir.

Okunabilirlik IDE ayarlarına bağlı olmamalıdır.


14
@horta , başlangıçta biçimlendirirseniz dönüştürmeniz gerekecek, çünkü başlangıçta? Gelecekteki enderland için çalışmaları en aza indirgemek üzereyim. Bir çekin hiç eğlenceli olmadığı bir mantık ekleyebildiğimde görsel biçimlendirmeyi güncellemek için beyaz boşluk tabloları hazırlamak ve boşlukları ve sekmeleri saymak (okunabilirlik etkilerini dikkate almamak).
enderland

14
@horta Mutlaka düzeltmeyeceğini söylemiyor, düzeltmek zorunda kalacağını söylüyor, ve programlamadan ziyade sıkıcı biçimlendirmeler için çok zaman harcadı.
Servy

11
@horta: IMHO yolunuzu sık sık daha az okunabilir ve kesinlikle çok daha rahatsız edici biçime etmektir. Ayrıca, yalnızca "ifs", nadiren ortaya çıkan bir küçük gömlek olduğunda kullanılabilir. Son olarak, bu şekilde bir formata girmek için iki tür "if" olması IMHO, bir şekilde hoş değil.
dagnelies

9
@horta, gereksinimlerin, sistemlerin, API'lerin ve kullanıcı gereksinimlerinin asla değişmediği sistemler üzerinde çalışmaktan memnun görünüyor. Seni şanslı ruh.
enderland

11
Eklemek isterim: Tek bir durumdaki herhangi bir küçük değişiklik, diğerlerinin :konumuyla eşleşmesi için yeniden biçimlendirmeyi gerektirebilir -> CVS'de bir fark yaratarak, gerçekte neyin değiştiğini anlamak zorlaşır. Bu aynı zamanda beden vs durum için de geçerlidir. Onları ayrı çizgilerde bulundurmak demek, eğer onlardan sadece birini değiştirirseniz, farkın bedenin değil, sadece durumun değiştiğini açıkça gösterdiği anlamına gelir.
Bakuriu

55

'Kod birçok kez okundu, az yazıldı - bu yüzden okunabilirlik çok önemli' diye inanan bir firmayım.

Başkalarının kodunu okuduğumda bana yardımcı olan anahtar şey, gözlerimin tanımak için eğitildiği 'normal' kalıpları izlemesidir. Girintili formu en kolay bir şekilde okuyabilirim çünkü onu neredeyse otomatik olarak kaydettirecek kadar çok gördüm (benim açımdan çok az bilişsel çaba ile). 'Güzel' olduğu için değil - alışkın olduğum kuralları takip ediyor çünkü. Kongre 'daha iyi' atıyor ...



11
Bu, insanların neden tutucu olduğunu açıklar. İnsanların neden kodlarını başlamak için belli bir yolla yazmayı seçtiklerini açıklamıyor.
Jørgen Fogh

8
Asıl soru, 'neden bu kadar sık ​​görüyorum' 'idi, bu tarz nereden gelmiyordu. Her iki soru da ilginç; Sorulduğunu düşündüğüm soruyu cevaplamaya çalıştım.
Sanat Swri,

16

Bahsedilen diğer dezavantajların yanı sıra, tablo düzeni sürüm kontrolü birleştirme çatışmalarını el ile müdahale gerektiren ihtimalleri arttırmaktadır.

Bir sekmeli olarak işaretlenmiş kod bloğunun yeniden hizalanması gerektiğinde, sürüm kontrol sistemi bu satırların her birine değiştirilmiş olarak davranır:

diff --git a/foo.rb b/foo.rb
index 40f7833..694d8fe 100644
--- a/foo.rb
+++ b/foo.rb
@@ -1,8 +1,8 @@
 class Foo

   def initialize(options)
-    @cached_metadata = options[:metadata]
-    @logger          = options[:logger]
+    @metadata = options[:metadata]
+    @logger   = options[:logger]
   end

 end

Şimdi bu arada, başka bir dalda, bir programcının hizalanmış kod bloğuna yeni bir satır eklediğini varsayalım:

diff --git a/foo.rb b/foo.rb
index 40f7833..86648cb 100644
--- a/foo.rb
+++ b/foo.rb
@@ -3,6 +3,7 @@ class Foo
   def initialize(options)
     @cached_metadata = options[:metadata]
     @logger          = options[:logger]
+    @kittens         = options[:kittens]
   end

 end

O şubeyi birleştirmek başarısız olur:

wayne@mercury:/tmp/foo$ git merge add_kittens
Auto-merging foo.rb
CONFLICT (content): Merge conflict in foo.rb
Automatic merge failed; fix conflicts and then commit the result.

Eğer değiştirilmekte olan kod sekmeli sıralama kullanmasaydı, birleştirme otomatik olarak başarılı olurdu.

(Bu cevap, koddaki sekme uyumunu engelleyen kendi makalemden "intihal edildi" ).


1
İlginç, ancak bu birleştirme araçlarının başarısızlığı değil midir? Bu durumda özellikle git? Bu, kongre yoluna gidilmesi kolay bir yol olan bir veri noktasıdır. Bana göre, geliştirilebilecek bir şey var (takım tarafından).
horta

7
@horta Birleştirme aracının beyaz alanı hemen hemen her zaman kodu kıramayan bir şekilde değiştirmesi için, kodun anlamını değiştirmeden beyaz alanı ne şekilde değiştirebileceğini anlaması gerekir. Ayrıca, kullanılan belirli tablo uyumunu da anlamak zorunda kalacaktır. Bu sadece dile bağlı olmayacak (Python!) Değil aynı zamanda kodu bir dereceye kadar anlamak için araca ihtiyaç duyacak. Öte yandan, çizgiye dayalı birleştirme AI olmadan yapılabilir ve çoğu zaman kodu bile bozmaz.
Wayne Conrad,

Anladım. Yorumlarda başka bir yerde de belirtildiği gibi, IDE'lere veya tabloları doğrudan formata ekleyen programlama giriş formatlarına sahip olana kadar, takım sorunları her zaman orada olacaktır, sadece tabloları tercih edenler için hayatı zorlaştırır.
horta

1
@horta Doğru. Koddaki sekme uyumuna itirazımın çoğu, yeterince gelişmiş araçlarla ortadan kalkabilir.
Wayne Conrad,

8

Her şey belirtilen genişliğe sığarsa, tabular formatlar çok hoş olabilir. Bununla birlikte, bir şey tahsis edilen genişliği aşarsa, o zaman ya tablonun geri kalanıyla dizilmiş olmayan bir kısmına sahip olmak ya da tablonun içindeki diğer her şeyin düzenini uzun öğeyle uyuşacak şekilde ayarlamak gerekli olur. .

Kaynak dosyalar, tablo biçimindeki verilerle çalışmak üzere tasarlanan programlar kullanılarak düzenlenmişse ve daha küçük bir yazı tipi boyutu kullanarak çok uzun öğeleri işleyebilir, bunları aynı hücre içinde iki satıra böler vb. daha sık biçimlendirir, ancak çoğu derleyici, biçimlendirmeyi sürdürmek için bu tür düzenleyicilerin depolaması gereken biçimlendirme türlerinden arınmış kaynak dosyaları ister. Değişken miktarlarda girinti içeren ancak başka bir düzen bulunmayan çizgiler kullanmak, en iyi durumda tablo biçimlendirme kadar iyi değildir, ancak en kötü durumda neredeyse hiç sorun yaratmaz.


Doğru. Kullandığım metin düzenleyicisinin (vim) tabular biçimlendirme ve hatta geniş metinler için korkunç bir desteğe sahip olduğunu fark ettim. Diğer metin editörlerinin daha iyisini yaptıklarını görmedim.
horta

6

Özel durumlar için bu tür bir şey sağlayan 'switch' ifadesi var, ama sanırım sorduğun şey bu değil.

Tablo biçiminde ifadeler olup olmadığını gördüm, ancak bunu değerli kılmak için çok sayıda koşulun olması gerekiyor. 3 İfadeler en iyi şekilde geleneksel biçimde gösterilirse, ancak 20 yaşınız varsa, bunları daha net hale getirmek için biçimlendirilmiş büyük bir blokta görüntülemek çok daha kolaydır.

Ve işte nokta: netlik. Görmeyi kolaylaştırırsa (ve ilk örneğinizin: sınırlayıcının nerede olduğunu görmek kolay değildir), duruma göre biçimlendirin. Aksi takdirde, tanımak her zaman daha kolay olduğu için insanların beklediğine bağlı kalın.


1
OP Python kullanıyor gibi görünüyor, yani hayır switch.
Jared Smith,

2
"Eğer ifadeler en iyi şekilde geleneksel formatta gösteriliyorsa, ancak 20 yaşınız varsa" ... o zaman düşünmeniz gereken daha büyük sorunlarınız var! :)
Grimm Opiner

@GrimmTheOpiner Bir dil ayrıştırıcı veya AST stringifier yazıyorsanız, başa çıkmak çok mümkün. Örneğin, bir keresinde her bir ifade türü için bir işlevi 15-20 vaka ile böldüğüm bir JavaScript ayrıştırıcısına katkıda bulundum. Çoğu vakayı kendi işlevlerine ayırdım (kayda değer bir perf artışı için), ancak uzun switchbir gereklilikti.
Isiah Meadows,

@JaredSmith: Görünüşe göre switchkötülük ama önemsiz dallanma yapmak için bir sözlük hazırlayıp daha sonra arama yapmak kötü değil ...
Mark K Cowan

1
@MarkKCowan oh alaycı yakaladım ama benimle alay etmek için kullandığını sanıyordum. İnternette bağlam eksikliği ve ne yok.
Jared Smith,

1

İfadeniz gerçekten bu kadar kolaysa, çoğu programlama dili aşağıdakileri sunar:: branching operator:

return  ( i > 0  ) ? sqrt( i)
      : ( i == 0 ) ? 0
        /* else */ : 1j * sqrt( -i )

Bu kısa bir okunabilir tabular formatıdır. Ancak önemli olan kısım: Bir bakışta "büyük" eylemin ne olduğunu görüyorum. Bu bir iade ifadesidir! Ve değere belli koşullar tarafından karar verilir.

Öte yandan, farklı kodlar uygulayan şubeleriniz varsa, bu blokları girintilemek için daha okunaklı buluyorum. Çünkü şimdi if-ifadesine bağlı olarak farklı "büyük" eylemler var. Bir durumda fırlatırız, bir durumda log tutarız ve geri döneriz veya geri döneriz. Mantığa bağlı olarak farklı bir program akışı vardır, bu nedenle kod blokları farklı dalları kaplar ve geliştirici için daha belirgin hale getirir (örn. Program akışını kavramak için bir fonksiyonun hızlı okunması)

if ( i > 0 )
{
    throw new InvalidInputException(...);
}
else if ( i == 0 )
{
    return 0;
}
else
{
    log( "Calculating sqrt" );
    return sqrt( -i );
}

7
Aslında, "kısa okunabilir tablo formatını" okumak için oldukça kabus görüyorum, oysa OP tarafından önerilen format mükemmel.
Matteo Italia,

@MatteoItalia, bu düzenlenmiş sürüm hakkında nasıl?
Falco,

5
Üzgünüm, daha da kötüsü; Ben aslında geldiğini düşünüyorum ?ve :daha nokta zordur if/ elseve / veya bağlı sembollerin eklenen "gürültü" için anahtar kelimelere.
Matteo Italia

@MatteoItalia: Yüzden fazla değeri olan vakalarım oldu. Tablo değeri hataları kontrol etmeyi mümkün kılar. Çok hatlı, bu imkansız.
gnasher729

1
@ gnasher729 - 100 farklı "değer" için, her bir "öğenin" bir veri yapısını bildirmenin ve bunların hepsini bu veri yapılarının bir dizisi için başlangıçta bir tablo olarak listelemenin çok daha iyi olduğunu gördüm. (Tabii ki burada dil kısıtlamaları geçerli olabilir). Herhangi bir öğe "hesaplamalı" bir boyuta ihtiyaç duyuyorsa, öğe yapısı gerekli işlemi gerçekleştirmek için bir işaretçi veya referans içerebilir. May uygulamaları için bu, kodu büyük ölçüde basitleştirebilir ve bakımı çok daha kolay hale getirebilir.
Michael Karas

1

Enderland'ın daha önce de söylediği gibi, eylem olarak sadece bir "geri dönüşünüz" olduğunu ve bu "geri dönüşü" durumun sonuna doğru etiketleyebileceğinizi varsayıyorsunuz. Bunun neden başarılı olamayacağına dair bazı detaylar vermek istiyorum.

Tercih ettiğiniz dillerin ne olduğunu bilmiyorum, ancak C'yi uzun zamandır kodluyorum. İlk kodlamada veya daha sonraki bakım sırasında hatalara açık kod yapılarına izin vermeyerek bazı standart kodlama hatalarından kaçınmayı hedefleyen bir dizi kodlama standardı vardır. MISRA-C'ye en çok aşinayım, ancak başkaları da var ve genel olarak hepsinin kuralları aynı çünkü aynı dilde aynı sorunları ele alıyorlar.

Kodlama standartlarını sıklıkla gideren popüler hatalardan biri şu küçük hata: -

if (x == 10)
    do_something();
    do_something_else();

Bu, düşündüğünüzü yapmaz. C söz konusu olduğunda, eğer x 10 ise, onu çağırırsınız do_something(), ama sonra x'in değeri ne olursa olsundo_something_else() çağrılır . Yalnızca "if" ifadesinin hemen ardından gelen işlem şartlıdır. Bu kodlayıcının amaçladığı olabilir, bu durumda bakımcılar için potansiyel bir tuzak vardır; ya da kodlayıcının tasarladığı şey olmayabilir, bu durumda bir hata var. Bu popüler bir röportaj sorusu.

Kodlama standartlarındaki çözüm, tek satırlı olsalar bile tüm koşullu eylemlerin etrafına parantez koymaktır. Şimdi anlıyoruz

if (x == 10)
{
    do_something();
    do_something_else();
}

veya

if (x == 10)
{
    do_something();
}
do_something_else();

ve şimdi düzgün çalışıyor ve bakımcılar için açık.

Bunun tablo tarzı biçiminizle tamamen uyumlu olmadığını fark edeceksiniz.

Diğer bazı diller (örn. Python) bu soruna baktı ve kodlayıcıların mizanpajı netleştirmek için boşluk kullandığı için parantez yerine boşluk kullanmanın iyi bir fikir olacağına karar verdi. Yani Python'da

if x == 10:
    do_something()
    do_something_else()

hem çağrı yapan do_something()ve do_something_else()buna, x == 10 şartına

if x == 10:
    do_something()
do_something_else()

bunun yalnızca do_something()x'e bağlı olduğu ve do_something_else()her zaman denildiği anlamına gelir .

Bu geçerli bir konsepttir ve onu kullanmak için birkaç dil bulacaksınız. (Onu ilk önce Occam2'de gördüm.) Yine de, tablo tarzı biçiminizin diline uymadığını kolayca görebilirsiniz.


1
Bence noktayı kaçırdın. Bahsettiğiniz konu, konuştuğunuz soruna neden olan, C'ye özgü standart dışı bir kabus. C kodluyorsanız, önerilen basit formatlı format varsa, basit olanı kullanmanızı asla tavsiye etmem. Bunun yerine, C kullandığınızdan beri, tüm satırları tek satırda ayraçlar kullanırsınız. Parantezler tablo formatını daha da netleştirir, çünkü sınırlayıcı olarak davranırlar.
horta

Ayrıca, bu durumda iade ifadeleri sadece bir örnektir. Genel olarak, bu kod kokusu kendi içinde olabilir. Sadece basit ifadelerin formatına atıfta bulunuyorum, mutlaka geri dönüş ifadeleri ile değil.
horta

2
Demek istediğim, bu bir masa formatını daha da zorlaştırıyordu. Bu arada, C'ye özgü değil - C'den türetilen tüm diller tarafından paylaşılıyor, böylece C ++, C #, Java ve JavaScript hepsi aynı anlama geliyor.
Graham,

1
Bunun geri dönüş ifadeleri olduğunu umursamıyorum - Niyeti basit ifadeler göstermek niyetindeyim. Ama daha hantal olur. Ve elbette, herhangi bir ifade basit olmaz olmaz, o zaman formatlamayı değiştirmeniz gerekir, çünkü tablo formatını korumak mümkün değildir. Kod gizleme yapmazsanız, uzun kod satırları kendi başlarına bir kokudur. (Orijinal sınır 80 karakter, bugünlerde daha genel olarak 130 karakter civarındaydı, ancak genel ilke hala çizginin sonunu görmek için kaydırma yapmanız gerekmediğini söylüyor.)
Graham

1

Tablo düzeni, birkaç sınırlı durumda yararlı olabilir, ancak if ile kullanışlıdır.

Basit durumlarda?: Daha iyi bir seçim olabilir. Orta durumlarda, bir anahtar genellikle daha uygun olur (eğer dilinizde varsa). Karmaşık durumlarda, çağrı masalarının daha uygun olduğunu görebilirsiniz.

Yeniden düzenleme yaptığım kod yeniden düzenlenirken, onu açıkça belli etmek için sekmeli hale getirdiğim birçok kez oldu. Nadiren bu şekilde bırakmamın bir nedeni, çoğu durumda sorunu anladıktan sonra çözmenin daha iyi bir yolu olabilir. Bazen bir kodlama uygulaması veya düzen standardı bunu yasaklar, bu durumda bir yorum faydalı olur.

Hakkında bazı sorular vardı ?:. Evet, bu üçlü operatördür (ya da eğer değerini düşünmeyi sevdiğim gibi). ilk bakışta, bu örnek için biraz karmaşık:: (ve fazla kullanım?: okunabilirliğe yardım etmiyor, ancak onu incitiyor), ancak bazı düşüncelerle örnek aşağıdaki gibi yeniden düzenlenebilir, ancak bu durumda bir anahtarın en okunaklı olduğunu düşünüyorum çözüm.

if i==0: return 0
return i>0?sqrt(i):(1j*sqrt(-i))

1
Başlatılmamışlar için "?:" Nin ne olduğunu açıkça belirtmeniz gerekebilir (örneğin, muhtemelen soruyla ilgili bir örnek ile).
Peter Mortensen

Sanırım bu üçlü operatör. Üçlü operatörün, insanların gün içinde ve gün içinde gördükleri ve dolayısıyla kolayca okuyabilecekleri başka şeyler formatı yaparsa, standardı yeniden düzenleme eğiliminde olmasının iyi bir nedenden dolayı dışlanmış olduğunu hissediyorum.
horta

@PeterMortensen: Eğer başlatılmamış bunun ne anlama geldiğini bilmiyorsa, açık bir soru sorup öğrenene kadar koddan uzak durmalılar.
gnasher729

@horta Ternary if ? do stuff : do other stuff. Bir if / else ile aynı sırada.
Navin,

1
@Navin Ah, belki de en çok kullandığım dilin (python) bir başarısızlığı. stackoverflow.com/questions/394809/…
horta

-3

Tablo biçiminde yanlış bir şey görmüyorum. Kişisel tercih, ancak böyle bir üçlü kullanırım:

return i>0  ? sqrt(i)       :
       i==0 ? 0             :
              1j * sqrt(-i)

returnHer seferinde tekrar etmenize gerek yok :)


1
Birkaç yorumda da belirtildiği gibi, iade ifadeleri ideal değil ya da yazının amacı değil, sadece çevrimiçi bulduğum ve birkaç şekilde biçimlendirdiğim bir kod parçası.
horta

Python üçlüler do_something() if condition() else do_something_else()değil condition() ? do_something() : do_something_else().
Isiah Meadows,

@IsiahMeadows OP Python'dan hiç bahsetmedi.
Navin,
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.