it-swarm.asia

Kaynak ağacımı nasıl organize etmeliyim?

Ben büyük ölçüde web projelerinde (W/LAMP) ve zaman zaman yaklaşık ortalama ölçekte C/C++ (GUI olmayan) projelerde çalışan bireysel bir geliştiriciyim.

Kaynak kod ağacımı yapılandırmakla sık sık uğraşıyorum. Aslında, genellikle, bir projeyi tüm ağacı boşaltmadan ve parçaları üç-dört kez yeniden düzenlemeden tamamlamıyorum, bu da gerçekten çok çaba harcıyor ve sonuçta bir uzlaşma gibi görünüyor.

Bazen, kaynakların aşırı sınıflandırılmasıyla sonuçlanırım - çok uzun klasör ve alt klasör ağacı. Diğer zamanlarda, basitçe, hizmet ettikleri daha büyük amaca bağlı olarak belirli bir klasördeki tüm dosyaları konsantre edip kaynakta 'kaotik' klasörlere yol açıyorum.

Sormak istiyorum:

  • Kaynak ağacımı yapılandırmamda bana daha iyi yardımcı olabilecek ilkeler/mantık/en iyi uygulamalar var mı?
  • Projenin analizine dayanarak kaynak ağacımı önceden görselleştirmeme yardımcı olabilecek herhangi bir grafik/diyagramatik teknik var mı (örneğin: veri akışı durumunda DFD)?
  • Projeyle ilişkili çoklu ortam dosyaları ağacını yapılandırmak için hangi strateji benimsenmelidir?

Ödül hakkında: Kendi uygulamalarını paylaşan üyelerle mevcut cevapları takdir ediyorum, ancak üyelerden daha genel ve öğretici cevapları (veya kaynakları) ve daha fazla yanıtı teşvik etmek istiyorum.

91
check123

Kaynak ağaç düzeni mimariyi yansıtmalıdır; bir sonuç olarak, iyi yapılandırılmış bir mimari iyi yapılandırılmış bir kaynak ağaç düzenine yol açabilir. POSA1 Katmanlar kalıbı üzerinde okumanızı, mimarinizi katmanlı bir yapıya sığdırmayı, sonra elde edilen katmanların her birini adlandırmayı ve bunu kaynak hiyerarşiniz için bir temel olarak kullanmanızı öneririm. Temel bir üç katmanlı mimari temel almak:

  • sunum/webService (iş mantığımıza bir web-servis arayüzü sunmak)
  • mantık/* (iş mantığı modülleri buraya girer)
  • storage/sql (arka uç depolama API'ları burada - bu, veritabanına depolamak için bir SQL arayüzü kullanır)
  • util/* (yardımcı program kodu - diğer tüm katmanlar tarafından kullanılabilir, ancak bu util dışında belirtilmez, buraya gider)

Katmanların doğrudan kod içermediğini, bunun yerine modülleri düzenlemek için kesinlikle kullanıldığını unutmayın.

Bir modül içinde aşağıdaki düzen türünü kullanıyorum:

  • <module> (doğrudan modüle giden yol; modüler arayüzü tanımlar)
  • <module>/impl/<implName> (modüler arayüzün özel bir uygulaması)
  • <module>/doc (Modülü kullanma belgeleri)
  • <module>/tb (modül için birim test kodu)

nerede <module>, ait olduğu katmana göre depoda bulunur.

25
Aidan Cully

Web projeleri ile ilgili size çok fazla tavsiyede bulunamıyorum, ancak ağacımı bir programlama projesinde nasıl yapılandıracağım (özellikle C/C++ perspektifinden):

  • /
    • src - Kendi yazdığım kaynak dosyaları
    • ext - Üçüncü taraf kütüphaneleri içerir
      • kütüphane-adı-1.2.8
        • dahil - Başlıklar
        • lib - Derlenmiş lib dosyaları
        • Donwload.txt - Kullanılan sürümü indirmek için bağlantı içerir
    • ide - Proje dosyalarını burada saklıyorum
      • vc1 - IDE'ye bağlı olarak proje dosyaları düzenliyorum
    • bin - Derlenmiş exe buraya gidiyor
    • build - Derleyicinin derleme dosyaları
    • doc - Her türlü belge
    • README
    • YÜKLEMEK
    • KOPYALANMASI

Birkaç not:

  1. Bir kitaplık yazıyorsam (ve C/C++ kullanıyorum) Kaynak dosyalarımı önce "include" ve "src" adlı iki klasörde sonra da modül tarafından organize edeceğim. Bir uygulama ise, bunları sadece modülle organize edeceğim (başlıklar ve kaynaklar aynı klasöre gidecek).

  2. Yukarıda listelediğim dosya ve dizinler italics Kod deposuna eklemeyeceğim.

49
Paul

Maven Standart Dizin Düzeni Java'ya özgüdür, ancak diğer proje türleri için de iyi bir temel oluşturabilir.

Temel yapı ('Java' dizinlerini 'php', 'cpp' vb. İle değiştirebilirsiniz):

src/main/Java       Application/Library sources 
src/main/resources  Application/Library resources  
src/main/filters    Resource filter files 
src/main/Assembly   Assembly descriptors 
src/main/config     Configuration files 
src/main/webapp     Web application sources 
src/test/Java       Test sources 
src/test/resources  Test resources 
src/test/filters    Test resource filter files 
src/site            Site 
LICENSE.txt         Project's license 
NOTICE.txt          Notices and attributions required by libraries
README.txt          Project's readme

Yapı temel olarak 'src/main' ve 'src/test' türlerine ayrılır ve ardından türe göre gruplandırılır.

15
Michal Miller

İdeal olarak, kuruluşun yapısı mühendislik ve iş dünyası arasındaki etkileşimi artırmak ve yeniden kullanımı teşvik etmek amacıyla tasarlanmış tek bir veri havuzuna sahiptir.

...\products\
...\products\productName\
...\products\productName\doc\

...\systems\
...\systems\systemName\
...\systems\systemName\doc\
...\systems\systemName\res\
...\systems\systemName\build\
...\systems\systemName\test\

...\library\
...\library\libraryName\
...\library\libraryName\doc\
...\library\libraryName\build\
...\library\libraryName\test\

...\devops\

ürünleri

Ürün başına bir klasör; yazılımın işi nasıl desteklediğini bildirmeye yardımcı olur.

İdeal olarak, her "ürün" hangi sistemleri çağırmayı ve nasıl yapılandırılacağını gösteren bir yapılandırma dosyasından biraz daha fazlasıdır. Doc alt klasörü, üst düzey kısa\spec ve herhangi bir promosyon materyali vb.

Ürünleri ve sistemleri ayırarak, yeniden kullanım potansiyelini işletmenin müşteriye dönük tarafına iletiriz ve ürün başına siloları parçalarız. (Bu aynı soruna "ürün hattı" yaklaşımı ile tezat oluşturur)

sistemleri

Sistem başına bir klasör; deponun içeriğinin birincil yeteneklerini ve fırsatını/değerini iletmeye yardımcı olur.

  1. Yapım ve dağıtım ortamlarını belirten "yapılandırma yönetimi" dosyaları.
  2. Sistem düzeyinde test yapılandırması (önemli miktarda olabilir).
  3. Üst düzey mantık ve işlevsellik; en ağır kaldırma kütüphane fonksiyonları ile yapılmaktadır.

kitaplığı

Çeşitli sistemler tarafından çağrılan yeniden kullanılabilir bileşenler. Çoğu geliştirme faaliyeti sistemlerden ziyade kütüphane üretimi etrafında organize edilir, bu nedenle yeniden kullanım geliştirme sürecine "pişirilir".

devops

Yapı, Sürekli Entegrasyon ve diğer Geliştirme Otomasyonu işlevleri.

Sonuç

Kaynak ağaç önemli bir dokümantasyon parçasıdır ve işletmenin sahip olduğu teknoloji ile olan ilişkisinin yaklaşımını, yapısını ve psikolojisini şekillendirir.

Bu yaklaşıma yönelik sürücüler, bu soruya vereceğim cevabı biraz daha ayrıntılı bir şekilde açıklıyor: https://softwareengineering.stackexchange.com/questions/43733/who-organizes-your-matlab-code/59637#59637

6
William Payne

Gerçekten sözleşmeler hakkında bilmiyorum ama tüm ana projelerim Symfony Framework kullanılarak yapılır ve aşağıdaki gibi bir ağaç yapısına alıştım:

kök/

  • uygulamaların
  • uygulama ismi
    • config (uygulamaya özel yapılandırma dosyaları)
    • lib (uygulamaya özel php dosyaları)
    • modüller (işlevselliğin modüler dağılımı)
      • modül Adı
        • şablonlar (html)
        • eylemler (php kodu)
  • confing (proje yapılandırma dosyaları)
  • lib (delik projesinde kullanılabilecek php kodu)
  • model (proje bilgilerini temsil eden sınıflar)
    • baz
  • formu (formları işleyen php dosyaları, bu symfony olmadan elde etmek oldukça zor olabilir)
    • base (temel form sınıfları)
  • web
  • cSS
    • görüntüler
    • file.css
  • js
  • günlük (oluşturulabilecek günlük dosyaları)
  • veriler (sql yamaları veya başka herhangi bir şey gibi verilere özgü bilgiler)
  • sql
  • eklentileri (projenin herhangi bir uygulamasıyla birleştirilebilecek kullanılan kütüphaneler)

Eğer ilgileniyorsanız, daha fazla bilgi için konuyla ilgili symfony belgelerini okuyun ( Symfony MVC ve Kod Organizasyon ).

5
guiman

Her proje için yapmaya çalıştığım şey şuna benzer:

  • src - kaynak dosyalar, her ad alanı/paket için dosyaları kolayca almak için bir klasör (C/C++ için başlık dosyaları bile)
  • ext - harici/üçüncü taraf kütüphaneler için, harici eklemek (SVN depoları gibi) kolaydır. İçeride, her kitaplık için bir klasör (ikili dosyalar ve içerme dosyaları)
  • bin - yerleşik ikili dosyalar için, serbest bırakılmak üzere hızla dışa aktarılabilir
    • inc - C/C++ başlık dosyası için (IDE/makefile/etc tarafından kopyalandı ...)
  • out - geçici olarak oluşturulan tüm dosyalar için (.class, .obj vb ...) ve yok sayılabilir (örneğin SVN tarafından)
  • doc - genellikle Doxygen ile oluşturulan belgeler için
  • res - Kaynakları buraya yerleştirerek, program tarafından kullanılan metin kaynak dosyalarını ve ikili kaynakları ayırmak mümkündür. İçimde gerçekten belirli bir hiyerarşim yok.
    • yapılandırma - bazı yapılandırma dosyaları için
    • çekilebilir - bazı resimler veya simgeler için

Yalnızca bir tanesini kullanırsanız, tüm IDE dosyaları veya markaları doğrudan kök dizinine kaydedilir.

3
Ninfomane

Ben böyle bir şey yapıyorum. Boş zamanlarımda yaptığım bir çapraz platform oyunu için iyi çalışıyor. Ne yazık ki işte, işler çok daha az organize ...

Output                      <-- Build outputs
Docs
External
   <libname>
      Include
      Lib
Data
<ProjectName>.xcodeproj
<ProjectName>VS2010
Source
Temp                        <-- Intermediate stuff from builds and other tools
Tools
2
Colonel Panic

Bu sayfada sunulan fikirleri seviyorum www.javapractices.com/topic/TopicAction.do?Id=205 . Temel olarak, tavsiye projenizi özellikler (veya modüller, bileşenler) halinde organize etmektir. Orada sunulan nedenlere ek olarak:

  1. Üzerinde çalıştığınız özellikteki herhangi bir kodun "özellik-özel" olduğuna dair bir garantiniz olduğundan, üzerinde çalıştığınız kodun kapsamını düşündüğünüzde daha az bilişsel yük.
  2. Yalnızca belirli bir özellik için kodu değiştirdiğinizden emin olduğunuzda ek bir güvenlik duygusu vardır. Örneğin, üzerinde çalıştığınız özellik dışında hiçbir şeyi bozmazsınız. Yine bu "özellik-özel" nedeniyle.
  3. Daha az bilişsel yükleme basittir çünkü belirli bir paket için görebileceğiniz daha az dosya vardır. Herkesin 15'ten fazla dosya içeren bir paket gördüğüne eminim.

Bunun Java paketleri (ad alanları olarak da bilinir) üzerine odaklandığını unutmayın. Büyük projeler için, aynı nedenlerle, projeyi, iş özellikleri.Maven projeleri için bunu tavsiye ederim okuma .

Şimdiye kadar dahil olduğum/katıldığım projeler bunları takip etmiyor. Bunun birçok nedeni var, ama işte birkaç tane:

  1. Java varsayılan erişim değiştiricinin yanlış anlaşılması (buna göre en yanlış anlaşılan erişim değiştirici kitap )
  2. "Argumentum ad populum": Paket katman hakimiyeti (muhtemelen Sebep # 1'in neden olduğu)

Mimar Alexander'ın dediği gibi, proje kaynak organizasyonu projenin başlangıcında ciddiye alınmazsa karmaşıklığı önlemek için kaçırılmış bir fırsat olduğunu düşünüyorum:

"Herhangi bir tasarımcının size söyleyeceği gibi, bir tasarım sürecinde en önemli olan ilk adımdır. Formu oluşturan ilk birkaç vuruş, içinde kalanların kaderini taşır." - Christopher Alexander

Bir projenin boyutuna ve karmaşıklığına bağlı olarak, maliyetleri veya yatırım getirisini azaltma fırsatı gerçekten büyük olabilir. (Bunun tam sayılarını görmek için bir çalışma görmek istiyorum)

2
thirdy

Ekiplerim için, ekip bağlam değiştirdikçe bir şeyler bulmak ve her seferinde yeniden öğrenmek zorunda kalmamak için projeler arasında standart bir yapı uygulamaya çalışıyoruz. Tüm projelerin tüm sistemlere ihtiyacı yoktur, bu yüzden minimum setle başlarız.

/ Kaynak/Komponent/Dil

/ Kaynak/Bileşen/3. Taraf /

/ Belgeleri/Koşullar

/ Belgeler/Tasarım

/ Testler/Otomatik/Birim

/ Testler/Otomatik/ToolName

/ Testler/Manuel

Bu, özellikle 3. Taraf kodu ve kitaplıkları altında bazı çoğaltmalarla sonuçlanır, ancak en azından "RogueWave Editor'ı ne kullanır?"

2

Benim tavsiyem çeşitli çerçeveler veya motorlar indirmek ve dev geliştirme ekiplerinin klasör yerleşimlerini nasıl ele aldıklarını görmek.

Dosyaları düzenlemenin birçok yolu vardır, birini seçmek daha iyidir ve herhangi bir projede ona bağlı kalmaya çalışın. Hatalardan kaçınmak ve gereksiz zaman kaybını önlemek için tamamlanana veya yenilenene kadar belirli bir sözleşmeye sadık kalın.

Web projeleri için Laravel, Symphony veya Codeigniter çerçevelerini çalıştırarak anında bir klasör düzenine sahip olabilirsiniz.

Bu yüzden herhangi bir geliştirme için ortak bir klasör düzeni aktarmaya çalışacağım:

MVC (Model View Controller) iyi bir organizasyon paradigması verir.

Kök kaynak kodu src (C++) veya app (web geliştirme) olabilir

Gruplandırdığı sınıflar için net bir amacı olmayan bir dosya yapısı kesinlikle karışıklığa neden olacaktır. Sadece kodu düzenlemekle kalmaz, bunun yerine otomatik yükleyicileri, sınıf fabrikasını, yerel depolamayı, uzak depolamayı ve ad boşluğunu kaldırabilir.

Bu klasör yapısı Laravel Framework dizininden türetilmiş ve basitleştirilmiştir. Bu yazıdaki tercihim çoğul adlandırma ama projelerimde tekil kelimeler kullanıyorum.


src/storage (modeller/dosya depolama/api/mysql/sql-lite/memcached/redis uygulamaları)

src/repositories (Bazı depolama mantığı, ortak bir arabirim ve dönüş sonucu kuralı olan 'depolama uygulamaları' örneği.)

src/services | mantık | varlıklar (Uygulama iş mantığı)

src/controllers (Sunucu isteklerini hizmetlerinize yönlendirmek için web geliştirmede kullanılır)

src/modules | systems (Çerçeve genel işlevlerinizi genişleten modüler sistemler. Hizmetler modülleri kullanabilir ancak viceversa kullanamaz)

src/helpers (Örneğin dize manipülasyonu gibi yardımcı veya sarıcı sınıflar. Çoğu zaman bu üçüncü taraflarda libs | vendor'da olabilir)

src/types (Adlandırılmış numaralandırmalar)

public | build | output (web veya c ++)

config (Kurulum dosyaları. YAML, platformlar arası yapılandırma dosyaları için popüler hale geliyor)

cache

günlükleri

dil (tr/es/ru/...)

bootstrap (Çerçeveyi ve uygulamayı başlatır)

dokümanlar (Markdown biçiminde yazılmış belgeler .md)

testler (Birim testi)

veritabanı/taşıma (Sıfırdan veritabanı yapısı oluşturun)

veritabanı/tohum (Veritabanınızı test etmek için sahte verilerle doldurur)

libs | vendor (tüm üçüncü taraf yazılımları. C++ 'daki' libs 've genellikle php üzerindeki' vendor ')

varlıklar | kaynaklar (resimler/sesler/komut dosyaları/json/herhangi bir medya)

2
Heroselohim

Nesneye yönelik dillerle ad alanları oluşturma olanağına sahipsiniz. Eşleşmeyi önlemek için uygulamanın bölümlerini ayırmak için kullanılan bu mantıksal döküm, mantıksal dosya konumu dökümü için birincil kaynaktır. Birleşimi ad alanlarını parçalamak için bir neden olarak kullanmak başlamak için iyi bir yerdir http://en.wikipedia.org/wiki/Software_package_metrics .

Diğerleri, projeyi derleme ile ilgili olarak kurmayla ilgili konuştu, ancak kaynağın kendisine girdikten sonra, mantıklı olan şeyle ilgili - sadece kodu mantıksal olarak nasıl ayırdığınızı kullanın.

1
Travis