Klasöre göre veya Klasöre göre özellik


59

AngularJS tarzı bir rehberden yararlanıyorum. Bu kılavuzun içinde folder-by-feature, bunun yerine bir stil var folder-by-typeve aslında en iyi yaklaşımın ne olduğunu merak ediyorum (bu örnekte Java için)

Diyelim ki, Hizmetleri ve Denetleyicileri, depoları ve etki alanı nesnelerini kullanarak Kullanıcılar ve Evcil Hayvanları alabileceğim bir uygulama var.

Klasöre göre stilleri alarak, paketleme yapımız için iki seçeneğimiz var:

1. Klasöre göre

com.example
├── domain
│    ├── User.java
│    └── Pet.java
├── controllers
│    ├── UserController.java
│    └── PetController.java
├── repositories
│    ├── UserRepository.java
│    └── PetRepository.java
├── services
│    ├── UserService.java
│    └── PetService.java
│   // and everything else in the project
└── MyApplication.java

2. Klasöre göre özellik

com.example
├── pet
│    ├── Pet.java
│    ├── PetController.java
│    ├── PetRepository.java
│    └── PetService.java
├── user
│    ├── User.java
│    ├── UserController.java
│    ├── UserRepository.java
│    └── UserService.java
│   // and everything else in the project
└── MyApplication.java

İyi bir yaklaşım ne olurdu ve bunun için argümanlar nelerdir?



1
@Laiv'i tanımıyorum. Dil / çerçeve cevabı gerçekten etkiliyor mu? Ne olursa olsun, diğer soru kesinlikle alakalı.
RubberDuck

1
O zaman cevabımı düzenlemeliyim. Ve evet, muhtemel bir kopyası
Laiv

2
Klasöre göre yararı hiç anlamadım. Evcil hayvan özelliğine ilişkin bir bilet üzerinde çalışıyorsam, muhtemelen Petkontrolörden, havuzdan ve hizmetten faydalanabilirim . Hangi durumda, tüm denetleyicilere ihtiyacım olur ama görüşlerin, depoların veya hizmetlerin olmamasına?
Alexander

2
Hiç kimse Java’daki paketlerin sadece klasör olmadığını; ayrıca içerilen sınıflara erişimi de etkilerler. Bu nedenle, katman bazında / tür Java'da bazı anlamsal değerler sağlayabilir.
Angus Kuyumculuk

Yanıtlar:


69

Klasöre göre yalnızca küçük ölçekli projelerde çalışır. Klasör bazında özellik çoğu durumda üstündür.

Klasöre göre yalnızca az sayıda dosyanız olduğunda sorun yok (tür başına 10'un altında diyelim). Projenizde birden fazla bileşen aldığınız anda, hepsi aynı türde birden fazla dosyaya sahip olduğunuzda, aradığınız gerçek dosyayı bulmak çok zorlaşır.

Bu nedenle, klasör özellik özelliği, ölçeklenebilirliği nedeniyle daha iyidir. Ancak, özelliğe göre klasör oluşturursanız, bir dosyanın temsil ettiği bileşenin türü hakkında bilgi kaybedersiniz (çünkü artık bir controllerklasörde olmadığını söyler), bu da kafa karıştırıcı olur. Bunun için 2 basit çözüm var.

İlk olarak, dosya adında tiksinti içeren ortak adlandırma kurallarına uyabilirsiniz. Örneğin, John Papa'nın popüler AngularJS stil rehberi aşağıdakilere sahiptir:

Adlandırma Kuralları

  • Bileşenin özelliğini ve ardından (isteğe bağlı olarak) türünü tanımlayan bir deseni izleyen tüm bileşenler için tutarlı adlar kullanın. Benim
    tavsiye edilen model feature.type.js olduğunu. Çoğu
    varlık için 2 ad vardır :

    • dosya adı (avengers.controller.js)
    • Angular'a (AvengersController) kayıtlı bileşen adı

İkincisi, klasör türüne göre ve özellik özelliklerine göre stilleri klasör özelliklerine göre birleştirebilirsiniz:

com.example
├── pet
|   ├── Controllers
│   |   ├── PetController1.java
|   |   └── PetController2.java
|   └── Services
│       ├── PetService1.java
│       └── PetService2.java
├── user
|   ├── Controllers
│   |   ├── UserController1.java
│   |   └── UserController2.java
|   └── Services
│       ├── UserService1.java
│       └── UserService2.java

1
Johnpapa stil rehberi tam olarak :-) hakkında taklit ettiğim kişiydi
Jelle

1
Bazı zamanlar (düşündüğümüzden daha sık) kolay olması gereken şeylere fazla karmaşıklık ekleriz. Adlandırma ve paketleme bunlardan bazıları. En iyi tavsiye basit tutmaktır. Her ikisinin de karıştırılması, her iki yaklaşımın avantajlarına ve dezavantajlarına sahiptir.
Laiv

1
@Laiv Verdiğim örnekte, genel olarak katlanabileceğini kabul ediyorum, ancak her tip klasörün 10-20 dosyaya kolayca sahip olabileceği gerçek iş durumlarımın çoğunda, genel özellik klasörünün 50 sırasına sahip olacağı için çok yararlı olduğunu düşünüyorum. Aksi takdirde dosyalar.
Monica

6
sahte, teşekkürler iPhone otomatik olarak düzeltildi! 'Konuşmak' demek istedim.
Jelle

2
@Chaotic Bu örnek, özellikleri konuşmaya başlamak için çok önemsizdir, ancak birden fazla bileşende kullanılan parçalara sahip olduğunuz durumlarda, bu muhtemelen diğer bileşenlerin bağlı olduğu kendi bileşenlerinden biri olmalıdır.
Monica

26

Konfigürasyona göre yapılandırma yaklaşımının bir parçası olarak sizi klasör bazında zorlayan bir çerçeve kullanmadıkça, bunun gerçekten söz konusu teknoloji ile ilgisi yoktur.

Şahsen, ben, kesinlikle, özellik olarak klasörün çok üstün olduğu ve mümkün olduğunca her yerde kullanılması gerektiği görüşündeyim. Birlikte çalışan sınıfları birlikte gruplandırır, oysa klasör tipi sadece genellikle sınıf adında bulunan bir şeyi çoğaltır.


10
Klasöre göre özelliğin, sınıflar ve yöntemler kapsamlarıyla (korumalı, paket, ...) oynamayı kolaylaştırdığını eklerdim.
Laiv

Küçük projeler için yalnızca bir özelliğe sahip olabilirsiniz. Bu senaryoda türüne göre düzenlemek çok daha kolaydır.
aaaaaa

Bir örnek olarak, Grails vb alanlarınızda, kontrolörler, hizmetler için klasör-by-type zorlamak yapar
tylerwal

17

Özelliklere göre paketlerle çalışmak , yüksek modülerlik ve uyum içinde göze çarpıyor . Bileşenlerin kapsamı ile oynamamızı sağlar. Örneğin, LoD'yi uygulamak için erişim değiştiricileri ve entegrasyonlar ve / veya uzantılar için bağımlılık inversiyonunu kullanabiliriz .

Diğer sebepler:

  • Daha kolay kod gezinme
  • Daha yüksek bir soyutlama seviyesi
  • Kapsamları en aza indirin (sınırlayıcı bağlamlar)
  • Dikey modülerleştirme

Klasör katmanı , üzerinde çalıştığımız uygulama hakkında çok fazla bir şey söylemediğinden , uygulama ayrıntılarına (@David'in dediği gibi) çok fazla önem vermektedir . Paket özelliğin aksine , paket katman yatay modülerleşmeyi teşvik eder. Bu tür modülerleştirme, çapraz kesim bileşenleriyle çalışmayı zor ve sıkıcı hale getirir.

Sonunda, üçüncü bir seçenek var. " Bileşeni tarafından Paketi Amca Bob deyişle, daha iyi onun aynı hizada görünüyor," paket ilkelerine . Bob Amca'nın görüşü önemliyse veya olmazsa, karar vermen için sana bırakarım. Bu kongre, sevdiğim Temiz Mimarisi ile uyumlu olduğundan ilginç buluyorum.

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.