Operatörden önceki / sonraki satır sonu [kapalı]


29

Sun'ın Java kodu konvansiyonu, operatörün önüne satır sonu koymayı önermektedir, diğer birçok kılavuz buna katılmamaktadır. Herhangi bir belirgin avantaj ve dezavantaj göremiyorum, bu yüzden bu tarzlardan birini diğerine kullanmanın avantajları var mı?

String longVarName = a + b + c + d +
          e + f;

vs

String longVarName = a + b + c + d
          + e + f;

Her iki sözleşmeyi de gösteren basit bir kod örneği gönderebilir misiniz?
Michael

Öncelikle böyle bir şey kullanarak durumdan kaçınmaya
İş

Bağlantı koptu.
Florian F

Yanıtlar:


14

Bunu bir satırda bırakıp, niyeti açığa çıkaran değişken isimleri (ve fonksiyonlar) açısından okunabilirliği düşünürdüm.

Ortalık dağılınca , yeniden harekete geçme zamanı :

  • vars yeniden adlandır
  • yeni değişkenler / fonksiyonlar tanıtmak

Örnek

subtotal = price * (100 + tax_ratio) / 100`

vs.

tax = price * tax_ratio / 100
subtotal = price + tax

2
Soldaki formül yanlış. Yüzde ya da kesirli olmasına bağlı olarak ya ya price * (100 + tax_ratio) / 100da sadece olmalıdır . price * (1 + tax_ratio)tax_ratio
Rufflewind

4
Bu soruya cevap vermiyor. Bu tür cevaplara karşı bir kanun olmalıdır.
Edward D'Souza

@ EdwardD'Souza Aynı hissediyorum. Fakat cevap neden kabul edildi?
Rudy Vissers

@RudyVissers cevabı sorunu daha derinden çözer. Her şeyden önce hat kesmesi gerekme sorununu çözer. Bu açıdan bakıldığında, OP onun sorununun cevabı olduğunu düşünebilir, ancak yine de bu bir topluluk wiki olması açısından uygun değildir.
Edward D'Souza

hey, ben artık buralarda değilim ama çok basit - eğer böyle bir durumda bulursanız, muhtemelen yanlış yapıyorsunuzdur ve kodu yeniden düzenlemeyi düşünmelisiniz - ya da başka türlü koymak gerekirse, 15 yıllık programlamadan sonra sadece artık böyle şeyleri umursamıyorum, umrumda olan şey kod açıklığı, basitlik ve diğer insanların bana yardım etmesini kolaylaştırmak
Kamil Tomšík

36

Okunabilirliğin bir argüman olduğunu hayal edebiliyorum

result = longidentifier +
   short -
   alittlelonger -
   c;

e karşı

result = longidentifier
   + short
   - alittlelonger
   - c;

İkinci örnekte, operatörler güzel bir şekilde sıralanmıştır ve değişkenin denkleştirmeye hangi işareti girdiğini kolayca görebilirsiniz. Bence bu ikili operatörler için de anlam ifade ediyor, ancak destek vb. İle daha net olanı yapmalısınız.


4
Operatörlerin önemli olduğu durumlar için (matematiksel ifadeler ve benzeri gibi) iki numarayı seçerdim, çünkü sizin dediğiniz gibi, çok daha okunaklı. Ancak dizgiler için ilk seçeneği seçeceğim, çünkü operatörler “anlamsız”. Dizeleri bir araya getirmekten başka bir şey yapmazlar ve dizeler önemli bittiği için ilk seçenekleri tercih ederdim.
Niklas H,

Her iki durumda da hak var. Her iki durumda da hepsini çok uzun bir hatta koymaktan iyidir! Tercihim, başlangıçta bir açılış braketi kullanmak (gerekmese de) ve daha sonra her şeyin aynı hizada olmasını sağlamak. Bu çok daha açık hale getirir.
hızla_ben

35

Normalde en çok kullanılan stil kurallarını veya belirli bir kodlama standart araçlarını izlerim. Yaygın olarak kullanılan bir stil kullanmanın avantajı, başkalarının kodlarını okurken veya bir stil kurallarının belirlendiği açık kaynak kodlu bir projede yer aldığınızda fayda sağlar.

Gördüğüm en yaygın stiller, sorudaki ikinci stildir. Bunların listesi için aşağıya bakın:

Google Stil Kılavuzu :

Atama dışı bir operatörde bir çizgi kesildiğinde, mola sembolden önce gelir.

Sun Kodlama Sözleşmesi :

Bir operatörden önce ara

Checkstyle Operatör Wrap çek 'ın varsayılan değer nl geçerli:

Operatör yeni bir satırda olmalı


2
Netlik aşkına + Sun'ın kodlama sözleşmesine olan cevabım güncellendi.
ceilfors,

google.github.io/styleguide/javaguide.html (cevabın içindeki bağlantı koptu)
Martin Pfeffer

10

Kodda operatörden sonra ara verme eğilimindeyim:

foo = some_long_expression() +
      some_other_long_expression();

Burada bir satırın sonundaki sarkan operatör, kodun devam ettiği okuyucuya büyük bir ipucudur. İfade sonlandırıcıları olmayan dillerde, bu sarkan operatör, derleyiciye / tercümana kodun devam etmesi için yeterli bir ipucu olarak hizmet verebilir (aksi halde çirkin bir devam hattı yapısı kullanmak zorunda kalırdım).

Bu ifadeyi belgelendirirken (dokümantasyona ihtiyacı varsa), molayı operatörden önce koyma eğilimindeyim.


En azından bazı diller (örn. Python), satırın devam ettiğini ancak daha fazlasını gerektirdiğinin bir ipucu olarak takip eden bir ikili operatör almaz. Parens içindeki yeni satırların genellikle sayılmadığını, dolayısıyla açık (ve hataya açık) bir satır devam karakterine ihtiyacınız olmadığını unutmayın.

3

Tutarlı kaldığınız sürece, hiçbir şekilde gerçek bir avantajın olmadığını bilin. Bu özellikle kod birleştirme ve beyaz boşluk dikkate alındığında önemlidir.


3

Satırın, kırmak istediğiniz ifadenin ayrıştırma ağacındaki en yüksek sembolle başlaması gerektiğine inanıyorum. İfadede en önemli olan işleci vurgular. Önceki satırın sonuna değil, satırın başına başka bir satır koymanızın nedeni aynıdır.

Aşağıdaki örnekte, sol kenar boşluğunu taradığınızda, ifadenin yapısını 3 ifadenin OR'si olarak görürsünüz.

if (ch>='A' && ch<='Z'
    || ch>='a' && ch<='z'
    || ch>='0' && ch<='9')
{...}

Aşağıda, || operatörler daha az vurgulanır. Bu bir daha az belirgindir || ifadelerin Özellikle, çizgiler farklı uzunluklarda olsaydı.

if (ch>='A' && ch<='Z' ||
    ch>='a' && ch<='z' ||
    ch>='0' && ch<='9')
{...}

Ve sadece referans olarak, bu çok yanlış. || operatörler hiç vurgulanmaz.

if ( ch>='A' && ch<='Z' || ch>='a'
     && ch<='z' || ch>='0' && ch<='9')
{...}

Hatta nadiren görmeme rağmen, satırın başına virgül koymayı seviyorum. Bunu paylaşılan kodda yapmaktan kaçınıyorum.

var note:Object =
    { key: key
    , type: 'P'
    , text: someLongProcedureCallGettingTheUserInitials()
       + ": " + getTheTextThatWasTyped()
    };

2

Uzun aritmetik denklemler için genellikle iki şeyden birini yaparım.

her şeyi tek bir satırda bırakın:

foo = bar + baz - fizz + buzz + alpha - beta;

Bunu sadece toplama ve çıkarma içeren denklemler için yapıyorum, operatörün kapsamını ciddi şekilde karıştırabilecek çarpma ve bölme ile yazım hatası yapmayı çok kolay buluyorum.

kullandığım ikinci biçim aşamalı işleçler:

foo = bar;
foo += baz;
foo -= fizz;
foo += buzz;
foo /= alpha - beta;
foo *= spiff;

Performansı gözle görülür şekilde iyileştirmediği kanıtlanmadıkça, onu tek bir hatta kısaltmak için hiçbir neden görmüyorum. Ek olarak, nerede olup bittiğine dair hiçbir belirsizlik yoktur ve /ve *operatörler için bir parantezi yanlış yerleştirme şansı daha azdır .


2

Birleştirme karakterini (veya herhangi bir işleci) satırın başına yerleştirmek okunabilirliği artırır. Her satırın başında odaklanarak kodu tarıyoruz. Bir satır bir operatörle başladığında, okuyucu, bir karakterin taranmasıyla satırın önceki ifadenin devamı olduğunu söyleyebilir.

Uzun matematiksel ifadeler her zaman dizgiseldir, böylece her yeni satır bir işleçle başlar. Kodun bu sözleşmeyi izlememesi için hiçbir sebep yoktur.


0

İfadeyi bir satırda bırakın ve çok uzun olursa, o zaman daha küçük ifadelere ayırın:

days = ((year * months_per_year) + month) * days_per_month + day

dönüşür:

months = year * months_per_year + month
days = months * days_per_month + day

Bu mümkün değilse, operatörden önce kırmayı daha fazla okunabilir buluyorum ve operatörün doğrudan önceki atamanın altına başlamasını sağlamak (değişkenin altına koymak beni düşündürmek zorunda bırakıyor; şeyleri okumayı kolaylaştırmak için):

random = years * months_per_year 
         + month * days_per_month 
         + day * hours_per_day 
         + hour * minutes_per_hour 
         + minute * seconds_per_minute 
         + second

1
Bu cevap daha önce söylenenlere yeni bir şey eklemez.
Martijn Pieters
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.