Praktik yang baik untuk Solusi Visual Studio [ditutup]


10

Semoga pertanyaan sederhana relativitas. Saya mulai mengerjakan proyek internal baru untuk membuat traktabilitas perangkat yang diperbaiki di dalam gedung.

Basis data disimpan dari jarak jauh di server web, dan akan diakses melalui API web (output JSON) dan dilindungi dengan OAuth. GUI ujung depan sedang dilakukan dalam WPF, dan kode bisnis dalam C #.

Dari sini, saya melihat berbagai lapisan Presentasi / Aplikasi / Datastore. Akan ada kode untuk mengelola semua panggilan terotentikasi ke API, kelas untuk mewakili entitas (objek bisnis), kelas untuk membangun entitas (objek bisnis), bagian untuk WPF GUI, bagian dari model tampilan WPF, dan sebagainya.

Apakah yang terbaik untuk membuat ini dalam satu proyek, atau membaginya menjadi proyek individu?

Dalam hati saya mengatakan itu harus beberapa proyek. Saya telah melakukan keduanya dengan cara sebelumnya, dan menemukan pengujian menjadi lebih mudah dengan solusi proyek tunggal, namun dengan beberapa proyek maka dependensi rekursif dapat muncul. Terutama ketika kelas memiliki antarmuka untuk membuatnya lebih mudah untuk diuji, saya telah menemukan banyak hal menjadi canggung.


1
Saya akan memisahkan mereka menjadi apa yang masuk akal untuk proyek ini.
Ramhound

Apakah ada orang lain yang punya pemikiran, satu proyek untuk memegang antarmuka seperti yang disarankan MattDavey. Saya menggunakan pendekatan ini sebelumnya untuk menghindari ketergantungan yang disebutkan. Atau haruskah antarmuka untuk kelas x, duduk di proyek yang sama dengan kelas x.
JonWillis

Juga, lapisan apa yang Anda semua gunakan. Saya telah melihat beberapa varietas yang berbeda walaupun yang utama adalah Presentasi / Aplikasi / Infrastruktur. Beberapa juga membagi aplikasi menjadi 2 bagian, aplikasi + layanan. Beberapa model juga menyebutkan lapisan khusus untuk logika bisnis, yang bagi saya dapat dimasukkan dalam objek bisnis itu sendiri.
JonWillis

Jawaban:


8

Itu tergantung pada ukuran proyek

Inilah pedoman yang cenderung saya gunakan

  • Sebuah proyek kecil, dengan beberapa halaman atau kurang, saya hampir selalu menyimpan satu proyek.

  • Jika lapisan Akses Data proyek kecil itu besar atau kompleks, saya mungkin memisahkannya ke dalam lapisannya sendiri, tetapi selain itu ia hanya duduk di foldernya sendiri.

  • Jika proyek lebih besar, saya hampir selalu memiliki proyek terpisah untuk DAL, dan pemisahan lebih lanjut tergantung pada di mana batas-batas antara fungsi aplikasi berada.

  • Jika aplikasi memiliki beberapa tujuan, masing-masing dengan pandangan itu sendiri, viewmodels, dll, maka saya biasanya akan memisahkan masing-masing bagian ke daerah itu sendiri. Jika setiap bagian kecil, saya memisahkannya dengan Folder. Jika setiap bagian besar, saya akan memisahkannya dengan sebuah proyek.

  • Jika saya memiliki beberapa proyek yang perlu referensi set yang sama objek ( ViewModelBase, RelayCommand, dll), saya akan membuat sebuah proyek hanya untuk objek infrastruktur bersama.

  • Jika saya memiliki sejumlah besar gaya / templat / sumber daya bersama, saya akan membuat proyek hanya untuk itu.

Sebagai catatan, saya membuat kesalahan dengan proyek WPF besar pertama saya dan memisahkan mereka dengan menempatkan Model dalam satu proyek, Views di proyek lain, dan ViewModels di proyek ketiga. Saya dapat memberitahu Anda sekarang bahwa itu bukan cara yang tepat, karena pemeliharaan menjadi mimpi buruk :)


Penasaran, masalah pemeliharaan apa yang Anda miliki dengan memisahkan lapisan?
Ian

@ Rachel, saya akan menggunakan WPF. Jadi akan tertarik untuk mengetahui bagaimana Anda mengatur proyek pada saat itu. Saya pikir saya dapat mengingat proyek MVC kecil menjadi sakit ketika memisahkan 3 bagian menjadi 3 dll. Untuk WPF, My view akan menjadi GUI, entitas / objek bisnis yang akan diubah, dan ViewModel interaksi di antara mereka. ViewModel akan berurusan dengan logika memanggil repositori untuk memuat / menyimpan perbaikan (yang pada gilirannya memiliki pabrik / web apis, dll).
JonWillis

1
@Ian Masalah terbesarnya adalah sebagian besar perubahan kecil, seperti menambahkan satu bidang, mengharuskan saya untuk memburu Model, View, ViewModel, dan DAL di 4 perpustakaan terpisah. Proyek yang saya kerjakan saat itu cukup besar, dan saya menghabiskan lebih banyak waktu daripada mencari file tertentu. Sejak itu saya sudah berubah ke menjaga obyek terkait bersama-sama, jadi misalnya apa Pencarian Terkait seperti SearchView, SearchViewModel, dan SearchResultModelsemua akan dikelompokkan bersama dalam sebuah folder dan saya telah menemukan itu membuat aplikasi lebih mudah untuk mempertahankan.
Rachel

@Ian saya juga ingat memiliki masalah ketergantungan dan berlari ke referensi melingkar, karena meskipun upaya terbaik saya beberapa lapisan perlu referensi yang lain, tapi lapisan itu merujuk mereka, jadi saya punya beberapa solusi buruk sampai saya refactored
Rachel

1
@ JonWillis Sebagian besar proyek WPF saya rusak berdasarkan poin yang ditentukan dalam jawaban saya. Biasanya DAL adalah lapisannya sendiri, dan setiap Modul, atau Bagian dari proyek dikelompokkan bersama (baik dalam folder itu sendiri, namespace, atau proyek tergantung pada ukuran proyek). Jadi misalnya, semua Objek Pencarian akan bersama-sama, termasuk Interfaceuntuk lapisan data, tetapi lapisan akses data aktual untuk Pencarian akan berada di perpustakaan DAL. Cukup sering saya memiliki Infrastructureatau Commonpustaka yang berisi kelas dasar umum, antarmuka, dan kelas pembantu.
Rachel

14

Saya telah melihat hasil terbaik dengan satu proyek per lapisan, ditambah proyek pengujian per lapisan. Saya telah melihat beberapa aplikasi yang tidak dapat diselesaikan dalam 10 atau lebih sedikit proyek dalam solusi, di mana solusinya mencakup segalanya .

Jangan terjebak dalam menggunakan proyek di mana Anda benar-benar ingin penamaan nama. Banyak proyek tidak menambahkan apa-apa selain biaya overhead tanpa keuntungan.


9

IMHO terpisah hampir selalu lebih baik. Saya hampir selalu memisahkan lapisan data saya kecuali proyek ini 100% sepele. Alasannya adalah karena lapisan data cenderung paling sering dilewatkan. Jarang Anda menghubungkan GUI ke beberapa lapisan data dan mengharapkannya berfungsi dengan baik. Skenario yang jauh lebih umum adalah bahwa Anda memiliki lapisan data tunggal, dan Anda ingin didistribusikan di beberapa GUI (ASP.Net, WPF, dan aplikasi Silverlight misalnya). Sungguh luar biasa ketika Anda bisa membangun proyek layer data dan meletakkan dll itu sebagai referensi di GUI berikutnya yang Anda buat.


+1 Ketika saya memulai proyek baru, saya cukup sering membangun lapisan data simulasi yang menyimpan data dalam memori. Memungkinkan saya melanjutkan membangun aplikasi terlebih dahulu. Lalu saya bisa menukar dengan lapisan akses data "nyata" nanti ..
MattDavey

Apakah Anda mempertimbangkan entitas (DTO), pabrik, dan kelas yang digunakan untuk berkomunikasi dengan server web semua bagian dari lapisan data?
JonWillis

@ JonWillis - Tidak, mungkin tidak semuanya. Saya akan menempatkan pabrik dan kelas untuk server web dalam ruang nama proyek perpustakaan kelas. Lapisan data khas saya hanya berisi file dbml dan / atau file edmx yang diperlukan. Sebagai aturan, bagaimanapun, saya memberikan "perpustakaan / kerangka kerja" proyek mereka sendiri. Mereka jelas tidak perlu terlibat dengan proyek GUI, meskipun saya melihat orang melakukan itu sepanjang waktu.
Morgan Herlocker

Namun secara realistis, berapa lama waktu yang Anda butuhkan untuk mengambil beberapa ruang nama, dan menaburkannya ke proyek baru. Saya merasa ini pekerjaan refactoring yang cukup mudah.
Didier A.

4

Bagi saya, 4 * adalah angka ajaib. Satu proyek untuk setiap lapisan, dan satu proyek yang mendefinisikan semua antarmuka / DTO yang diperlukan untuk berkomunikasi di antara mereka.

* 7 jika Anda menghitung unit test


2

Saya selalu menggunakan solusi tunggal jika saya bekerja pada lapisan-lapisan yang berbeda, atau jika ada ikatan erat dengan mereka. Saya ingin menekan F5 dan minta semua proyek dibangun kembali jika diperlukan. Saya tidak berpikir ada cara yang "benar" untuk melakukannya.


2

Selera pribadinya, yang paling penting adalah konsisten . Saya pribadi memiliki proyek terpisah untuk setiap lapisan aplikasi sehingga pemisahannya jelas.


Lapisan mana yang Anda pisahkan? Apakah Anda memiliki lapisan Aplikasi / Layanan yang terpisah, dan jika demikian bagaimana perbedaannya. Apakah logika bisnis Anda terkandung dalam aplikasi / layanan, atau apakah mereka metode pada objek bisnis yang sebenarnya?
JonWillis

1

Peningkatan jumlah proyek berkaitan dengan mengaktifkan pengujian unit dan menyederhanakan grafik ketergantungan ke titik di mana segala sesuatunya tidak begitu rumit sehingga perubahan dalam satu bagian aplikasi memecah hal-hal di bagian aplikasi yang tampaknya tidak terkait.

Itu berhasil ketika saya melakukan semacam invensi ketergantungan, untuk menempatkan semua "kontrak", antarmuka, kelas abstrak, objek transfer data ke dalam satu unit. Di majelis lain saya meletakkan apa pun yang berbicara ke database. Tes unit mendapatkan perakitan mereka sendiri. Jika UI secara fundamental tidak dapat diuji coba (mis. ASP.NET winforms), maka ada manfaat yang signifikan untuk memisahkan UI menjadi kode yang dapat diuji dan kode yang tidak dapat diuji - masing-masing merupakan rakitan. Kadang-kadang beberapa kode mulai muncul yang tidak ada hubungannya dengan database, UI atau apa pun yang saya sebutkan sejauh ini - itu kode yang saya semacam berharap ada dalam kerangka NET. Kode itu saya akan dimasukkan ke dalam rakitan utilitas, atau setidaknya memasukkannya ke dalam apa pun rakitan root (mungkin yang dengan antarmuka.

Jika semua majelis merujuk semua majelis, atau hampir jadi, maka mereka harus digabung kembali menjadi satu majelis. Jika Anda atau orang-orang di tim Anda kurang disiplin untuk menjaga agar tidak menempatkan kode tingkat data di UI dan UI di tingkat data, maka sederhanakan semuanya dengan menggabungkan semuanya kembali menjadi satu lapisan.

Beberapa edisi Visual Studio mengalami masalah kinerja di sekitar 15 majelis, kadang-kadang tergantung pada jenis proyek apa yang ada. Meskipun demikian, membongkar file proyek secara strategis terkadang dapat membantu.


Saya satu-satunya pengembang di perusahaan, saat ini. Dan juga baru lulus dari universitas, jadi cobalah menanamkan praktik yang baik, pada proyek yang lebih besar sesegera mungkin. Saya tertarik membuatnya dapat dipelihara karena spesifikasi sistem telah berubah banyak sebelum saya bahkan mulai mendokumentasikannya, melawan permintaan menginginkan sistem secepatnya. Menurut pendapat Anda, apakah perakitan yang hanya berisi antarmuka akan menjadi solusi yang cocok? Dengan cara itu ketergantungan seharusnya hanya pada antarmuka dan kelas pabrik.
JonWillis

1
Iya. Lebih baik untuk memahami motivasi pemisahan majelis, tetapi jika Anda (atau anggota tim Anda) tidak mengatasinya, itu masih merupakan manuver yang murah. Jadi, bahkan jika Anda berakhir dengan semua majelis bergantung pada semua majelis dan tidak ada harapan pengujian unit, memindahkan hal-hal yang berperilaku seperti kontrak (antarmuka, kelas abstrak) ke majelis mereka sendiri, merupakan langkah ke arah yang benar, dan memiliki beberapa kelemahan.
MatthewMartin

-2

Satu-satunya alasan bagus untuk memiliki lebih dari satu proyek, adalah jika Anda perlu berbagi sekumpulan kelas dan file di beberapa aplikasi.

Jika proyek hanya digunakan oleh satu aplikasi, mereka seharusnya tidak dibuat di tempat pertama. Gunakan ruang nama saja. Menghemat masalah referensi melingkar, overhead dll, dan kebingungan proyek saat mencari file.

Baca artikel ini untuk penjelasan yang lebih dalam mengapa hal itu terjadi: http://lostechies.com/chadmyers/2008/07/16/project-anti-pattern-many-projects-in-a-visual-studio- solusi-file /

Dan seperti yang dinyatakan dalam artikel ini, saya akan menyambut siapa pun yang memiliki alasan yang sah untuk memiliki beberapa proyek selain dari berbagi kode di seluruh aplikasi untuk memberi tahu saya apa itu, karena saya ragu ada.


Argumen Konter pada downvote akan dihargai.
Didier A.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.