İşlev türünü ve yöntem adını C'deki farklı satırlara yerleştirme nedeni


16

Bir şirkette yeni başladım ve ilk kod incelememdeki stil yorumlarından biri, dönüş türü ve yöntem adının farklı satırlarda olmasıydı. Örneğin, bu

void foo() {
}

bu olmalı

void
foo() {
}

Her zaman ilk stili kullandım ve insanların ikinci stili kullanmasının kişisel tercih dışında bir neden olup olmadığını merak ediyordum. İlki okunabilirliği hiç incitmiyor. C programcıları ve büyük açık kaynak projeleri ile biri diğerinden daha mı yaygındır?


3
Bu GNU standardındadır (bunun iyi bir şey olduğunu söylemek gerekmez, destekleme tarzı gariptir). gnu.org/prep/standards/standards.html#Formatting
Gauthier

Yanıtlar:


19

insanların ikinci stili kullanmasının kişisel tercih dışında bir neden olup olmadığını merak ediyor muydunuz?

Bu, C'nin ilk günlerinde popüler olan bir stildir, bu yüzden bunun nedeni, çok uzun bir süredir böyle yapmaları olabilir, buna benzeyen çok fazla kodları var ve bu da herkes alışkın. Kurumsal momentum kadar kişisel tercih değil.

Başka bir neden de işlev adlarının her zaman ilk sütundan başlamasıdır. Dönüş türlerinin uzunluğu farklılık gösterir ve biraz karmaşık olabilir - türü kendi satırına koymak işlev adını bulmayı kolaylaştırır.

Şirketin belirlenmiş bir stili varsa, bir kodlama standartları belgesine de sahip olabilir. Bunun için sormak. Bu seçimin nedenlerini açıklayabilir ve bir kopyasına sahip olmak, gelecekteki incelemelerde benzer sorunlardan kaçınmanıza yardımcı olacaktır.


2
Sanırım hala birçok programcı tarafından kullanılan ve savunulan 80 karakter sınırına bağlı. 80 karakter sınırına sahip olmak ve açıklayıcı yöntem / işlev adları kullanmak istiyorsanız, bazı ödünler vermeniz gerekir. Yöntem başlığını bölmek bunlardan biridir.
Sulthan

Bildirim daha uzun da olabilir - çağıran kongre tanımlayıcıları (stdcall vb.), Sembol görünürlüğü (DLLEXPORT) veya __attributes gibi farklı (standart dışı) değiştiricileri düşünün . Ve sonra da C ++ 'a bakarken nispeten karmaşık dönüş türlerine sahip olabilirsiniz, bu yüzden bir yerde bir satır sonu eklemek zorunda kalabilirsiniz.
johannes

@Sulthan İlginçtir, sadece programcılar (terminal pencerelerine ve terminal editörlerini kullanmaya alışkın) değil. Dizgi yazımında 72-80 karakter genellikle okunabilirlik açısından bir metin sütunu için ideal genişlik olarak kabul edilir. (Bu nedenle TeX ve türevleri neden bazı insanların tuhaf dar sütunlar olarak kabul ettiklerini varsayılan olarak
ayarlar

1
@JAB Aslında şimdi bunu. Ayrıca, haklı bir metin okumanın ve kaynak kodunu okumanın çok farklı iki şey olduğunu ve neredeyse ortak hiçbir şeyin olmadığını, bu nedenle ideal genişliğin önemsiz olduğunu biliyorum.
Sulthan

1
"Başka bir neden, işlev adlarının her zaman ilk sütunda başlamasıdır ve böylece bulunması daha kolaydır." Ve bu sadece görsel bir faydadan çok daha fazlasıdır: Şimdi normal ifadeyi arayabilir ^start_of_a_long_funcve hemen aradığımız fonksiyona geçebiliriz.
underscore_d

7

Bu bulduğum tek kod biçimlendirme kuralı aslında okunabilirlik üzerinde belirgin bir etki yaratıyor ve neredeyse hiç çaba gerektirmiyor (kod düzenleyicinizin bununla bir kavga başlatmadığını varsayarak).

Tanımlamalarda / tanımlarda adların tutarlı bir konumda görünmesi iyi bir programlama dili tasarımıdır. Gerekçe açıktır: adın başlangıcını hemen bulmak için kullanabileceğiniz hoş bir görsel çapa (kıvırcık bir ayraç veya sadece asılı bir girinti) var. Bir dosyayı tararken adı bulmak için dili ayrıştırmanız gerekmez.

Bir belgeyi biçimlendirirken kullandığınızla aynıdır: yeni bir bölüm başlattığınızda, adı uzun bir cümle içinde bir yere gömülmemiş, farklılaştırılmamış olarak, kalın yazı tipine - genellikle kendi satırına - öne koyarsınız.

Erken C'nin çok kısa imzaları vardı: dönüş türleri isteğe bağlıydı ve imzadan sonra argüman türleri bildirildi. İsimler de çok kısa olma eğilimindeydi. Bu, adı dengeleyen ara sıra bir dönüş türünün etkisini azaltmıştır.

double dot(x, y);

Hala oldukça sindirilebilir.

C ++ bunu biraz daha kötüleştirdi. Bağımsız değişken türü belirtimlerini imzalara taşıyarak imzaları daha uzun hale getirdi. Bu sözdizimi daha sonra C'nin standardizasyonu sırasında kabul edildi.

static struct origin *find_origin(struct scoreboard *sb,
                  struct commit *parent,
                  struct origin *origin)

daha az sindirilebilir, ancak çok kötü değil. (Git'ten alıntı)

Şimdi uzun, açıklayıcı isimler ve parametrelerle belirlenmiş modern programlama uygulamalarını düşünün ve bu seçimin nasıl felaket haline geldiğini görün. Bir Boost başlığından bir örnek:

template <class A1, class A2, class A3, class A4, class A5, class A6>
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
{ 
   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
   return result_type(); 
}

Genel kod yazıyorsanız, bunun gibi imzalar olağan dışı bile değildir. Çok fazla çaba harcamadan bundan daha kötü durumların örneklerini bulabilirsiniz.

C, C ++ ve türevleri Java ve C #, okunabilir bildirimlere / tanımlara sahip olmanın istisnaları gibi görünmektedir. Popüler selefleri ve akranları (Fortran, ALGOL, Pascal) sonuç türlerinden önce isimler yerleştirdiler ve neyse ki, haleflerinin çoğu (birkaçını adlandırmak için Go, Scala, TypeScript ve Swift) daha okunabilir sözdizimlerini seçti.


1
Fortran programları yazmak zorunda olmadığınız için minnettar olun. Size söylüyorum, fonksiyon argümanlarınızı ayrı ayrı ilan etmek zorunda kaldığınızda sinirlerinize çok çabuk ulaşacaktır. Özellikle hangi argümanların beklediğini anlamak için bir işlev imzasını okumaya çalışırken: C ++ türleri ait oldukları yere koyar, Fortran, türünü belirlemek için değişken adı için görsel bir anahtar kelime araması başlatmaya zorlar.
cmaster - eski haline monica

2
Türleri işlev bildirimine koymak C ++ tarafından gerçekten icat edildi mi? Durumun böyle olduğunu hiç duymamıştım ve alıntı bulmakta zorlanıyorum.
underscore_d

1
Bkz . C Dilinin Gelişimi . Standardizasyon bölümünde Ritchie sözdiziminin C ++ 'dan ödünç alındığından bahseder.
user2313838

5

İlk olarak C & C ++ ile çalışan 19. yıl gibi bu tarzda tanıştım. Birisi bu kötü şeyi nasıl icat edebileceği konusunda şaşkına dönmüştü.

Bulabildiğim tek (potansiyel olarak) pozitif nokta grep ^ FuncName kullanarak funciton tanımını bulabilmenizdir. Bazı gerçek araç nefret topluluklarında on yıl + önce ilgili faktör olabilir ... Gördüğüm yerde, bu özelliği bile öldüren C ++ ve sınıf üyesi funcitons'a uygulandı.

Sanırım benim fikrim. :)


1
grep -P '^(\w+::)?FuncName'
Kyle Strand

Evet, işlev adlarındaki sınıf türleri bunun kullanımını hiç engellemez. Bu nedenle, kaynak dosyalarda hızlı gezinmek için hala yararlı bir şey. Kötülük ya da her neyse, görüşler fikirlerdir: Daha iyi göründüğünü düşünmeye geldim.
underscore_d
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.