Saya seorang pengembang individu yang bekerja, sebagian besar, pada proyek web (W / LAMP) dan, kadang-kadang, pada proyek C / C ++ (non-GUI) dengan skala rata-rata.
Saya sering berjuang dengan struktur pohon kode sumber saya. Bahkan, biasanya, saya tidak menyelesaikan proyek tanpa membuang seluruh pohon dan menata ulang potongan tiga-empat kali yang benar-benar membutuhkan banyak usaha dan terlebih lagi hasil akhirnya tampak seperti kompromi.
Kadang-kadang, saya berakhir dengan lebih dari klasifikasi sumber - pohon folder dan sub-folder yang sangat panjang. Di lain waktu, saya hanya berkonsentrasi semua file dalam folder tertentu berdasarkan tujuan yang lebih besar yang mereka layani dan dengan demikian mengarah ke folder 'kacau' di sumbernya.
Saya ingin bertanya:
- Apakah ada prinsip / logika / praktik terbaik yang dapat membantu saya lebih baik dalam struktur pohon sumber saya?
- Adakah teknik grafis / diagram (misalnya: DFD dalam hal aliran data) yang dapat membantu saya memvisualisasikan struktur kode sumber saya sebelumnya berdasarkan analisis proyek?
- Apa strategi untuk mengadopsi struktur multi-media file-pohon yang terkait dengan proyek?
Tentang hadiah : Saya menghargai jawaban yang ada dengan anggota yang berbagi praktik mereka sendiri, namun, saya ingin mendorong jawaban yang lebih umum dan instruktif (atau sumber daya) dan lebih banyak tanggapan dari anggota.
sumber
Jawaban:
Tata letak pohon sumber harus mencerminkan arsitektur; sebagai akibat wajar, arsitektur yang terstruktur dengan baik dapat mengarah pada tata letak pohon sumber yang terstruktur dengan baik. Saya sarankan membaca pada pola Layers POSA1 , mencoba menyesuaikan arsitektur Anda ke dalam struktur berlapis, kemudian memberi nama setiap lapisan yang dihasilkan, dan menggunakannya sebagai dasar untuk hierarki sumber Anda. Mengambil arsitektur tiga tingkat sebagai dasar:
Perhatikan bahwa layer tidak mengandung kode secara langsung, tetapi lebih tepatnya digunakan untuk mengatur modul.
Dalam sebuah modul, saya menggunakan jenis tata letak berikut:
<module>
(jalur ke modul secara langsung; mendefinisikan antarmuka modular)<module>/impl/<implName>
(implementasi spesifik dari antarmuka modular)<module>/doc
(Dokumentasi untuk menggunakan modul)<module>/tb
(kode unit-test untuk modul)di mana
<module>
terletak di repositori sesuai dengan lapisan tempatnya.sumber
Saya benar-benar tidak bisa memberi Anda banyak saran yang berkaitan dengan proyek web, tetapi inilah cara saya menyusun struktur pohon saya dalam proyek pemrograman (terutama dari perspektif C / C ++):
Beberapa catatan:
Jika saya sedang menulis perpustakaan (dan saya menggunakan C / C ++) saya akan mengatur file sumber saya terlebih dahulu dalam dua folder yang disebut "include" dan "src" dan kemudian dengan modul. Jika ini adalah aplikasi, maka saya akan mengaturnya hanya dengan modul (header dan sumber akan masuk ke folder yang sama).
File dan direktori yang saya cantumkan di atas dalam huruf miring, saya tidak akan menambahkan ke repositori kode.
sumber
ide
hanya tempat saya menyimpan file proyek sendiri.build
berisi file objek yang dihasilkan oleh kompiler. IDE yang berbeda dapat menggunakan kompiler yang sama, jadi itu sebabnya saya menjaga file proyek IDE terpisah dari file objek yang dibangun oleh kompiler.Sementara Layout Direktori Standar Maven jenis khusus untuk Java, tetapi mungkin berfungsi sebagai dasar yang baik untuk jenis proyek lainnya juga.
Berikut adalah struktur dasarnya (Anda bisa mengganti direktori 'java' dengan 'php', 'cpp', dll):
Struktur pada dasarnya terurai menjadi 'src / main' dan 'src / test' kemudian dikelompokkan berdasarkan jenis.
sumber
Saya tidak benar-benar tahu tentang konvensi tetapi semua proyek utama saya selesai menggunakan Symfony Framework dan saya telah terbiasa dengan struktur pohon seperti berikut:
akar/
Jika Anda tertarik, silakan baca dokumentasi symfony tentang masalah ini untuk ditanyakan lebih lanjut ( MVC dan Code Organisation on Symfony ).
sumber
Idealnya, organisasi memiliki repositori tunggal, struktur yang dimaksudkan untuk meningkatkan keterlibatan antara teknik & bisnis dan mempromosikan penggunaan kembali.
produk
Satu folder per produk; membantu mengomunikasikan bagaimana perangkat lunak mendukung bisnis.
Idealnya, setiap "produk" tidak lebih dari file konfigurasi yang menunjukkan sistem mana yang harus dipanggil dan bagaimana mereka harus dikonfigurasi. Subfolder dokumen dapat berisi brief \ spec \ tingkat atas & materi promosi apa pun dll ...
Dengan memisahkan produk dan sistem, kami mengomunikasikan potensi penggunaan kembali ke sisi bisnis yang dihadapi pelanggan, dan memecah silo per produk. (Ini kontras dengan pendekatan "lini produk" untuk masalah yang sama)
sistem
Satu folder per sistem; membantu mengomunikasikan kemampuan & peluang / nilai utama dari isi repositori.
Perpustakaan
Komponen yang dapat digunakan kembali dipicu oleh berbagai sistem. Sebagian besar kegiatan pengembangan diselenggarakan di sekitar produksi perpustakaan, bukan sistem, sehingga penggunaan kembali "dimasukkan ke dalam" proses pengembangan.
devops
Membangun, Integrasi Berkelanjutan & fungsi Otomasi Pengembangan lainnya.
Kesimpulan
Source tree adalah bagian penting dari dokumentasi, dan membentuk pendekatan, struktur dan psikologi hubungan bisnis dengan teknologi yang dimilikinya.
Driver untuk pendekatan ini dijelaskan sedikit lebih dalam dalam jawaban saya untuk pertanyaan ini: https://softwareengineering.stackexchange.com/questions/43733/who-organizes-your-matlab-code/59637#59637
sumber
Apa yang saya coba lakukan untuk setiap proyek serupa dengan:
Semua file IDE atau makefile disimpan langsung di root jika Anda hanya menggunakan salah satunya.
sumber
Saya melakukan sesuatu seperti ini. Bekerja dengan baik untuk permainan lintas platform yang saya lakukan di waktu luang saya. Sayangnya dalam pekerjaan, banyak hal yang kurang terorganisir ...
sumber
Untuk tim saya, kami mencoba untuk menegakkan struktur standar di seluruh proyek agar mudah untuk menemukan hal-hal sebagai tim mengubah konteks dan untuk menghindari keharusan mempelajari kembali setiap kali melalui. Tidak semua proyek membutuhkan semua sistem jadi kami mulai dengan set minimal.
Ini menghasilkan duplikasi, khususnya di bawah kode Pihak Ketiga dan perpustakaan, tetapi setidaknya kita tidak pernah lupa jawaban untuk sesuatu seperti "Apa yang menggunakan Editor RogueWave?"
sumber
Saya menyukai gagasan yang disajikan di halaman ini www.javapractices.com/topic/TopicAction.do?Id=205 . Pada dasarnya, rekomendasinya adalah mengatur proyek Anda menjadi fitur (atau modul, komponen). Selain alasan yang disajikan di sana:
Catatan ini difokuskan pada paket Java (alias ruang nama). Untuk proyek besar, saya merekomendasikan, untuk alasan yang sama, membagi proyek menjadi beberapa proyek (seperti dalam beberapa proyek pakar) yang mewakili fitur bisnis. Untuk proyek pakar, saya merekomendasikan bacaan ini .
Sejauh ini, proyek yang saya / saya ikuti tidak mengikuti ini. Ada banyak alasan, tetapi inilah beberapa:
Saya pikir ada peluang yang terlewatkan untuk mencegah kompleksitas jika organisasi sumber proyek tidak ditanggapi dengan serius pada awal proyek seperti yang dikatakan arsitek Alexander:
Bergantung pada ukuran & kompleksitas proyek, peluang yang terlewatkan untuk memangkas biaya atau ROI bisa sangat besar. (Saya tertarik melihat studi untuk melihat angka pasti untuk ini)
sumber
Rekomendasi saya adalah mengunduh berbagai kerangka kerja atau mesin dan melihat bagaimana tim pengembang menangani tata letak folder mereka.
Ada begitu banyak cara untuk mengatur file sehingga lebih baik untuk memilih satu, dan mencoba untuk tetap menggunakannya pada proyek tertentu. Tetap pada konvensi tertentu sampai selesai atau pembenahan untuk menghindari bug dan kehilangan waktu yang tidak perlu.
Anda dapat mengunduh kerangka kerja Laravel, Symphony atau Codeigniter untuk proyek web agar memiliki tata letak folder instan yang berfungsi.
Jadi saya akan mencoba menyampaikan tata letak folder yang umum untuk pengembangan apa pun:
MVC (Model View Controller) memberikan paradigma organisasi yang baik.
Kode sumber root bisa berupa src (C ++) atau aplikasi (pengembangan web)
Struktur file yang tidak memiliki tujuan yang jelas untuk kelas yang dikelompokkannya pasti akan menyebabkan kebingungan. Ini tidak hanya untuk mengatur kode, tetapi juga dapat mempertahankan auto-loaders, pabrik kelas, bungkus penyimpanan lokal, penyimpanan jarak jauh dan penempatan nama.
Struktur folder ini diturunkan dan disederhanakan dari Laravel Framework . Preferensi saya pada posting ini adalah penamaan jamak tetapi saya menggunakan kata-kata tunggal dalam proyek saya.
src / storage (model / file-storage / api / mysql / sql-lite / memcached / redis implementasi)
src / repositori (Pembungkus 'implementasi penyimpanan' dengan beberapa logika penyimpanan, antarmuka umum dan kembalinya konvensi hasil.)
src / layanan | logika | entitas (Logika bisnis aplikasi)
src / controllers (Digunakan pada pengembangan web untuk merutekan permintaan server ke layanan Anda)
src / modules | sistem ( Sistem modular yang memperluas fungsionalitas umum kerangka kerja Anda. Layanan dapat menggunakan modul tetapi tidak sebaliknya)
src / helpers (Kelas pembantu atau pembungkus seperti mis. manipulasi string. Sering kali ini bisa berada di libs | vendor saat pihak ketiga)
src / types (Dinamai enum)
publik | membangun | output (web atau c ++)
config (Setup file. YAML menjadi populer untuk file konfigurasi lintas-platform)
cache
log
lang (en / es / ru / ...)
bootstrap (Mulai kerangka kerja dan aplikasi)
docs (Dokumentasi ditulis dalam format markdown .md)
tes (pengujian Unit)
database / migrasi (Buat struktur database dari awal)
database / seed (Mengisi database Anda dengan data dummy untuk diuji)
libs | vendor (semua perangkat lunak pihak ketiga. 'libs' di C ++ dan 'vendor' biasanya di php)
aset | sumber daya (gambar / suara / skrip / json / media apa saja)
sumber
Dengan bahasa yang berorientasi objek, Anda memiliki kemampuan untuk membangun ruang nama. Kerusakan logis yang digunakan untuk memisahkan bagian-bagian aplikasi untuk menghindari penggandengan adalah sumber utama kerusakan lokasi file logis. Menggunakan kopling sebagai alasan untuk memecah ruang nama adalah tempat yang baik untuk memulai http://en.wikipedia.org/wiki/Software_package_metrics .
Orang lain telah berbicara tentang menyiapkan proyek dalam kaitannya dengan membangun, tetapi begitu Anda masuk ke sumber itu sendiri, ini tentang apa yang masuk akal - cukup gunakan bagaimana Anda secara logis memecah kode.
sumber