Nasıl benim sınıfları koyacağım bir Java uygulaması, yapılandırmalıyım?

oy
36

Her şeyden önce, ben bir Java uygulaması nasıl oluşturulacağını biliyoruz. Ama hep benim sınıfları koymak nereye şaşkın olmuştur. kesinlikle etki odaklı moda paketleri düzenlemek için savunucuları vardır, diğerleri katmanına göre ayırın.

Kendimi hep birlikte sorunları vardı

  • adlandırma,
  • yerleştirme

Yani,

  1. Nereye alana özgü sabitleri koymak (ve böyle bir sınıf için en iyi isim budur) do?
  2. Nerede (örneğin ben dosyaları ya veritabanında veya alternatif veritabanında depolayan bir FileStorageStrategy sınıfı, var) hem altyapısal ve etki alanı özgüdür şeyler için sınıfları koyacağım?
  3. Nerede İstisnalar koymak için?
  4. Ben başvurabilir için bir standart var mı?
Oluştur 11/08/2008 saat 08:45
kaynak kullanıcı
Diğer dillerde...                            


10 cevaplar

oy
3

Sınıf isimleri daima açıklayıcı ve kendini açıklayıcı olmalıdır. Eğer sınıflar için sorumluluk Birden fazla alanınız varsa o zaman muhtemelen refactored edilmelidir.

Aynı şekilde sen paketleri. Onlar sorumluluk alanlara göre gruplanmış edilmelidir. Her alanı vardır kendi özel durumları vardır.

Eğer ezici ve şişirilmiş hale geliyor bir noktaya gelene kadar Genellikle öyle deme. Sonra sadece her şeyin çalıştığından emin düzenli derleme, sınıflar dışarı planı ayrı oturup değil kodu yok. Daha önce yaptığı gibi Sonra devam edin.

Cevap 11/08/2008 saat 09:00
kaynak kullanıcı

oy
2

Birlikte grupla ilgili işlevselliğe paketleri kullanın.

Genellikle paket ağacının üst ters alan adınızın (olan com.domain.subdomain) benzersizliğini garanti etmek ve sonra genellikle uygulamanız için bir paket olacak. Ardından ilgili alana göre, yani senin o bölmek FileStorageStrategyde gidebilir, diyelim ki, com.domain.subdomain.myapp.storageve sonra ne olursa olsun belirli uygulamalar / alt sınıfları / olabileceğini com.domain.subdomain.myapp.storage.fileve com.domain.subdomain.myapp.storage.database. Bu isimler oldukça uzun olsun, ama importaynı zamanda o yönetmek için yardımcı olabilir dosya ve IDE üstündeki hepsini tutar.

İstisnalar genellikle onları atmak sınıflar aynı pakette gitmek, yani olsaydı, diyelim ki, FileStorageExceptiono da aynı paket içinde gider FileStorageStrategy. Aynı şekilde sabitler tanımlayan bir arayüz aynı paket içinde olacaktır.

Orada herhangi bir standart sadece sağduyulu gibi gerçekten değil, ve hepsi çok dağınık alırsa, planı ayrı!

Cevap 11/08/2008 saat 09:24
kaynak kullanıcı

oy
0

Ben bir sınıf denemek ve onların kuralları takip edeceğim uzanan ediyorsam - Geçmişte yaptığım bir şey. Bahar Framework ile çalışırken Örneğin, ben sadece en basit şeydir ile gitmek şey uzanan değilsem com.mydomain.myapp.web.servlet.mvc adlı paketin içinde benim MVC denetleyicisi sınıfları gerekecek. (Eğer varsa etki alanının bir ton biraz hantal alabilir bu paketi nesneleri rağmen) Alan Nesneleri için com.mydomain.domain. Etki alanına özgü sabitler için, aslında en ilgili sınıfında kamu sabitler olarak koydu. Ben bir "Üye" sınıf var ve maksimum üye adı uzunluğu sabit varsa Örneğin, ben Üyesi sınıfta koydu. Bazı dükkanlar ayrı Sabitler sınıf yapmak ama tek sınıfa ilgisiz sayılar ve dizeleri lumping değeri görmüyorum. Ben başka dükkanlar AYRI Sabitler sınıflar oluşturarak bu sorunu çözmeye gördüm, ama bu sadece zaman kaybı gibi görünüyor ve sonuç çok kafa karıştırıcı. Bu kurulumu, çoklu geliştiriciler her yere sabitleri kopyalayacağız ile büyük bir projeyi kullanma.

Cevap 12/08/2008 saat 00:25
kaynak kullanıcı

oy
0

Ben birbiriyle ilişkili pakete benim sınıfları yıkmak gibi.

Örneğin: Model veri tabanı ile ilgili çağrılar için

Görünüm gördüklerinizi başa Sınıflar

Kontrol Temel işlevler sınıfları

Util Herhangi misc. kullanılan sınıfları (tipik olarak statik işlevleri)

vb.

Cevap 12/08/2008 saat 02:28
kaynak kullanıcı

oy
1

Bunu basit tutmaya ve üzerine sanmıyorum düşünüyorum. soyut bitmedi yapın ve çok fazla katman. Sadece temiz tutmak ve büyüdükçe, yeniden düzenleme oldukça basittir. IDE iyi özelliklerinden biri üstlenmeden, neden onu kullanmakta ve uygulamanız, kod organizasyonu gibi ziyade meta konularla ilgili sorunların çözümü için size beyin gücünden tasarruf değil.

Cevap 12/08/2008 saat 04:36
kaynak kullanıcı

oy
10

Ben organize kaynaklarının büyük bir hayranıyım, bu yüzden her zaman aşağıdaki dizin yapısını oluşturun:

/src - for your packages & classes
/test - for unit tests
/docs - for documentation, generated and manually edited
/lib - 3rd party libraries
/etc - unrelated stuff
/bin (or /classes) - compiled classes, output of your compile
/dist - for distribution packages, hopefully auto generated by a build system

Alan adınız (org.yourdomain.yourprojectname) ile sınıf ile oluştururken OOP yönünü (diğer yorum yapanları bakınız) yansıtan sınıf adları ile başlayan Paket isimleri: / src Ben varsayılan Java kalıplarını kullanıyorum. Gibi ortak paket isimleri util , modelin , görünüm , olaylar da yararlıdır.

Ben gibi bir kendi sınıfında belirli bir konu için sabitleri koymak eğilimindedir SessionConstants veya ServiceConstants alan sınıfların aynı pakette.

Cevap 12/08/2008 saat 09:00
kaynak kullanıcı

oy
22

Gerçekten Maven'ın sevmeye geldim Standart Dizin Düzeni .

Benim için önemli fikirlerinden biri iki kaynak kökleri sahip olmaktır - üretim kodu için bir tane ve benzeri gibi deney kodu: biri

MyProject/src/main/java/com/acme/Widget.java
MyProject/src/test/java/com/acme/WidgetTest.ava

(Burada, her iki src / ana / Java ve src / test / Java kaynak kökleri).

Avantajları:

  • Kişisel Testler paket var (ya da "varsayılan") test altında sınıflarına düzeyinde erişim.
  • Kolayca bir kaynak kökü olarak src / test / java bırakarak bir JAR içine yalnızca üretim kaynakları paketleyebilirsiniz.

sınıf yerleştirme ve paketler hakkında Pratik bir kural:

Genel olarak konuşursak, iyi yapılandırılmış projeler ücretsiz olacaktır dairesel bağımlılıkları . Onlar kötü olduğunda bilgi (ve zaman değil ) ve benzeri bir araç düşünün JDepend veya SonarJ bunları ortadan kaldırmaya yardımcı olacaktır.

Cevap 16/08/2008 saat 20:06
kaynak kullanıcı

oy
2

Ben birim testler için çok yararlı bulduğumuz bir şey de myApp / test_src / dizinleri bir myApp / src olması idi / ve. Bu şekilde, onlar sınamak sınıflar aynı paketlerinde birim testleri yerleştirebilir ve benim üretim yüklemesini hazırlamak zaman henüz kolayca test durumları hariç tutabilirsiniz.

Cevap 03/09/2008 saat 13:21
kaynak kullanıcı

oy
2

Kısa cevap: Her katmanlara dikey dilimlenmiş modül (örn görüntüsü, modeli, kalıcılık) ile, yan-yana çizilen modüllerin açısından, içinde sistem mimarisini çizin. Sonra böyle bir yapıyı kullanmak com.mycompany.myapp.somemodule.somelayer , örneğin com.mycompany.myapp.client.view veya com.mycompany.myapp.server.model .

Uygulama için paketlerin üst seviyede kullanılması modüllerin eski moda bilgisayar bilimi anlamında, modüler programlama , gerektiğini bariz olmak. Ancak, ben biz üzerinde çalışmış projelerin çoğunda bunu unutmadan sonunda ve bu üst düzey yapısı olmadan paketlerin bir karmaşa ile bitirmek. Bu anti-desen genellikle 'dinleyici' ya da aynı arabirimini uygulamak gerçekleşmesi çünkü gruplar başka alakasız sınıfları 'eylemleri' gibi bir şey için bir paket olarak kendini göstermektedir.

Bir modül içinde ya da küçük bir uygulamada, uygulama tabakaları için paketleri kullanır. Muhtemel paketler mimarisine bağlı olarak aşağıdakilerden gibi şeyler şunlardır:

  • com.mycompany.myapp.view
  • com.mycompany.myapp.model
  • com.mycompany.myapp.services
  • com.mycompany.myapp.rules
  • com.mycompany.myapp.persistence (ya da veri ile erişim katmanı için 'DAO')
  • com.mycompany.myapp.util (o Çeşitli 'sanki bu dikkat kullanılmaktadır)

bir çok var ise, bu katmanların her biri içinde, bu tipi grup sınıfları doğaldır. Burada ortak bir anti-desen her pakette sadece birkaç sınıfları vardır ki gereksiz yere çok fazla paketleri ve alt paketin düzeylerini tanıtmaktır.

Cevap 04/09/2008 saat 14:40
kaynak kullanıcı

oy
7

Çalışıyorum yerlerde, Maven 2 kullanıyorsanız ve bizim projeler için oldukça güzel bir arketip var. yaygın: diğer tabakalar (örneğin, i18n) tarafından kullanılan ortak kod - -: kişiler: hedefi, bu nedenle multipl modülleri (her bir uygulama 'katmanın için bir) kullanılarak bir proje yapısı tanımlanan sorunları iyi bir şekilde ayrılmasını elde etmek için olan alan varlıklar - depoları: Bu modül DAOs arayüzleri ve uygulamalar içermektedir - hizmetler-intf: arayüzleri hizmetlerin (örneğin UserService, ...) için - hizmetler-impl: hizmetlere uygulamaları (örneğin UserServiceImpl) - web: her şey ile ilgili web içeriği (örneğin css, JSP, jsf sayfaları, ...) - ws: web hizmetleri

Her modül kendi bağımlılıkları vardır (örneğin depoları JPA olabilir) ve bazı geniş proje olan (böylece ortak modülünde aittir). farklı proje modülleri arasında bağımlılıklar açıkça ayrı şeyler (örneğin, ağ tabakası, servis katmanında bağlıdır ama depo tabakasının bilmediği).

Uygulama paketi "com.foo.bar" ise Her bir modül örneğin, kendi baz paket var, o zaman biz var:

com.foo.bar.common
com.foo.bar.entities
com.foo.bar.repositories
com.foo.bar.services
com.foo.bar.services.impl
...

Her bir modül, standart maven proje yapısını saygı:

   src\
   ..main\java
     ...\resources
   ..test\java
     ...\resources

Belirli bir katman için Birim testleri kolayca \ src \ Test altındaki yerini ... alanı özgüdür o kişiler modülünde yer alır Everything bulabilirsiniz. Biz uygulamasıdır tam olarak bilmek gerekmez çünkü Şimdi FileStorageStrategy gibi bir şey, depoları modüle gitmek gerekir. hizmetler katmanında, sadece depo arayüzünü biliyoruz, belirli uygulama (endişeleri ayrılması) ne umurumda değil.

Bu yaklaşıma birden çok avantajı vardır:

  • kaygılar açık bir ayrım
  • Her modül bir kavanoza (veya web modülü durumunda bir savaş) olarak packageable ve böylece daha kolay kod yeniden (örneğin, biz maven depo modülü yüklemek ve başka bir projede yeniden verebilecek) sağlar
  • Projenin her parçasının maksimum bağımsızlık

Bunun tüm sorularınıza cevap vermez biliyorum ama bu doğru yolda bırakabilir ve başkalarına faydalı olabilir düşünüyorum.

Cevap 15/09/2008 saat 21:43
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more