Sınıfları Adlandırma - Her şeyi “<WhatEver> Yöneticisi” olarak adlandırmamak nasıl önlenir? [kapalı]


1188

Uzun zaman önce, beni nesnelerin isimlendirilmesinde "doğru" bir yola sokan bir makale okudum (bir blog girişine inanıyorum): Programınızdaki şeyleri adlandırmak konusunda çok titiz olun.

Örneğin, uygulamam (tipik bir işletme uygulaması olarak) kullanıcıları, şirketleri ve adresleri işleyecek olsaydım a User, a Companyve Addressetki alanı sınıfım olurdu - ve muhtemelen bu şeyleri işleyen a UserManager, a CompanyManagerve a yerlerinde AddressManager.

Yani neyin olanlar söyleyebilir UserManager, CompanyManagerve AddressManagerbunu? Hayır, çünkü Yönetici etki alanı nesnelerinizle yapabileceğiniz her şeye uyan çok genel bir terimdir.

Okuduğum makalede çok özel isimler kullanılması öneriliyor. Bir C ++ uygulaması olsaydı ve UserManagerişi kullanıcılara yığından ayrılıp serbest kalsaydı, kullanıcıları yönetmez, doğumlarını ve ölümlerini korurdu. Hmm, belki buna a diyebiliriz UserShepherd.

Ya da belki de UserManagerişi her bir User nesnesinin verilerini incelemek ve verileri kriptografik olarak imzalamaktır. Sonra bir tane olurdu UserRecordsClerk.

Şimdi bu fikir bana yapıştı, uygulamaya çalışıyorum. Ve bu basit fikri inanılmaz derecede zor bul.

Sınıfların ne yaptığını açıklayabilirim (hızlı ve kirli kodlamaya girmediğim sürece) yazdığım sınıflar tam olarak bir şey yapar. Bu açıklamadan isimlere gitmek için özlediğim şey bir tür isimler kataloğu, kavramları isimlerle eşleştiren bir kelime hazinesi.

Sonuçta aklımda bir desen kataloğu gibi bir şey istiyorum (sık sık tasarım desenleri nesne adlarını kolayca sağlar, örneğin bir fabrika )

  • Fabrika - Başka nesneler oluşturur (tasarım deseninden alınan adlandırma)
  • Çoban - Bir çoban nesnelerin ömrünü, yaratımlarını ve kapanmalarını ele alır
  • Eşitleyici - Verileri iki veya daha fazla nesne (veya nesne hiyerarşileri) arasında kopyalar
  • Dadı - Nesnelerin oluşturulduktan sonra "kullanılabilir" duruma ulaşmasına yardımcı olur - örneğin diğer nesnelere kablolama

  • vesaire vesaire.

Peki, bu sorunu nasıl ele alıyorsunuz? Sabit bir kelime dağarcığınız var mı, anında yeni isimler mi icat ediyorsunuz yoksa önemli olmayan veya yanlış olan şeyleri isimlendirmeyi düşünüyor musunuz?

Not: Ayrıca konuyu tartışan makaleler ve bloglar ile de ilgileniyorum. Başlangıç ​​olarak, bu konuda beni düşündüren orijinal makale: Java Sınıflarını 'Yönetici' olmadan adlandırmak


Güncelleme: Cevapların özeti

Bu arada bu sorudan öğrendiklerimin küçük bir özeti.

  • Yeni metaforlar yaratmamaya çalışın (Dadı)
  • Diğer çerçevelerin neler yaptığına bir göz atın

Bu konuyla ilgili diğer makaleler / kitaplar:

Ve cevaplardan topladığım geçerli bir isim önekleri / sonekleri listesi (öznel olarak!):

  • koordinatör
  • inşaatçı
  • yazar
  • Okuyucu
  • Handler
  • konteyner
  • Protokol
  • Hedef
  • Dönüştürücü
  • kontrolör
  • Görünüm
  • Fabrika
  • varlık
  • Kova

Ve yol için iyi bir ipucu:

Adlandırma felci olma. Evet, isimler çok önemli, ancak çok fazla zaman harcayacak kadar önemli değiller. 10 dakika içinde iyi bir isim düşünemiyorsanız, devam edin.


11
Topluluk wiki'sine aittir, çünkü hiç kimse "en iyi" yanıtı yoktur. Bu bir tartışma.
DOK

13
Bu karşı sezgisel. Ona forum dememeli mi? Bir wiki'nin fikirlerin değil gerçeklerin toplanması için olacağını düşünürdüm.
AaronLS

78
Bunu güncel tuttuğunuz için teşekkürler - ama ugh, bu son ipucu korkunç bir tavsiye! 10 dakika içinde iyi bir isim düşünemiyorsanız, muhtemelen sınıfınızda bir sorun vardır. (Standart uyarılarla: 1) mükemmel olanın düşmanıdır, 2) Nakliye bir özelliktir - sadece teknik borç ödediğinizi unutmayın.)
Jeff Sternal

11
10 dakika içinde iyi bir isim düşünemiyorsanız meslektaşınızdan yardım isteyin. Sadece vazgeçme.

9
10 dakika içinde iyi bir isim düşünemiyorsanız, meslektaşlarınıza açıklamayı deneyin; onlar belki iyi bir isim (user338195) düşünmek, ama muhtemelen bunu (nesi keşfetmenize yardımcı olacaktır açıklamaya çalışan Jeff ).
WillC

Yanıtlar:


204

Benzer bir soru sordum , ancak mümkünse zaten .NET çerçevesindeki adları kopyalamaya çalışıyorum ve Java ve Android çerçevelerinde fikirler arıyorum .

Öyle görünüyor Helper, Managerve Utilhiçbir devlet içeren ve genellikle prosedürel ve statik olan sınıfları koordine etmek için takmak kaçınılmaz isimler vardır. Bir alternatif Coordinator.

Sen isimlerle özellikle mor prosey almak ve benzeri şeyler için gidebiliriz Minder, Overseer, Supervisor, Administrator, ve Master, ama ben alışık çerçeve adları gibi tutarak tercih söylediği gibi.


.NET çerçevesinde de bulduğunuz bazı diğer son ekler (doğru terim ise) şunlardır:

  • Builder
  • Writer
  • Reader
  • Handler
  • Container

4
Bunları çok seviyorum. Zaten .NET Framework tarafından kullanımda oldukları için kötü veya bilinmeyen metaforların tuzağına düşmezler. Yaygın olarak kullanılan şeylerin daha fazla girişi için diğer kütüphanelere (Java) bakmak ilginç olabilir.
froh42

ConductorBir müzikal orkestranın şefi gibi önermek isterim. Kesinlikle önemli bir rol, "yürütmeniz" gereken işlerin doğasına bağlı olarak (diğer nesneler, merkezi komuta yanıt vermesi gereken ve diğer tüm ortak çalışanlar için çok fazla endişelenmeyen çok özelleşmiş aktörlerdir).
heltonbiker

1
-Er sınıflarının çözümünün farklı bir isim bulmak olduğuna inanmıyorum. Diğer birçok yazıda okuduğum ve cevabı öğrenmeye çalıştığım gibi, sadece kullanılan adı değil, mimariyi değiştirmeniz gerekiyor.
Michael Ozeryansky

115

Sen kaynak-code-wordle.de bir göz atın , ben orada .NET çerçeve ve diğer bazı kütüphaneler sınıf adlarının en sık kullanılan son eklerini analiz ettik .

İlk 20:

  • nitelik
  • tip
  • yardımcı
  • Toplamak
  • dönüştürücü
  • işleyicisi
  • bilgi
  • Sağlayıcı
  • istisna
  • hizmet
  • eleman
  • yönetici
  • düğüm
  • seçenek
  • fabrika
  • bağlam
  • madde
  • tasarımcı
  • baz
  • editör

147
Uzun zaman önce belirli bir şirkette, her sınıfı meydan okurcasına bitirdiği şirketi rahatsız eden saçma ve büyüyen bir ek sonek kurallarından bıkmış bir mühendis biliyordum Thingy.

8
Bu ad listesi, bağlamı eki uygulanmadan kendi başına çok yararlı değildir.
Fred

65

Ben tamamen iyi isimler için çalışıyorum ve çoğu zaman bir şeyler için isim seçerken çok dikkatli olmanın önemi hakkında yazıyorum. Aynı nedenden ötürü, bir şeyleri adlandırırken metaforlara karşı temkinli davranıyorum. Orijinal soruda, "fabrika" ve "senkronizatör" ne demek istedikleri için iyi isimlere benziyor. Ancak, "çoban" ve "dadı" değildir, çünkü bunlar metaforlara dayanmaktadır . Kodunuzdaki bir sınıf tam anlamıyla bir dadı olamaz ; bir dadı diyorsunuz çünkü gerçek bir dadı bebeklere veya çocuklara çok benziyor. Gayri resmi konuşmada sorun yok, ama kodları kimin ne zaman bildiğini bilenler tarafından sürdürülmesi gereken sınıfları adlandırmak için sorun değil.

Neden? Çünkü metaforlar kültüre bağımlıdır ve genellikle bireysel bağımlıdır. Sizin için, "dadı" sınıfını adlandırmak çok açık olabilir, ama belki başka biri için bu kadar açık değildir. Sadece kişisel kullanım için kod yazmıyorsanız buna güvenmemeliyiz.

Her durumda, kongre bir metafor yapabilir veya bozabilir. "Fabrika" nın kendisi bir metafor üzerine kuruludur, fakat bir süredir ortalıkta olan ve şu anda programlama dünyasında oldukça iyi bilinen bir metafor, bu yüzden kullanmanın güvenli olduğunu söyleyebilirim. Ancak, "dadı" ve "çoban" kabul edilemez.


10
Bu argüman gerçekten de fabrikanın kendisinin bir metafor olduğu konusunda yıkılıyor. Metaforlar genellikle bir nesnenin neyin iyi olabileceğini gerçekten temizler, oysa belirsiz veya genel olmak otomatik olarak kodun ne yaptığını anlamanın tek yolunun onu tamamen okuyarak olmasını sağlar! En kötü senaryo.
Kzqai

1
'Şirin' isimlerden kaçınmak için +1. Bence dil ile olabildiğince doğrudan olmak harika. (Tabii ki, aynı anda doğrudan, özlü, kesin ve açık olmak her zaman kolay değildir …)
andrewf

1
Yaratıcı bir fiil + "er" seçimi, beton sınıflar için genellikle renkli bir benzetmeden daha açık olacaktır. Öte yandan yeni soyutlamalar - yeni bir kavram olan şeyler, sadece yeni bir “şey” yerine yeni bir “şey” - genellikle metaforlar (Java'nın "fasulyeleri", Haskell'in "lensleri", GUI) "windows", birçok dilde "vaat ediyor"). Çoğu kod temeli böyle gerçek icatlara sahip olmayacaktır.
Malnormalulo

51

Biz herhangi bir olmadan yapabileceğini xxxFactory, xxxManagerya xxxRepositorybiz doğru gerçek dünya modellenmiş eğer sınıfları:

Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"]
        .Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"]
        .OfType<User>().CreateNew("John Doe");

;-)


11
Paralel evrenlere ve alternatif boyutlara nasıl ulaşırsınız?
Ocak'ta tster

23
Bu kolay: Omniverse.Instance.Dimensions ["Bizim"]. Evrenler ["Bizim"] Galaksiler ... ... tamam tamam bunun bir yeniden derleme gerektireceğini kabul ediyorum. ;-)
herzmeister

73
Güncelleme: Bu .NET 4.0'da eklendi Universe.Instance.ToParallel():;)
Connell

2
Demeter yasasını çiğniyor!
Jonas G. Drange

13
Bunlar Nesne ve Üyeler, Sınıf isimleri değil
Harry Berry

39

Thedailywtf.com, "ManagerOfPeopleWhoHaveMortgages", vb. 'De yayınlanan bir şeye kaygan bir eğim gibi geliyor.

Bir monolitik Manager sınıfının iyi bir tasarım olmadığı, ancak 'Manager'ı kullanmanın kötü olmadığını düşünüyorum. UserManager yerine UserAccountManager, UserProfileManager, UserSecurityManager vb.

'Yönetici' iyi bir kelimedir, çünkü bir sınıfın gerçek dünyadaki bir 'şeyi' temsil etmediğini açıkça göstermektedir. 'AccountsClerk' - bunun kullanıcı verilerini yöneten bir sınıf olup olmadığını veya işleri için Hesap Memuru olan birini temsil ettiğini nasıl anlarım?


8
UserAccounter, UserProfiler ve UserSecurer ne olacak? Yönetici'den kurtulursanız, iyi bir şey olduğunu düşündüğüm belirli bir tanım bulmaya zorlanırsınız.
Didier A.

10
UserAccount, UserProfile, UserSecurity oO hakkında ne?
clime

3
Ben "MortageOwnersManager" adını
volter9

Bazen alan adının belirli adları olabilir. "MortageHolder" gibi "MortageOwner" daha iyi olabilir
borjab


24

Kendimi kullanmayı düşünmediğini bulduğunuzda Managerveya Helperbir sınıf adında, bunu doğru soyutlama henüz ve / veya ben ihlal ediyorum bulamadım araçlarının bir kod koku düşünün tek bir sorumluluk ilkesini böylece üstlenmeden ve tasarıma daha çok çaba koyarak, genellikle isimlendirmeyi daha kolay hale getirir.

Ancak iyi tasarlanmış sınıflar bile kendilerini her zaman adlandırmaz ve seçimleriniz kısmen iş modeli sınıfları mı yoksa teknik altyapı sınıfları mı oluşturduğunuza bağlıdır.

İş modeli sınıfları zor olabilir, çünkü her alan adı için farklıdırlar. PolicyBir alandaki (örneğin LateRentalPolicy) strateji sınıflarında olduğu gibi çok kullandığım bazı terimler var , ancak bunlar genellikle iş kullanıcılarıyla paylaşabileceğiniz, sınıfları tasarlayıp adlandırabileceğiniz bir " her yerde kullanılan dil " oluşturmaya çalışmaktan kaynaklanıyor -dünya fikirleri, nesneleri, eylemleri ve olayları.

Teknik altyapı sınıfları biraz daha kolaydır, çünkü gerçekten iyi bildiğimiz alanları tanımlarlar. Ben gibi, sınıf adları içine tasarım deseni isimleri dahil etmek tercih InsertUserCommand, CustomerRepository,veya SapAdapter.yerine niyet uygulanmasını iletişim konusunda endişelerini anlıyorum ama tasarım desenleri sınıf tasarımının bu iki yönü evlenmek - istediğiniz yere en azından sen, altyapı ile uğraşırken ayrıntıları gizlerken bile uygulama tasarımının şeffaf olması.


1
Policyİş mantığını içeren sınıflar için soneki kullanma fikrini gerçekten seviyorum
jtate

+1 "Yönetici" ve "Yardımcı" gibi adlarla ilişkili kod kokusundan bahsettiği için. Herhangi bir şey için net isimlerim yoksa, genellikle en azından kısmen, ister iş ister teknik olsun, etki alanı anlayışımdaki bazı belirsizliklerden kaynaklanıyor. Neredeyse aynı şekilde, bu sadece sınıfları reaktif olarak parçaladığım anlamına gelebilir, çünkü onlar "çok büyüdüler" - ki bu da benim için yetersiz modellemenin bir işaretidir. Bu en çok oy alan cevap olmalı.
nclark

10

GOF kitabı tarafından tanımlanan desenlerle au fait olmak ve bunlardan sonra nesneleri adlandırmak, sınıfları adlandırmam, organize etmem ve niyeti iletmemde bana çok yol kat ediyor. Çoğu insan bu isimlendirmeyi (veya en azından büyük bir bölümünü) anlayacaktır.


Fowler benim için iyi bir referans ama GOF harika bir öneri.
Lazarus

Cehaletimi affet. Hangi Fowler kitabından bahsediyorsun?
Brian Agnew


19
Hmm, bazen bu işe yarıyor (örneğin bir Fabrika veya Strateji gibi) ama diğer zamanlarda bunun sınıfın amacından ve işinden daha fazla uygulama biçimini (bir desen kullandım!) İlettiğini hissediyorum. Örneğin, bir Singleton'un en önemli şeyi temsil ettiği şeydir - bunun bir Singleton olması değil. Kullanılan kalıplardan sonra sıkı adlandırma, kullanılan türlerden sonra sıkı adlandırma gibi hissediyor. Örneğin, Windows Sistemleri grubu tarafından yanlış uygulanan Macar gösterim ("niyet türü" yerine C veri türünü açıklayan)
froh42

1
Teknik altyapı sınıfları için, genellikle uygulamanın şeffaf hale getirilmesi arzu edilir ve standart tasarım deseni adlarının çoğu hem uygulama hem de niyetle iletişim kurar. Etki alanı modeli sınıfları da başka bir konudur.
Jeff Sternal

10

Sınıfım için XyzManager'dan daha somut bir isim bulamazsam, bu benim için bunun gerçekten bir sınıfa ait bir işlevsellik, yani mimari bir 'kod kokusu' olup olmadığını yeniden düşünmem için bir nokta olur.


8

Akılda tutulması gereken en önemli şey: isim yeterince açıklayıcı mı? Sınıfın ne yapması gerektiğini ismine bakarak anlatabilir misiniz? Sınıf adlarınızda "Yönetici", "Hizmet" veya "İşleyici" gibi kelimeler kullanmak çok genel kabul edilebilir, ancak birçok programcı bunları kullandığından sınıfın ne için olduğunu anlamaya yardımcı olur.

Ben kendim cephe desenini çok kullanıyorum (en azından ben buna denir). Bir olabilirdi Usersadece bir kullanıcıyı ve açıklar sınıf Usersbenim "kullanıcıların koleksiyonu" nin takip tutar sınıfını. Sınıfa a UserManagerdemiyorum çünkü gerçek hayatta yöneticileri sevmiyorum ve onlara hatırlatmak istemiyorum :) Sadece çoğul formu kullanmak sınıfın ne yaptığını anlamama yardımcı oluyor.


Bu yaklaşımı da çok seviyorum çünkü nesnelerin yukarıdan aşağıya yönetimi fikrini kolaylaştırıyor. Bir grup kullanıcının UserManager yerine kullanıcılar arasında iş yapıldığını ima etmesi daha olasıdır. Ayrıca, bir Kullanıcının Kullanıcılar için bir referansa sahip olması, UserManager'a sahip olmak kadar garip hissetmez. Kesinlikle OOP yerine göreceli düşünmeye daha açıktır.
Seph Reed

Bu yaklaşımla ilgili sorun Users, özellikle yönetici nesnesini geçerseniz, kodunuzu aramak gerçekten zorlaşıyor . this.users = new Users()Ancak, kodunuzda başka bir yerde her zaman usersbir dizi Users anlamına gelir.
Kardan

Dediğiniz gibi Kullanıcılar gerçekten de bir "kullanıcı koleksiyonu" anlamına gelir - durum bilgisi olan varlık koleksiyonu. Ancak SRP, kullanıcı yönetimini (işlevsellik ve iş mantığı) kullanıcı verileriyle (durum) birleştirmek istemeyeceğiniz anlamına gelir. Yanlış olduğunu söylememek, yalnızca kullanıcıları ve temel CRUD'ları depolamaktan değil, sınıf kullanıcıları yönetmekle sorumluysa, UserManager'ın uygun olduğu anlamına gelir.
Richard Moore

5

C # 'a özgü olarak, adlandırma mantığı hakkında birçok iyi bilgiye sahip "Çerçeve Tasarım Yönergeleri: Kurallar, Deyimler ve Yeniden Kullanılabilir .NET Kütüphaneleri için Desenler" buldum .

Bu daha spesifik kelimeleri bulmaya gelince, genellikle bir eş anlamlılar sözlüğü kullanıyorum ve iyi bir kelime bulmaya çalışmak için ilgili kelimeleri atlıyorum. Bununla birlikte çok fazla zaman geçirmemeye çalışıyorum, gelişim boyunca ilerledikçe daha iyi isimler buluyorum veya bazen bunun SuchAndSuchManagergerçekten birden fazla sınıfa ayrılması gerektiğini anlıyorum ve sonra o kullanımdan kaldırılan sınıfın adı sorun olmayacak .


3

Buradaki kritik şeyin kodunuzun görünürlüğü alanında tutarlı olması gerektiğine inanıyorum, yani kodunuza bakması / kod üzerinde çalışması gereken herkes adlandırma kuralınızı anladığı sürece, onları çağırmaya karar verseniz bile bu iyi olmalı 'CompanyThingamabob' ve 'UserDoohickey'. Bir şirket için çalışıyorsanız, ilk durak, adlandırma için bir şirket sözleşmesi olup olmadığını görmektir. Bir şirket için yoksa veya bir şirket için çalışmazsanız, sizin için anlamlı olan terimleri kullanarak kendinizinkini oluşturun, en az rasgele kod yazan birkaç güvenilir iş arkadaşınızın / arkadaşınızın etrafından geçin ve mantıklı herhangi bir geri bildirim ekleyin.

Başkalarının konvansiyonunu, yaygın olarak kabul edildiğinde bile, size sayfanın üstünden atlamıyorsa, kitabımda bir hata var. Her şeyden önce kodumu diğer belgelere başvurmadan anlamam gerekiyor, ancak aynı sektörde aynı alanda başka biri için anlaşılmaz olmayacak kadar genel olması gerekiyor.


1
Yine de, tutarlı değilse, biraz sezgisel olmayan bir sözleşme sadece kendi sözleşmenizi başlatmaktan daha iyidir. Bir proje üzerinde çalışan insanlar herhangi bir tutarlı sözleşmeyi çok hızlı öğrenecekler ve yakında işlevselliğin ilk bakışta beklenebilecek bir şey olmadığını unutacaklar.
Bay Boy

@John, aynen öyle dedim. Sözleşmenin grup tarafından kabul edilmesi gerekir ve bir şirkette çalışıyorsanız, şirket sözleşmesi olup olmadığına bakın. Şirket için herhangi bir grubu düşünüyorum, açık kaynak kodlu bir proje ekibi veya gevşek bir programcı koleksiyonu. Eğer herkes gereksinimlerini karşılayacak kadar mevcut olanı aldıysa, bence yenilikte çok eksik olurduk.
Lazarus

2

Sisteminiz için kullandığınız kalıpları, adlandırma kurallarını / kataloglama / sınıfların gruplandırılmasını, kullanılan kalıp tarafından tanımlanma eğilimi olarak değerlendiririm. Şahsen, başka bir kişinin kodumu almasının ve onunla çalışmasının en olası yolu olduğu için bu adlandırma kurallarına sadık kalıyorum.

Örneğin, UserRecordsClerk, hem UserRecordsClerk hem de CompanyRecordsClerk tarafından uygulanan genel bir RecordsClerk arabirimini genişletmek ve daha sonra uzmanlaşmak olarak açıklanabilir, yani, alt sınıflarının genel olarak ne için olduğunu / ne olduğunu görmek için arabirimdeki yöntemlere bakılabilir.

Bilgi için Tasarım Desenleri gibi bir kitaba bakın , mükemmel bir kitap ve kodunuzla nerede olmayı hedeflediğinizi temizlemenize yardımcı olabilir - zaten kullanmıyorsanız! ;Ö)

Deseniniz iyi seçildiği ve uygun olduğu kadar kullanıldığı sürece, o zaman oldukça yaratıcı olmayan basit sınıf isimleri yeterli olmalıdır!


Bunu Brian Agnew'in cevabı hakkında yorum yaptım. Desen adlarının sadece bazı durumlarda (Fabrika, Strateji) iyi sınıf adları oluşturduğunu değil, diğerlerinde (Singleton) yaptıklarını düşünmüyorum. İsimlerin sınıfın işini nasıl uyguladığımı değil de yansıtmasını istiyorum.
froh42
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.