Bagaimana Anda mengatur proyek Anda? [Tutup]

148

Apakah Anda memiliki gaya tertentu dalam mengatur proyek?

Misalnya, saat ini saya sedang membuat proyek untuk beberapa sekolah di sini di Bolivia, ini adalah bagaimana saya mengelolanya:

TutoMentor (Solution)
TutoMentor.UI   (Winforms project)
TutoMentor.Data (Class library project)

Bagaimana tepatnya Anda mengatur proyek Anda? Apakah Anda memiliki contoh sesuatu yang Anda kelola dan banggakan? Bisakah Anda berbagi tangkapan layar panel Solusi?

Di area UI aplikasi saya, saya mengalami masalah dalam memutuskan skema yang baik untuk mengatur berbagai bentuk dan di mana mereka berada.


Sunting:

Bagaimana dengan mengatur berbagai bentuk dalam proyek .UI? Di mana / bagaimana saya harus mengelompokkan bentuk yang berbeda? Menempatkan mereka semua di tingkat akar proyek adalah ide yang buruk.


sumber
Wow, hadiah 450?
Mateen Ulhaq
2
@muntoo: Ya, saya benar-benar tertarik pada beberapa jawaban bagus. :)
Harus dinyatakan secara eksplisit bahwa Anda bertanya tentang C #. Saya pribadi tidak pernah melihat tag.
Pithikos
Untuk struktur repositori .Net, lihat gist.github.com/davidfowl/ed7564297c61fe9ab814
Michael Freidgeim
2
Seperti biasa, banyak pertanyaan bagus ditutup karena alasan XYZ. Kami mungkin punya banyak jawaban bagus lainnya.
Mohammed Noureldin

Jawaban:

107

Ketika mendesain proyek dan meletakkan arsitektur saya mulai dari dua arah. Pertama saya melihat proyek yang sedang dirancang dan menentukan masalah bisnis apa yang perlu diselesaikan. Saya melihat orang-orang yang akan menggunakannya dan mulai dengan desain UI kasar. Pada titik ini saya mengabaikan data dan hanya melihat apa yang diminta pengguna dan siapa yang akan menggunakannya.

Setelah saya memiliki pemahaman dasar tentang apa yang mereka minta, saya menentukan apa data inti yang akan mereka manipulasi dan memulai tata letak basis data dasar untuk data itu. Lalu saya mulai mengajukan pertanyaan untuk mendefinisikan aturan bisnis yang mengelilingi data.

Dengan memulai dari kedua ujungnya secara mandiri, saya dapat membuat proyek dengan cara yang menggabungkan kedua ujungnya menjadi satu. Saya selalu mencoba untuk menjaga desain terpisah selama mungkin sebelum menyatukannya, tetapi ingat persyaratan masing-masing saat saya bergerak maju.

Setelah saya memiliki pemahaman yang baik tentang setiap akhir masalah, saya mulai menjabarkan struktur proyek yang akan dibuat untuk menyelesaikan masalah.

Setelah tata letak dasar dari solusi proyek dibuat, saya melihat fungsionalitas proyek dan mengatur set dasar ruang nama yang digunakan tergantung pada jenis pekerjaan yang dilakukan. Ini mungkin hal-hal seperti Akun, Keranjang Belanja, Survei, dll.

Berikut adalah tata letak solusi dasar yang selalu saya mulai. Ketika proyek didefinisikan dengan lebih baik, saya memperbaikinya untuk memenuhi kebutuhan spesifik setiap proyek. Beberapa area dapat digabung dengan yang lain dan saya dapat menambahkan beberapa yang khusus sesuai kebutuhan.

Nama Solusi

.ProjectNameDocuments
    For large projects there are certain documents that need to be kept with
    it. For this I actually create a separate project or folder within the 
    solution to hold them.
.ProjectNameUnitTest
    Unit testing always depends on the project - sometimes it is just really 
    basic to catch edge cases and sometimes it is set up for full code 
    coverage.  I have recently added graphical unit testing to the arsenal.
.ProjectNameInstaller
    Some projects have specific installation requirements that need to be 
    handled at a project level.
.ProjectNameClassLibrary
    If there is a need for web services, APIs, DLLs or such.
.ProjectNameScripts (**Added 2/29/2012**)
    I am adding this because I just found a need for one in my current project.  
    This project holds the following types of scripts: SQL (Tables, procs, 
    views), SQL Data update scripts, VBScripts, etc.
.ProjectName
    .DataRepository 
        Contains base data classes and database communication.  Sometimes 
        also hold a directory that contains any SQL procs or other specific 
        code.  
    .DataClasses
        Contains the base classes, structs, and enums that are used in the 
        project.  These may be related to but not necessarily be connected
        to the ones in the data repository.
    .Services 
        Performs all CRUD actions with the Data, done in a way that the 
        repository can be changed out with no need to rewrite any higher 
        level code.
    .Business
        Performs any data calculations or business level data validation,
        does most interaction with the Service layer.
    .Helpers
        I always create a code module that contains helper classes.  These 
        may be extensions on system items, standard validation tools, 
        regular expressions or custom-built items.  
    .UserInterface
        The user interface is built to display and manipulate the data.  
        UI Forms always get organized by functional unit namespace with 
        additional folders for shared forms and custom controls.
Amy Patterson
sumber
Jawaban terbaik sejauh ini!
Nikmati hadiahnya, jawaban Anda sangat membantu saya.
3
@Aku semuanya proyek? Atau hanya item tingkat atas? Saya cukup baru untuk. Net dan mengalami kesulitan memutuskan apakah sesuatu harus menjadi proyek atau sub-folder proyek.
Carson Myers
1
@Carson Myers masing-masing item tingkat atas adalah proyek, item tingkat kedua adalah folder dalam suatu proyek. Beberapa item tingkat atas adalah proyek yang dikompilasi menjadi dll yang dirujuk oleh proyek lain sesuai kebutuhan.
Amy Patterson
3
@Amy Saya sangat menyukai jawaban Anda, penjelasan yang sangat rinci. Tetapi saya telah melihat dalam beberapa contoh orang membagi DataRepository, DataClasses, Layanan, Bisnis, dll menjadi proyek yang berbeda, bukan folder yang berbeda dalam proyek yang sama. Apa yang akan Anda katakan tentang ini? Apa kelebihan / kekurangan antara kedua opsi tersebut? Terima kasih!
emzero
66

Saya suka membagi proyek saya menjadi beberapa layer

Dengan begitu, lebih mudah untuk mengelola dependensi siklik. Saya dapat menjamin bahwa tidak ada proyek yang mengimpor proyek View (layer) secara tidak sengaja, misalnya. Saya juga cenderung memecah lapisan saya di sub-lapisan. Jadi semua solusi saya memiliki daftar proyek seperti ini:

  • Product.Core
  • Model produk
  • Product.Presenter
  • Product.Persistensi
  • Product.UI
  • Product.Validation
  • Product.Laporan
  • Produk

Mereka adalah "blok bangunan" aplikasi saya yang lebih besar. Kemudian di dalam setiap proyek saya mengatur ruang nama secara lebih logis tetapi sangat bervariasi. Untuk UI saat membuat banyak bentuk, saya mencoba berpikir dalam divisi spasial dan kemudian membuat ruang nama untuk setiap "ruang". Katakanlah ada sekelompok preferensi pengguna yang dikontrol pengguna dan formulir, saya akan memiliki namespace yang disebut UserPreferences untuk mereka, dan seterusnya.

Alex
sumber
Bagaimana dengan: Produk - Inti - Model - Presenter - Kegigihan - UI - Validasi - Laporan - Web
Daniel Fisher lennybacon
Saya merasa itu Corecukup berbahaya, karena mengarah ke desain kode monolitik, di mana sebagian besar logika masuk atau tidak Core. Misalnya: Logika yang tidak terdengar seperti Model, Presenter, Kegigihan, UI, Validasi, Laporan, Web, secara alami akan dilempar ke Core.
Yeo
@Yeo Ini dapat memainkan kedua sisi, baik dengan memutar Coreproyek Anda menjadi sampah monolitik atau dengan menyelamatkan Anda dari solusi yang berisi ratusan proyek. Adalah tanggung jawab pengembang untuk mengambil keputusan itu, tidak ada struktur proyek yang dapat menyelamatkan pembuat kode jahat dari melakukan hal-hal buruk.
Alex
1
@Prokurors ya, biasanya di dalam Product.Core adalah tempat saya meletakkan "inti" logika bisnis sistem. "Logika bisnis ui" harus masuk dalam Product.Presenter. Misalnya, jika sistem Anda memutuskan bahwa sebuah tombol harus dinonaktifkan ketika data tertentu dimuat, itulah yang saya sebut "logika bisnis ui" dan saya akan memasukkannya ke dalam presenter. "Logika bisnis inti" adalah sesuatu yang berhubungan langsung dengan model inti Anda (atau model domain). Sistem pesan mungkin memutuskan jumlah maksimal karakter adalah 140 karakter, itu adalah logika yang menjadi inti bisnis Anda.
Alex
2
bagaimana produk berbeda dari UI atau Web?
dopatraman
19

Mengorganisir Proyek

Saya biasanya mencoba membagi proyek saya dengan namespace, seperti yang Anda katakan. Setiap tingkatan aplikasi, atau komponen adalah proyeknya sendiri. Ketika sampai pada bagaimana saya memutuskan bagaimana memecah solusi saya ke dalam proyek, saya fokus pada usabilitas dan ketergantungan dari proyek-proyek itu. Saya berpikir tentang bagaimana anggota lain dari tim saya akan menggunakan proyek, dan jika proyek lain yang kita buat di jalan mungkin mendapat manfaat dari menggunakan beberapa komponen sistem.

Sebagai contoh, kadang-kadang, hanya memiliki proyek ini, yang memiliki seluruh rangkaian kerangka kerja (email, logging, dll) sudah cukup:

MyCompany.Frameworks

Di waktu lain, saya mungkin ingin memecah kerangka menjadi beberapa bagian, sehingga mereka dapat diimpor secara individual:

MyCompany.Frameworks.Networking
MyCompany.Frameworks.Logging
MyCompany.Frameworks.SomeLOBFramework

Formulir Pengorganisasian

Mengorganisir Formulir di bawah proyek UI akan benar-benar berubah ketika proyek Anda diperluas.

  • Kecil - Folder Formulir sederhana dapat mencukupi untuk proyek yang sangat kecil. Kadang-kadang Anda bisa membuat struktur yang berlebihan seperti halnya Anda bisa menggunakan ruang nama dan membuat segalanya menjadi lebih rumit dari yang seharusnya.

  • Sedang hingga Besar - Di sini, saya biasanya mulai membagi formulir menjadi beberapa bidang fungsional. Jika saya memiliki satu bagian dari aplikasi saya yang memiliki 3 formulir untuk mengelola pengguna dan beberapa yang melacak permainan dan skor sepak bola, maka saya akan memiliki Formulir> area Pengguna dan formulir> area Permainan atau sesuatu seperti itu. Itu benar-benar tergantung pada sisa proyek, berapa banyak bentuk yang saya miliki sampai seberapa halus saya memecahnya.

Ingat, pada akhirnya, ruang nama dan folder ada di sana untuk membantu Anda mengatur dan menemukan sesuatu dengan lebih cepat.


Sungguh, itu tergantung pada tim Anda, proyek Anda, dan apa yang lebih mudah bagi Anda. Saya menyarankan bahwa secara umum, Anda membuat proyek terpisah untuk setiap lapisan / komponen sistem Anda, tetapi selalu ada pengecualian.

Untuk panduan tentang arsitektur sistem, lihat situs Pola dan Praktek Microsoft.

Ryan Hayes
sumber
12

Ketika saya menulis kode di .NET, ada kecenderungan yang jelas untuk memiliki kelompok fungsi yang terkait. Masing-masing mungkin memiliki beberapa sub-set yang sama. Saya suka membagi kelompok utama secara fisik - salah satunya per proyek VS. Saya kemudian lebih lanjut membagi secara logis menggunakan majelis. Mengikuti pola ini, salah satu proyek saya saat ini terlihat seperti ini:

  • Wadmt (solusi)
    • Wadmt.Common
    • Wadmt.Data
      • Wadmt.Data.MySql
      • Wadmt.Data.SqlServer
      • Wadmt.Data.Oracle
    • Wadmt.Domain
    • Wadmt.Layanan
    • Uji
      • Wadmt.Tests.Common
      • Wadmt.Tests.Domain
      • Wadmt.Tests.Services
      • Wadmt.Tests.Integration
    • WebWeb

Semoga bermanfaat bagi Anda. Tingkat pemisahan membuat saya perlu waktu untuk memikirkannya.

Grant Palin
sumber
4
Saya akan mengurangi "Wadmt". Biarkan Sistem file tetap kering. Itu sangat membantu ketika mengerjakan konsol ...
Daniel Fisher lennybacon
7

Ada baiknya memiliki rencana untuk mengatur solusi Anda, dan ada beberapa cara untuk melakukannya. Kami memiliki beberapa fungsionalitas yang dibagikan di beberapa proyek, yang juga memberikan konsistensi bagi pengguna kami. Organisasi proyek tergantung pada apa yang kita lakukan. Pada intinya kita akan memiliki:

Company (solution)
  Company.Common (shared library)
  Company.Project (Main application UI)
  Company.Project.UnitTests (Unit tests for all project modules)
  Company.Project.IntegrationTests (integration tests for all project modules)
  Company.Project.AutomationTests (tests that invoke the UI)

Dari sana itu sangat tergantung pada pengaturannya. Jika kita memiliki aplikasi klien dan ujung depan web (berguna untuk mengumpulkan hasil penggunaan di ruang kelas atau penelitian lainnya), kita memerlukan proyek yang memiliki kode yang umum dibagikan (yaitu objek data yang akan diserialisasi).

  Company.Project.Model (ORM and business logic layer)
  Company.Project.Webapp (Web frontend/web service layer)
  Company.Project.WebClient (client code for web services)

Sub proyek lain dapat ditambahkan jika perlu. Seperti yang saya katakan, itu sangat tergantung pada proyek. Beberapa proyek sangat sederhana, dan hanya membutuhkan elemen inti. Kami mencoba untuk melawan pemisahan proyek yang sewenang-wenang, jadi membaginya dengan lapisan benar-benar masuk akal. Lapisan didefinisikan oleh apa yang perlu dibagikan di seluruh proyek, solusi, atau apa yang perlu plugin / ekstensi.

Berin Loritsch
sumber
6

Sangat menarik bahwa begitu banyak orang tidak menganggap KERING di sini. Itu terjadi beberapa kali dalam hidup saya bahwa pengembang membuat struktur direktori yang tidak dapat membangun karena itu. Jauhkan nama proyek dari solusi dan direktori proyek!

Jadi inilah cara saya:

{drive}:\{customer}\{apps|libs|tools}\{project}
  - cer
  - res
  - src
   - Common
   - Data
   - UI
   - Logic
   - Logic._Tests  
Daniel Fisher lennybacon
sumber
Apa DRY? Singkatan untuk sesuatu?
Pithikos
1
@Pithikos Ini adalah akronim dari Don't Repeat Yourself
Pero P.
2
apa Logic? tidak bisakah ada logika di Commonfolder juga?
dopatraman
1
Saya menaruh barang resuable ke Common. Beberapa orang mungkin mengatakan Kerangka atau Inti juga ...
Daniel Fisher lennybacon
2

Ketika saya mendesain aplikasi saya, saya selalu melihatnya sebagai modul dengan beberapa dependensi di antara mereka. Ketika saya memiliki desain dalam pikiran, maka saya menggunakan strategi bottom-up untuk mengembangkannya. Saya mengembangkan setiap modul dan kemudian saya membuatnya bekerja bersama.

Nah, modul - modul itu adalah proyek di bawah solusi saya (biasanya perpustakaan kelas ). Setiap modul memiliki namespace yang berbeda dan desainnya sendiri (berisi kelas , dll).

Salah satu modul tersebut adalah GUI ( Graphical User Interface ).

Saya juga selalu menggunakan alat Kontrol Revisi untuk melacak perubahan di setiap proyek. Saya sarankan Git . Ini sumber terbuka, didistribusikan, dan gratis untuk digunakan.

Oscar Mederos
sumber
1

Setiap kali saya memulai proyek baru saya mendapatkan spesifikasi luas tentang apa yang seharusnya dilakukan. Memiliki masukan ini membantu saya dengan memberikan saya konteks, oleh karena itu saya terus maju dan memikirkan metode terbaik (atau paling tepat) untuk mencapai tujuan proyek. Pada titik ini saya mulai berpikir di mana pola desgin dapat membantu saya memberikan solusi yang dimaksud. Di sinilah saya mulai mengatur proyek, dengan mempertimbangkan pola desain yang akan saya adopsi untuk proyek tersebut.

Beberapa contoh:

  1. Jika proyek hanya merujuk pada pembuatan layar input data. Kemungkinan besar saya akan menggunakan pola MVC.
  2. Jika proyek akan digunakan sebagai UI tugas berat yang paling mendukung platform multipel, pola desgin MVVM menjadi bermanfaat.

Ingatlah bahwa masing-masing akan memaksa Anda untuk mengatur proyek Anda dengan cara tertentu.

Berikut ini beberapa bacaan untuk Anda:

Pola Desain Bersih .

Pola Desain .

Desain Berorientasi Objek .

Semoga ini membantu.

El Padrino
sumber