Adlandırma türleri için iyi teknikler veya testler var mı?


23

Garip, açık bir soru, ancak bu her zaman çarptığım bir sorun:

Bakımı ve çalışması kolay olan yazılım, iyi tasarlanmış bir yazılımdır. Bir tasarımı sezgisel hale getirmeye çalışmak, bir sonraki geliştiricinin, bileşenin işlevini çıkarabilmesi için bileşenlerinizi adlandırmak anlamına gelir. Bu yüzden sınıflarımıza "Tip1", "Tip2" vb. İsimlerini vermeyiz.

Bir gerçek dünya konseptini modellerken (örn. Müşteri) bu genellikle gerçek dünya konseptini modellendikten sonra türünüzü adlandırmak kadar kolaydır. Ancak, daha sistem odaklı olan soyut şeyler inşa ederken, okunması kolay ve sindirimi kolay olan isimlerin tükenmesi çok kolaydır.

Bileşenlerin ne yapması gerektiğini açıklayan bir taban tipi veya ara yüz ile tür ailelerini adlandırmaya çalışırken (benim için) daha da kötüleşiyor. Bu, doğal olarak, uygulamanın lezzetini (örneğin IDataConnectionve SqlConnection.NET Framework'de) tanımlamaya çalışan her türetilmiş türe yol açar , ancak "yansıtma ve belirli bir dizi öznitelik aramaya çalışarak " gibi karmaşık bir şeyi nasıl ifade edersiniz?

Sonra nihayet ne yapmaya çalıştığını açıkladığınızı düşündüğünüz tip için bir isim seçtiğinizde, meslektaşınız “WTF DomainSecurityMetadataProvidergerçekten yapıyor mu?

Bir bileşen için iyi niyetli bir isim seçmek için herhangi bir iyi teknik var mı, yoksa karışık isimler almadan bir bileşen ailesi oluşturmak için?

İsmin "iyi" olup olmadığı hakkında daha iyi bir fikir edinmek için bir isme uygulayabileceğim basit testler var mı ve diğerleri için daha sezgisel olmalı mı?


20
orada altı teknikleri benim için işe kanıtlanmış: 1) isimler 2) kullanımı kod değerlendirmeleri icat üzerinde çok fazla zaman harcamak 3)) 4 adlandırmak için tereddüt isimler 5) kullanımı kod değerlendirmeleri icat üzerinde çok fazla zaman harcamak yok 6) yeniden adlandırmak için tereddüt etmeyin
gnat

5
@gnat: Lütfen cevabınızı bir cevap olarak gönderin, oylayabiliriz.
S.Lott


3
İyi isimlerle gelmeme yardım etmek için yeni bir geliştirme yaparken genellikle sözlükler kullanırım.
Dr. Wily's Çırağı

3
"Yönetici" diye bir şey demekten kaçınmaya çalışıyorum. Alan Green ve Jeff Atwood , teriminin fazla kullanıldığını ve anlam ifade edemeyecek kadar belirsiz olduğunu savunuyor. Katılıyorum.
Dr. Wily's Çırağı

Yanıtlar:


41

Adlandırmada, benim için çalıştığı kanıtlanmış altı teknik var:

  1. isimleri icat etmeye çok zaman harcamak
  2. kod yorumlar kullanın
  3. yeniden adlandırmak için tereddüt etme
  4. isimleri icat etmeye çok zaman harcamak
  5. kod yorumlar kullanın
  6. yeniden adlandırmak için tereddüt etme

PS. Eğer API’niz herkese açık olacaksa, yukarıdakiler bundan önce geçerlidir - çünkü, bildiğiniz gibi,

“Elmaslar gibi herkese açık API'ler sonsuza dek sürecek. Doğru yapma şansın var, bu yüzden elinden gelenin en iyisini yap ...” (Joshua Bloch, İyi Bir API Nasıl Tasarlanır ve Neden Önemlidir )


1
Genel bir API olması durumunda kullanabileceğiniz üç ek teknik daha vardır ...
UncleZeiv

1
@ UnceceZeiv: gibi ....?
SinirliFormsDesigner'la

3
@FrustratedWithFormsDesigner: 1. isimleri icat etmek için çok zaman harcayın 2. kod incelemelerini kullanın ve 3. yeniden adlandırmak için tereddüt etmeyin
S.Lott

3
Bu cevap beni genel olarak ikna etti: hayır, isimleri doğru bulmanın kolay bir yolu yok. Sadece çok sıkı çalışmayı denemek.
Paul Turner

4
7. Kendileri için uygun bir isim tasarlamanın imkansız olduğu ortaya çıkarsa, türleri veya işlevleri yeniden tasarlamaktan çekinmeyin. İyi tasarlanmış kod her zaman doğru şekilde adlandırılabilir.
Joren,

8

Temel testim, değişkenin işlevini yalnızca değişkendeki sözcükleri kullanarak tanımlayabilirseniz:

örneğin, DomainSecurityMetadataProvider "Etki Alanı Güvenliği Meta Verileri Sağlar" veya "Etki Alanı Güvenliği ile İlgili Meta Veriler Sağlar" ise, bu iyidir.

Ancak, kişiden kişiye değişen farklılıklar vardır:

örn. Benim için, original_team_code orijinal takımın kodudur, oysa başkası için takımın orijinal kodu olabilir. Bunlardan benim kişisel favorim olan, "Yardım Etmeyen Eski Bir Kod", "Bu ThreadUnsafe Eski Kod" için bir Muteks "değil," Yardım Etmeyen Eski Bir Mutex "olarak okuyamadığım ama bulamadığım" UnsafeLegacyMutex "idi.

Bu yüzden benim genişletilmiş sınavım değişkeni tahtaya / wiki / chat'e yazmak ve insanların ne anlama geldiğini tahmin etmelerini sağlamak.


7

Bir bileşen için iyi niyetli bir isim seçmek için herhangi bir iyi teknik var mı, yoksa karışık isimler almadan bir bileşen ailesi oluşturmak için?

Pek sayılmaz.

Ancak bir ipucu, "pasif ses" ten uzak durmaktır.

"DomainSecurityMetadataProvider" pasif. Fiil yok, hepsi isimler ve sıfatlar olarak kullanılan isimler.

"ProvideMetadataForDomainSecurity" daha etkin. Bir fiil var.

Nesneye yönelik programlama hepsi (gerçekten) isim-fiildir. İsim == nesne. Fiil == yöntemi. Yani bir sınıf adı genellikle çok "isimsiz" dir. Bu alışkanlığı kırmak ve fiil eklemeye başlamak zordur.

İsmin "iyi" olup olmadığı hakkında daha iyi bir fikir edinmek için bir isme uygulayabileceğim basit testler var mı ve diğerleri için daha sezgisel olmalı mı?

Evet. Sorunuzda mükemmel bir test tanımladınız. Başkalarına sor.

Eski günlerde buna "tasarım yolu" diyorduk. Bir şelale metodolojisinde büyük ve terliydi. Günümüzde, Çevik yöntemlerle, bir sınıfın yazarı ve kullanıcıları arasında yapılan sıradan bir işbirliği olmalıdır. Uzun sürmez (ve olmamalıdır). Testleri (ve kodu) yazmadan önce tasarımın ve isimlerin tartışılması şaşkınlık faktörünü azaltacaktır ve WTF'leri önleyebilir.


12
Pasif ses fikrine katılıyorum emin değilim. Bana göre, Sınıflar İsim olarak daha mantıklı.
12'de

7
Genel olarak, türümün isimlerini OOP'un isim-fiil stiline uygun olduğu için pasif seste tutmaya çalışıyorum. ProvideMetadataForDomainSecurityFakir bir tür adı olarak düşünürdüm . Yöntem adları genellikle tam olarak adlandırılması daha kolaydır, çünkü kullanım fiillerini kullanmakta özgürüm. Dil üzerindeki kısıtlama, sorunun özüdür.
Paul Turner

Gerçek bir sınav olarak "insanlara sormayı" sevdiğim kadar, meslektaşlarıma günde en az iki kez adlandırma hakkında sormalıyım. Başkalarının zamanını gerektirmeyen bir şeyi umuyorum.
Paul Turner

2
Sınıflar yapmak isimler olarak mantıklı. Mesele, uzun isim-sıfat cümleleriyle birlikte bu karmaşık sınıflardır. Edatlar da yardımcı olabilir.
S.Lott

2
İşbirliği iyi yazılımın sırrıdır. İşbirliği zaman alır. İyi yazı için kraliyet yolu yoktur.
S.Lott

6

Eş anlamlılar sözlüğü kullanma

Sınıflarımı ve metotları tanımlamak için uygun kelimeleri bulmak için yeni bir gelişim yaparken çok sık eş anlamlılar sözlüğüne başvuracağım.

Öncelikle işlem mantığı içeren sınıflar

Öncelikle "EntityProvider", "EntityLocator" gibi bir isim-fiil yapısında çalışma yöntemleri sağlayan sınıfları adlandırmaya meyilliyim.

Bu sınıflar genellikle çok fazla devlet içermez.

Devlet içeren sınıflar

UI ekranları ve veri varlıkları genellikle durumsaldır ve bu yüzden bu sınıfları bir isim veya sıfat-isim modeliyle adlandırırım.

Örnekler: Kişi, Çalışan, CurrentEmployee, FormerEmployee

Yardımcı sınıflar

Yalnızca statik yöntemler içeren sınıflar genellikle "yardımcı program" sınıfları olarak kabul edilir, bu nedenle bunları sürekli olarak bir "Yardımcı Program" soneki ile adlandırırım.

Örnekler: NetworkUtilities, FileUtilities

Testler

Bir şeyin kötü adlandırılmış olup olmadığına karar vermek için iyi bir testim yok, ancak adında tek bir isim ve / veya tek bir fiil kullanmayı denemeyi öneririm, sonra bu isim / fiilin neyi doğru bir şekilde tanımlayıp tanımlamadığını düşünün. yeniden adlandırma

Adın yakalamadığı sınıf / yöntem hakkında daha fazla şey olduğunu düşünüyorsanız, o zaman sınıf / yöntemin yeniden denetlenmesi gerekebilir.

Alan Green ve Jeff Attwood , "Yönetici" ekiyle adlandırma sınıflarının kötülüklerini yazdılar. "Yönetici" teriminin aşırı kullanıldığını ve anlamlı bir şey iletemeyecek kadar belirsiz olduğunu savunuyorlar. Katılıyorum.

Jeff'in makalesi ayrıca Steve McConnell'in Code Complete'ten önerilen kılavuzların bir listesini sunar.

değişkenler

Son zamanlarda, "Of", "By", "For" vb. Edatları içeren daha uzun tanımlayıcı değişken / parametre adlarıyla denemeler yaptım. Bazı örnekler aşağıda gösterilmiştir:

string firstNameOfEmployee;

string lastNameOfEmployee;

// here I nimbly avoid worrying about whether to call it "Id" or "ID" :)
int idOfEmployee;

decimal amountForDeposit;

Account accountForDeposit;

Bu, Visual Studio'nun intellisense özelliği ile bu uzun isimleri yazmayı kolaylaştırarak iyi çalıştığını buluyorum. Ayrıca, değişken ad öneklerinin daha az çoğaltılması olduğunu (örn. PersonID, personFirstName, personLastName vs. idOfPerson, firstNameOfPerson, lastNameOfPerson), intellisense'i daha da faydalı kılan daha iyi bir "karma" sağladığını da biliyorum.


1
Uzun değişken isimleriyle ilgili noktaya ikinci olarak değineceğim, Visual Studio (kullanıyorsanız) bunu hiç akıllıca yapar. İsmin gerçekte ne anlama geldiğini "düşünmeniz veya araştırmanız gereken" kısa değişken isimlerinden daha açık olan uzun değişken isimlere sahip olmak çok daha az zararlıdır. Ayrıca bağlamı da düşünün. "ListOfPeople" listesinden çok "peopleToDelete" görmeyi tercih ederim. Yine, Visual Studio size değişkenin türünü söyler, eklemenize gerek yoktur.
John Bubriski,

Ayrıca değişken isimlerine eklediğiniz ayrıntılı Macar gösterimini de beğenmedim. Bir kimlik numarası koleksiyonunun bir List, dizi IEnumerableveya ConcurrentQueue. Numaralandırmam gereken bir sürü kimlik var ve nasıl depolandıklarına dair uygulama detayı gereksiz zihinsel bagajlar. Genel olarak, daha uzun bir adın daha açıklayıcı olması durumunda, daha kısa, daha az açık bir adla tercih edilmesi gerektiği konusunda hemfikir olmama rağmen.
Allon Guralnek

@Allon - Komik, SkippyFire'ın yorumuna dayanarak cevabımı düzeltmek üzereydim. Aslında size katılıyorum; Örnek olarak Macar gösteriminde Tek savunmam, bir kaynak-kontrol farkıyla okuyormuşum gibi, bir IDE olmadan dahil olan veri tiplerini kodu okumak ve anlamaktır. Yine de bu bahane değil. :) Örneğimi firstNameOfEmployee, lastNameOfEmployee, vb. Satırları boyunca değiştireceğim
Dr. Wily's Apprentice

2

Sonra nihayet ne yapmaya çalıştığını tanımladığınızı düşündüğünüz tip için bir isim seçtiğinizde, meslektaşınız “WTF bu DomainSecurityMetadataProvider gerçekten yapıyor mu?”

Karmaşık ve etki alanına özgü bir sınıf için ne tür bir ad bekliyorsunuz? Bu, sınıf adınızı bir cümle yapmadan elde edeceği kadar iyidir (bu, herkesin tek bir sınıfa çok fazla sorumluluk verdiğinizi düşünmesini sağlayacaktır)

Sağlayıcıyı adından çıkarmayı düşünüyorum. Özellikle Meta Verilerden bahsediyorsa, herkes yansıma kullandığınızı zaten biliyor. Bir kelimeyi daha kısa ve öz hale getirebilirsin (veya başka bir kelimeye geçebilirsin - bu yazdıklarından bir tedarikçiden daha çok tüketici olur)


Söz konusu meta olduğu değil yansıma türetilmiş (ama tiplerini tedavi etmek için nasıl tarif etmez). Bu tür ISecurityMetadataProvider, alt sisteme bilgi sağlamak için güvenlik altyapısında enjekte edilebilir bir nokta bulunan bir arayüz uygular . Adlandırma zor.
Paul Turner

Meta verinin kendisi DomainSecurityMetadataProviderolan bir DomainSecurityMetadatanesne sağlayıcısı olmayı düşünüyorum DomainSecurityMetadata. Açık ve anlaşılır bir isim. Ne olduğunu bilmeme bile gerek yok DomainSecurityMetadata! Bu, sağlayıcının sağladığı bazı nesnelerdir. Sadece bir Providerson eki kaldırmak okunabilirliği artırmaz, ama tam tersine - azaltın. Bu sonek olmadan, bunun yalnızca bir meta veri (bazı meta veriler için container nesnesi) olduğunu, ancak meta verileri (sağlayıcıdan) alan bir nesne olmadığını düşünüyorum.
Ruslan Stelmachenko

0

Sistemin bölümlerini tanımlamak için metaforları kullanın. Sadece yeni analojiler keşfetmeniz için değil, isimlendirmeyi kolaylaştıracak.

(Bunun güçlü bir örnek olmadığını biliyorum ama yine de) Örneğin mailbox, bir sınıf için alınan iletiler için bir sıra işlevi gören bir değişken veya tür olarak çağırabilirsiniz .


-1

Çok katı olduğum bir şey, İsimlerin ASLA yanlış olmasına izin verilmemesi gerektiğidir . En iyi örnek, bazı yeniden faktörlendirme sırasında, çok sayıda kod değişti ve birkaç değişken, adlarının önerdiğinden başka bir şeyi ifade etmeye başladı.

Çok geçmeden, bir programcı yaşlarını harcıyordu ve çoktan çıkarılmış ve depolanmış belirli veri parçalarını ele almaya çalışan çok pahalı bazı veritabanı çağrıları kullanıyordu. Herşeyi yeniden adlandırdım ve birdenbire fazladan karmaşık ve hatalı bir mantığı kaldırabiliriz.


1
bu cevabı silmeli ve köken cevabınızı düzenlemelisiniz
Ryathal

Bunun diğer cevabım için farklı bir cevap olduğunu düşünüyorum .
12'de

-1

Umarım isimler hakkında çok fazla düşünmeniz gereken durumlar nadirdir. Bu gibi durumlarda, sınıfın ne yaptığını açıklayan bir paragraf yazmanız yeterlidir. İşlev içi yorumların veya işlev düzeyi yorumunun aksine, bir sınıfın birincil amacı nadiren değişir, bu nedenle yorumların eski haline gelme riski nispeten küçüktür. Yani birkaç paragraf yazma lüksüne sahipsin ya da sınıfın ne yaptığını açıklamak için ASCII'yi çiz.

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.