Aşağıdaki şeyler için anlamsal olarak daha uygun paket adı?


18

Bir strawman paketi düşünürken, java.utilçoğu durumda, onları koyan kişi dışında ortak bir şey paylaşmayan çeşitli sınıflar için dampingli bir zemin, sınıfları için daha semantik olarak doğru bir paket adı bulmak için tembel ya da ilhamsızdı.

Bir örnek olarak, sınıfa alın, söz konusu sınıf UUIDiçin anlamsal olarak doğru bir paket adı ne olurdu?

UUIDDaha hafif olmak için kendi sınıfımı uygulamaya çalışıyorum . me.myproject.util.UUIDPaket ismim için kullanmak istemiyorum .

Düşündüm me.myproject.rfc4122.UUIDama bu kullanım anlambilimi anlamına gelmez UUID.

Ben de düşündüm me.myproject.uuid.UUIDama aynı adı taşıyan bir modüle bir sınıf koymak ve Python packagesanlamsal modulesolarak Python ile eşdeğer değildir Python popüler bir yaklaşım olsa da, bu totoloji sevmiyorum .

Ayrıca düşündüm me.myproject.UUIDama reddettim çünkü isim alanının o kısmını ilgili olmayan şeylerle kirletmek istemiyorum. Bu sadece sorunu bir üst seviyeye taşır.

Ben de düşündüm me.myproject.lib.UUIDama bunun daha anlamsal bir anlamı yok .utilve sadece sorunu yeniden adlandırıyor.

semantics: anlam ile ilgili dilbilimin ve mantığın dalı .


Nasıl me.myproject.UUID? Veyame.UUID
Robert Harvey

Bana göre böyle bir şey iyi from me.myproject.uuid import UUID, GetUUIDInfogörünüyor. Bir modülde dışa aktarılan birden fazla şey olabilir.
9000

2
JXTA'nın id'lerle ilgili şeyler için bir 'id' paketleri vardır.
greg-449

@ greg-449 - Muhtemelen kabul edilecek bir cevap olarak önerinizi biraz daha fazla açıklamaya doğru eğiyorum identityveya identifierskoyuyorum.

Yanıtlar:


11

Her sınıfı, söz konusu sınıf için anlamsal olarak doğru bir adı olan bir pakete koymaya çalışmanın sorunu, çok az sınıf, hatta bazen sadece bir sınıf içeren paketlere yol açma eğiliminde olmasıdır. Bu da çok sayıda pakete yol açar.

Paket adlandırmada daha pragmatik bir yaklaşım, sadece bir şeyler bulmanıza yardımcı olmaktır. Her zaman bir araya toplandığınızı bildiğiniz sık kullanılan şeyleri tek bir yerde tutmak onları yoldan uzak tutar ve bu nedenle daha nadir kullanılan şeyleri bulmayı kolaylaştırır. Yani, içerdikleri sınıfların her biri için anlamsal olarak doğru olan paket adlarına gerçekten ihtiyacınız yoktur, sadece anlamsal olarak yanlış olmayan paket adlarına ihtiyacınız vardır. Açıkçası, 'util' paket adı düşünce bu hat göre seçildi: öyle değil mi içerdiği sınıflar için anlam doğru isim, ama aynı zamanda semantik yanlış değildir ve bu iyi yeterli.

Dolayısıyla, bu UUID türünüz yalnızca bu özel uygulama tarafından kullanılacaksa (onu 'projem' altına koymayı planladığınız gibi), o zaman muhtemelen 'modelinizin' bir parçasıdır. projesi. UUID'ler muhtemelen bu ilişkileri uygulama aracı olmakla birlikte, birçoğu arasında muhtemelen ilişkileri olan kalıcı varlıklarınıza karşılık gelen tüm sınıfların setini içeren bir 'model' paketine sahip olmalısınız. Ayrıca, UUID'leriniz muhtemelen kendilerini nasıl devam ettireceklerini biliyor, değil mi? Ayrıca, UUID'leriniz muhtemelen yalnızca model varlıklarınızın üyeleri olarak bulunabilir, değil mi? Yani, model paketiniz muhtemelen en iyi yer.

Aksi takdirde, bu UUID tipiniz başka projelerde de kullanılabiliyorsa, bir çerçevenin parçası olarak görülmelidir. Bu nedenle, bu çerçevenin kök kaynak klasöründe veya MainMa'nın önerdiği gibi bazı 'türler' alt paketinde, hatta 'util' veya 'misc' adı verilen çerçevenin bazı alt paketlerinde bile olabilir. Bunda yanlış bir şey yok.


2
Lütfen cevabın yararlılığına gerçekten katkıda bulunmayan cevaplardaki yorumları sınırlamaya çalışın. Yorum bölümü bu feragatnameler için ayrılmıştır. Teşekkür ederim.
maple_shaft

1

Paketlerin amacı, sınıfları bazı kriterlere göre gruplamaktır (türe / katmana göre paket ile özelliğe göre paket vb.). Gerçekten sadece bir sınıf için paket oluşturmak için bir nokta görmüyorum - özellikle gelecekte bu pakette başka sınıflar olacağını beklemiyorsanız.

Ayrıca "util" paket adının tamamen anlamsız olmadığını düşünüyorum - sadece belirli bir kritere göre sınıfları gruplandırıyor - benim için "util" sınıfı, uygulamanın etki alanının bir parçası olmadığı anlamına geliyor, ancak aynı zamanda (uygulamanın yapısını etkilemez). Temel olarak (standart olmayan) kütüphanenin bir uzantısıdır.

Bu durumda, bu UUID sınıfını "util" paketine koymakla bir sorunum olmazdı. UUID ile ilgili başka yardımcı sınıflar olacaksa (UUID oluşturmak için ayrı sınıf gibi), onlar için "util.uuid" paketini yeniden düzenlemek ve oluşturmak kolaydır (bir kitaplık oluşturmazsanız ve UUID açık arabirimin bir parçası olmazsa) , o zaman biraz "ileri görüşlü" olmanız gerekir).


1
Bu benim yaklaşımım. Net bir amacı olmayan bir paket oluşturmak mantıklı değil. Bir sınıf anlamlı bir pakete kolayca atanamazsa, 'util' iyidir ve hatta belki de tercih edilir. Genellikle, ilerledikçe olan şey, ilgili sınıfların ilişkili olduğu ve sonuçların faydalı paketlere (en azından geliştirme sırasında) faydalanmadan yeniden düzenlenmesi kolay olmasıdır. Nereye gittiğini bilmediğiniz her sınıf için benzersiz paketler oluşturmayı denediyseniz, bu ilişkileri ve daha temiz bir mimariye yeniden yönlendirme fırsatını kolayca kaçırabilirsiniz.
Dunk

@Dunk, bu aslında çok iyi bir nokta - olgunlaşmadan biraz yapay paket yapısı oluşturmak, yol boyunca daha iyi, daha doğal bir organizasyon görmenizi engelleyecektir.
qbd

1

Bob Amca'nın paket ayırma konusunda bazı kuralları vardır .

İlk üç paket ilkesi paket uyumu ile ilgilidir, bize paketlerin içine ne koyacağımızı söylerler:

  1. Yeniden kullanım granülü salım granülüdür
  2. Birlikte değişen sınıflar birlikte paketlenir
  3. Birlikte kullanılan sınıflar birlikte paketlenir

Öyleyse, sorunuzu cevaplamak , UUID sınıfını kim / ne kullanacak ? Bağımlılık grafiğiniz nasıl ? UUID başka hangi sınıflarla birlikte kullanılacak ?

Cevabınıza bağlı olarak, ona me.myproject.identity paketi, me.myproject.serialization paketi, me.myproject demelisiniz. DTO ve hatta tamamen başka bir şey. Belki, UUID sınıfı modellerinizle birlikte tutulmalıdır ve benim gibi zaten sahip olduğunuz bir pakete koyacaksınız . Myproject.models .


1
dtoyaklaşık olarak anlamsız yararsızdır libveya utilstüm dtokavram 90'ların ortalarından itibaren naif bir anti-kalıptır model, aynı işe yaramaz genelleme kategorisine

Size daha faydalı isimler vermek için projeniz hakkında yeterince
bilgimiz yok

-2

Her şeyden önce, UUID (büyük harfle), paket adı veya sınıf adı için bana çok kötü bir fikir gibi görünüyor, bir şekilde uygulanan tüm stillerden veya diğer tüm büyük harf adları "sabitler" ile ilişkili. Paketler bir şeyler organize etmeyi amaçlamaktadır, bir paketi adlandırmanın en kolay yolu sahip olduğu sınıfların değeridir:

  • sınıfları iş değerlerine göre ayırmayı seçebilirsiniz com.example.identifier; örneğin ;
  • veya teknik değerlerine göre com.example.uuid.

BT'yi basit tutun


2
Java ALLCAPS sınıfların örnekler: java.util.UUID, java.net.URL, java.util.zip.CRC32vb
Scriptin

@scriptin Bir geliştirici için sadece bir sınıfın "sabit" olan bir sınıfını, paket adından bir üyeyi vb. ayırt edebilseydi daha kolay olmaz mıydı? Neden CRC32, UUID'nin sadece java yaptığı için bir sınıf için iyi bir isim olduğunu düşünüyorsunuz? Ya da "Evrensel olarak benzersiz tanımlayıcı" ya da "döngüsel artıklık kontrolü" kısaltması olduğu için ... ama biraz bekleyin! Bu java.util.zip.GZIPOutputStreamsınıfta ne var ? GZIPanlamına gelir ... ? there is also a java.util.zip.ZipOutputStream`
Tiberiu C.

1
Sınıflar tiptir, sabitler değerlerdir, karışıklık yoktur. Bu isimlerin iyi ya da kötü olduğunu düşünmüyorum, sadece bahsettiğiniz (kodlama) stillerin sınıfları küçük harflere zorlamadığını belirtiyorum. Python UUIDda büyük harftir.
komut dosyası

Kodu her gün görüyorsanız / koruyorsanız, stili "okunması kolay" ve "geri git ve ileri git" fiestaları arasındaki farkı yaratır, burada sadece kapak stiline tecrit, bence bu ifade etmek için daha değerli kapaklar, elemanın tipi (sınıf, sabit, paket vb.) kısaltma olmasından daha fazladır.
Tiberiu C.

1
Orijinal sorunun, paket adını yazarken hangi harf büyüklüğünün kullanılacağı ile ilgisi yoktu. Anlamsal olarak UUID, Uuid, uuid, UuId, UuID veya "en iyi" olduğunu düşündüğünüz diğer herhangi bir keyfi kapitalizasyon şemasından farklı değildir.
Brandin
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.