Microsoft neden parametreleri, yerel değişkenleri ve özel alanları aynı ad adlandırma kuralına sahip yaptı?


18

Bu soruyu bir süre önce sordum: Özel değişkenlerinizi C # olarak nasıl adlandırıyorsunuz?

Yanıtlardan birinde, özel değişkenlerin / alanların şu şekilde adlandırılması gerektiğini gösteren Microsoft'un MSDN sayfasına yönlendirildim:

private int myInteger;

Ancak bir parametre şöyle olur:

void SomeMethod(int myInteger)

ve yerel bir değişken şöyle olur:

int myInteger;

Yani onlara böyle referans verdiğinizde

myInteger = 10;

hangisinden bahsettiğinizi bilmenin hiçbir yolu yok.

Şimdi yeni bir projeye başlıyorum ve iş arkadaşlarımdan biri bana bunlardan en azından bazılarını ayırt etmek için neden bir şey yapmadığımızı soruyor.

Aynı şeyi merak ediyorum. Microsoft'un standardı neden bunları farklı tutmadı?


10
"Hangisinden bahsettiğini bilmenin hiçbir yolu yok" demekle ne kastediyorsun? Tabii ki - kapsam.
Thomas Owens

2
Bu rehberlik modası geçmiş gibi görünüyor, yeniden şekillendirici varsayılan (bir defacto stil kılavuzunun bir şey haline gelmiştir) özel alanları her zaman zaten yaptığım bir alt çizgi ile önek önerir.

25
@kekekela: Kesinlikle modası geçmiş değil; StyleCop, alt çizgi ile başlayan üye değişkenlerin herhangi bir örneğini açıkça işaretler. Açıkçası alt çizgiyi anlamsız ve sinir bozucu buluyorum çünkü kasa tam olarak aynı bilgileri veriyor. Kapsamı açık yapmanız gerekiyorsa atama ile önek ekleyin this..
Aaronaught

12
@Aaronaught Bir sürü "bu." kodum etrafında dağılmış anlamsız ve rahatsız edici.

12
@kekekela: Ben tek yer hiç kendimi o yapmak zorunda bulmak yapıcı olduğunu ve tam anlamıyla üyesi alanlarına başlangıç değerleri geçiyoruz çünkü yapıcı içinde pek de mantıklı ( this.component = component). Kendinizi başka bir yerde belirsiz kapsamlarla bulursanız, "bir sürü gereksiz" buna sahip olacaksınız. kodunuzun etrafına dağılmışsa ", kötü yazılmış bir kodunuz vardır.
Aaronaught

Yanıtlar:


14

Orijinal adlandırma kurallarının sınıf üyeleri için bir m_ öneki vardı, bu basit bir alt çizgiye indirgendi. Alt çizgi öneki kullanarak çok daha eski bir C # Microsoft kodu görürsünüz. Ancak, bir kez Tech Ed'de önde gelen alt çizginin CLS uyumlu olmadığını duydum. Bunun daha basit bir isim-hepsine uyar şemasına geçmelerinin nedeni olduğunu varsayıyorum. VB.Net'in büyük / küçük harf duyarsız isimlerinin de CLS uyumlu olmadığı (şimdi emin değilim).

Ne için değer, ben hala sınıf üyeleri için önde gelen alt çizgi kullanın. Bunu (adın aksine this.name) kullanarak netleştirebilmenize rağmen, hatalar hala geçer.

MS'in size söyleyeceği her şeyi yapmak zorunda değilsiniz.


1
Bence "CLR-uyumlu" ile "CLS-uyumlu" karıştırdınız. Bir şey CLR uyumlu değilse, derlenmez. CLS, yalnızca diğer dillerle uyumlu olmayabileceğine dair bir uyarıdır ve temel olarak yalnızca genel üyeleri etkiler (teknik olarak, montajınızın dışında görünen şeyler).
Joel C

@Joel - Haklısın. Bu soru onunla ilgileniyor: stackoverflow.com/questions/1195030/…
dave

2
Hala "m_" önekini kullanıyorum ...
CesarGon

4
+1 "sizin için MS'in size söylediği her şeyi yapmak zorunda değilsiniz". Kendiniz düşünün!
gbjbaanb

1
Alan sadece CLS uyumlu protecteddeğildir, değilprivate
Rachel

9

localve parameterdeğişkenler aynı şekilde adlandırılır çünkü kapsamları aynıdır

Özel değişkenlere gelince, bu konuda farklı görüşler vardır. Her zaman burada bulunan , _özel değişkenlerden önce bir lider kullanmayı belirten standartları kullandım , ancak yazar _biraz tartışmalı olduğunu ve Microsoft'un buna karşı önerdiğini söylüyor .

Wikipedia , C ve C ++ 'da

Çift alt çizgi veya alt çizgi ile başlayan isimler uygulama için ayrılmıştır (derleyici, standart kütüphane) ve kullanılmamalıdır (örneğin __reserved veya _Reserved).

belki de birçok Microsoft geliştiricisinin _zaten kendi özel değişkenleri için bir önek kullandığı oldukça iyi bilinmesine rağmen, Microsoft'un buna karşı önerilmesinin ardındaki neden buydu .


2
Aynı kapsama (+1) sahip parametre ve yerel değişkenler hakkında güzel bir nokta. Kimse bundan bahsetmedi. Sonuç, parametreyle aynı ada sahip yerel bir değişkene ihtiyacınız varsa, sadece parametreyi kullanabilmenizdir. Şahsen ben çirkin ve kesin olmayan alt çizgi buluyorum. Oysa thiskesinlikle mevcut nesneyi ifade eder. Nefreti anlamıyorum this. Yanlış anlaşıldığı için mi?
Jason S

4

Onları neden farklı tutmadıklarını söyleyemem. Standartları oluşturmaya katılan biri bu soruyu görmezse kimse yapamaz.

Birçok kişi, örnek değişkenlerini önek olarak ekleyerek kendi kurallarını oluşturur _ veyam_ , ancak gerçekten önemli olduğunu düşünmüyorum. Bağlamdan çok şey çıkarabilirsiniz ve bu günlerde IDE'ler size yardımcı olacak kadar akıllıdır. Örneğin, ReSharper eklentisine sahip Visual Studio, yerel değişkenleri ve örnek değişkenleri farklı renklerde gösterecektir.

İki kapsamı birbirinden ayırmanız gerçekten önemliyse, this. örnek değişkenine başvurmak için öneki :

public class Test
{
    private int myInteger;

    void SomeMethod(int myInteger)
    {
        this.myInteger = 10; // sets instance variable to 10
        myInteger = 10; // does not affect the instance variable.
    }
}

Başka eklenti olmadan, Visual Studio varsayılan olarak Intellisense ile size yardımcı olacaktır:

ekran görüntüsü

(Pop-up hala ReSharper tarafından şekillendirilmiş olabilir, ancak ReSharper yerleşik Intellisense özelliklerine hiçbir şey eklemez, bu nedenle stok biraz farklı görünebilir, ancak yine de orada her iki seçenek de olacaktır. )

Değişken adlandırma ve kapsamla ilgili olası sorunları yakalamanıza yardımcı olması için FxCop ve StyleCop gibi kod analiz araçlarını da kullanabilirsiniz .


Biraz detaylandırmak için thisher zaman tercih ederim this, çünkü bulunduğunuz ev ne olursa olsun mevcut örneğe kesinlikle atıfta bulunur, bu yüzden kesindir. Alt çizgi veya alt çizgi m kuralları sadece - örnek değişkenlere atıfta bulunabilen veya geçmeyen sözleşmelerdir ve bunlar tarafından gereksiz yapılır this. Alt çizgiyi yararlı gördüğüm tek yer, nesne ve sınıf adlarını ayırt etmek için büyük / küçük harfe duyarlı olmayan VB'dir. Ama bu başka bir hikaye.
Jason S

4

Microsoft'un standardı neden bunları farklı tutmadı?

Microsoft'taki insanlar, bazı şeylerin neden deve kaplaması ve diğerleri paskal kaplaması da dahil olmak üzere bir dizi konvansiyonu açıklayan Çerçeve Tasarım Yönergeleri adlı bir kitap yazdı. .

Düzenle (kitaptan ayrıntı ekleyerek):

Kitapta, kullanılabilirlik çalışmaları yapmanın yanı sıra Turbo Pascal grubunu edinmekten öğrenilen bazı derslerden bahsediyorlar. Ayrıca, tüm diller büyük / küçük harfe duyarlı olmasa da (VB gibi), diğerleri (C # gibi) olduğundan, birinin adlandırmasında tutarlı olması gerekir. Kişi, sadece maddeleri ayırt etmek için farklı olan durumlara bağlı olamaz. Çerçevenin geri kalanı tarafından kullanılan sözleşmelere sadık kalırsa, geliştiriciler tarafından daha az karışıklığa yol açacaktır.

Bölüm 3, Adlandırma Yönergeleri.
Bölüm 3.1 büyük harf kullanım sözleşmeleridir.

camelCasingparametre adları içindir.
PascalCasingad alanı, tür ve üye adları içindir. Adın bir parçası olarak 2 harfli kısaltmalar olması durumunda, bunları büyük harfle bir arada tutunIOStream .

Bölüm 3.5 sınıfları, yapıları ve arayüzleri adlandırmayı kapsamaktadır.
Bölüm 3.6, isimlendirme türü üyelerini kapsar.
Bölüm 3.7, adlandırma parametrelerini kapsar.


4
Kitabın sahibi olmayan bizler için özetlemek ister misiniz?
Kramii

Kramii'ye katılıyorum. Bir özet harika olurdu!
Vaccano

@Kramil, Vaccano, Görünüşe göre kütüphaneden tekrar kontrol etmem gerekecek. Normalde bunu sadece yeni bir işe başlarken yaparım ve tartışmalar adlandırma ve kodlama standartlarına yönelir.
Tangurena

1
lol, yani "Kişi ayırt etmek için tek başına durumda farklılıklara bağlı olamaz", daha sonra öğeleri ayırt etmek için camelCase veya PascalCase kullanın söylemeye devam ediyor.
gbjbaanb

1

Çünkü yazıldığı ortama bağlı oldukları için oldukça ayırt edilebilirler.

Örneğin, üye değişken olarak hiç parametre kullandınız mı? Veya parametre olarak yerel bir değişken? Yerel değişken olarak bir üye değişkene ne dersiniz?

  • Tüm üye değişkenler bir sınıfın "gövdesinde" bulunur. thisBenzer bir ada sahip yerel bir değişkenten ayırt etmek için kullanabileceğiniz zaman üyeye ön ek yapmanız gereken argümanı satın almıyorum , aksi takdirde gerekli değildir.

  • Yerel değişken ayrıca yalnızca bir yöntemin kapsamı içinde veya bir kod bloğu kapsamı içinde tanımlanır.

  • Bir parametre her zaman yöntem imzasında tanımlanır.

Bu tür değişkenlerin hepsini karıştırırsanız veya karıştırırsanız, daha okunabilir veya keşfedilebilir hale getirmek için kod tasarımınız hakkında gerçekten daha fazla düşünmelisiniz. Onlardan daha iyi ve daha açıklayıcı adlar verin myInteger.


0

Microsoft standartları hakkındaki sorunuza cevap veremiyorum. Bir standardın bu şeyleri ayırt etmesini istiyorsanız, PL / SQL parametreleri için kullandığım standart, parametre adının önüne,,,,, için in_, out_ve io_dışında için parametrelerin önüne gelir . Bir işlevin yerel değişkenleri a ile başlar v_.


0

Tanıdığım çoğu şirket, üye değişkenleri için önek olarak alt çizgi veya küçük harf m ("üye" için) belirten kodlama standartlarına sahiptir.

Yani

_varName

veya

mVarName



"Çoğu şirket" bu sorunun konusu olan Microsoft'u içermez.
Aaronaught

1
Micrsoft MSDN'nin Microsoft'taki dahili kodlama standartları için olduğunu bilmiyordum.
JeffO

1
@JeffO: Haklısın, değil, ama dahili kodlama kuralları aynı şeyi söylüyor .
Aaronaught

0

Diğer insanların işaret ettiği gibi, genellikle öğenin hangi kapsamda kullanıldığını söyleyebilirsiniz. Parametreyi ve yerel değişkeni aynı kapsamda tutamazsınız ve özel değişkeni istiyorsanız, this.myInteger öğesini kullanın. Bu yüzden Microsoft'un bu konuda çok endişeli olduğunu düşünmüyorum, çünkü isterseniz aralarında kolayca ayrım yapabilirsiniz.

Ancak, henüz kimsenin bunu söylemediğine biraz şaşırdım, ancak Microsoft'u ve adlandırma kurallarını unutun (bir toplantıya koşmak zorunda kalmadan ve bunu göndermeden açık bıraktığımdan beri birisi bunu söylemiş olabilirdi) o). Macarca gösterim de Microsoft'ta başlatılan bir adlandırma kuralıydı (ya da Xerox muydu? Simonyi'nin ne zaman geldiğini hatırlayamıyorum). Bu güne kadar Macarca gösterimin adını lanetlemediğini bildiğim kimseyi düşünemiyorum. İçinde kullandığımız kendi standardımızla geldiğimiz yerde çalıştığımız için çok rahatsız olduk. Bize daha mantıklı geldi ve çalışmalarımızı biraz hızlandırdı (aslında Microsoft'un şimdi önerdiğine oldukça yakındı, ancak özel değişkenler hariç her şey paskal bir durumdu).

Bununla birlikte, Microsoft'un kullandığı daha yeni standart (deve çantası ve pascal kasa karışımı) çok kötü değil. Ancak siz ve iş arkadaşlarınız hoşunuza gitmiyorsa, kendi standartlarınızı oluşturun (topluca en iyisidir). Bu elbette şirketinizin zaten bir dizi standardı olup olmadığına bağlıdır. Eğer yaparlarsa, onlara sadık kalın. Aksi takdirde, siz ve iş arkadaşlarınız için neyin işe yaradığını bulun. Sadece mantıklı kal. '

Aaronaught, Charles Simonyi ve Macar Gösterimi hakkında alıntı istediğinden beri: http://en.wikipedia.org/wiki/Charles_Simonyi

http://en.wikipedia.org/wiki/Hungarian_notation

http://msdn.microsoft.com/en-us/library/aa260976(v=VS.60).aspx

http://ootips.org/hungarian-notation.html

http://www.hitmill.com/programming/vb/Hungarian.html

http://web.mst.edu/~cpp/common/hungarian.html

Son ikisi sadece Macarca gösterimin örnekleridir ve ootip bağlantısı, konuyla ilgili bazı görüşlere ilişkin bazı alıntılardır. Ayrıca sistem Macarca Notasyonu olduğunu unutmayın, ancak aynı zamanda, bildiğim kadarıyla, Microsoft programcılarının popülerliğine geldi (her ne kadar uygulama varyasyonu için Simonyi'nin aksine, kim olduğunu bilmiyorum).


1
1) Macarca Microsoft tarafından icat edilmemiştir ve 2) bahsettiğiniz "Macarca" anlamsal Macarca yerine Macarca'dır.
Aaronaught

Microsoft'un bunu bulduğunu hiç söylemedim. Aslında Charles Simonyi'nin geldiğini söyledim (özellikle macarca gösterim uygulamaları). Microsoft yoğun bir şekilde itti, ama asla yarattıklarını söylemedim (aslında Xerox veya Microsoft günlerinde yarattığından emin olmadığımı söyledim). Büyük bir şirketin (Microsoft) işlerin yapılması gerektiği gibi önerdiği bir şeye örnek olarak veriyordum. Bütün bunlarda benim açımdan OP, çalışmadığı bir şirketin "doğru yol" olduğunu söylediği sözleşmeleri adlandırmak konusunda endişelenmemelidir (Microsoft için çalışmadığı sürece, bu durumda bakım yapmalıdır).
JaCraig

[alıntı gerekli]
Aaronaught

1
Um evet, Macar gösteriminin ne olduğuna dair bir alıntıya ihtiyacımız yoktu. [Gerekli alıntı] cevabınızdaki tüm şüpheli iddialar içindir.
Aaronaught
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.