it-swarm-id.com

Beberapa kelas dalam satu file .cs - baik atau buruk?

Apakah disarankan untuk membuat beberapa kelas dalam file .cs atau haruskah setiap file .cs memiliki kelas tersendiri?

Sebagai contoh:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

Menghindari fakta selama satu menit bahwa ini adalah contoh buruk dari arsitektur yang baik, apakah memiliki lebih dari satu kelas dalam file .cs mengajukan bau kode?

29
Sergio

Contoh yang Anda berikan sebenarnya baik-baik saja menurut saya. Anda mendeklarasikan kelas dalam, jadi sangat masuk akal untuk menyimpannya di file yang sama. Satu-satunya cara untuk mengatasi hal ini adalah membuat kelas Items Anda menjadi kelas parsial dan membaginya menjadi beberapa file. Saya akan mempertimbangkan praktik buruk ini. Kebijakan umum saya untuk kelas bersarang adalah mereka harus berukuran kecil dan pribadi. Ada dua pengecualian untuk ini:

  • anda mendesain kluster kelas (lebih umum di objektif-c), sehingga mungkin masuk akal untuk menggunakan pendekatan kelas parsial
  • anda memerlukan enum yang hanya digunakan dengan API publik dari kelas induk. Dalam hal ini saya lebih suka mengumumkan enum publik di dalam kelas induk daripada mencemari namespace saya. Enum yang menjadi "enum dalam" secara efektif menghasilkan ruang lingkup yang didefinisikan dengan baik.

Jika Anda Word pertanyaannya sedikit berbeda dan bertanya tentang "Haruskah saya menempatkan masing-masing namespace - kelas level ke dalam file sendiri" maka jawaban saya adalah "ya ".

Ketika mendesain kelas kita menghormati Prinsip Tanggung Jawab Tunggal. Membaca kode menjadi jauh lebih mudah jika bentuknya mengikuti semantiknya, maka pemisahan file berdasarkan kelas masuk akal.

Dari sudut pandang mekanik, memiliki file per kelas memiliki beberapa keunggulan. Anda dapat membuka banyak kelas secara bersamaan di jendela yang berbeda. Ini sangat penting karena tidak ada pengembang serius yang bekerja dengan kurang dari dua layar. Mampu memiliki lebih banyak konteks di depan di kepala saya berarti saya dapat menyimpan lebih banyak konteks di kepalaku. (Sebagian besar IDE akan memungkinkan Anda untuk membuka file yang sama dua kali, tetapi saya menemukan ini aneh).

Aspek penting berikutnya adalah kontrol sumber dan penggabungan. Dengan menjaga kelas Anda terpisah, Anda menghindari banyak kerumitan ketika perubahan ke file yang sama dibuat karena kelas yang terpisah perlu diubah.

30
Johannes Rudolph

Jujur saja, tolong jangan tambahkan lebih dari satu kelas root ke file. Di pekerjaan terakhir saya, ada file dengan tidak hanya beberapa kelas, tetapi beberapa ruang nama dan ini membentang ke ribuan baris kode. Sangat sulit untuk diikuti.

Jika ada kelas yang terkait erat, maka beri nama file mereka sama atau menempatkannya dalam subfolder.

Pemisahan fisik file kelas membantu (perhatikan, bukan yang terakhir semua) menimbulkan pemisahan keprihatinan dan penggabungan yang lebih longgar.

Di sisi lain, contoh Anda tidak menampilkan lebih dari satu kelas root. Ada beberapa kelas bertingkat (catatan: cobalah untuk tidak membuat kelas bertingkat selain private jika Anda dapat mendesain ini) dan ini sangat bagus untuk dimiliki dalam satu file.

11
Jesse C. Slicer

Sederhananya ya, itu bentuk yang tidak baik untuk melakukan ini dan saya akan memberitahu Anda mengapa, sedikit kemudian ketika solusi Anda menjadi besar Anda akan lupa di mana kelas-kelas sebagai nama file tidak akan lagi mewakili apa isinya, whats the filename AnimalPersonObject.cs itu tidak layak.

Tentu Anda dapat menyiasatinya dengan menggunakan fitur-fitur pada alat-alat seperti resharper untuk melompat ke tipe, tetapi 1 kelas per file (termasuk antarmuka) benar-benar merupakan tulang punggung dari standar kode apa pun yang pernah saya lihat, tidak hanya di .net tetapi juga dalam Java dan c ++ dan banyak bahasa lain, yang tidak sering mengalami masalah pemeliharaan dan Anda akan menemukan devs junior kesulitan memahami kode.

Hampir semua alat pengoptimalan kode akan memberitahu Anda untuk memindahkan kelas ke file terpisah, jadi bagi saya ya ini adalah bau kode dan perlu beberapa alasan untuk menetralkannya :)

7
krystan honour

Jika file sangat kohesif, misalnya di mana itu merupakan alternatif untuk memiliki beberapa file yang sangat pendek, dengan nama yang sama, maka itu bisa menjadi ide yang baik.

Sebagai contoh, saya menemukan bahwa ketika menggunakan Fluent NHibernate lebih mudah jika saya menyimpan Entity dan EntityMap dalam satu file, terlepas dari apa yang mungkin dikatakan alat saya tentang hal itu.

Dalam kebanyakan kasus, itu hanya membuat kelas lebih sulit ditemukan. Gunakan hemat dan dengan hati-hati.

7
mootinator

Masalah lain adalah bahwa dengan kelas yang sangat besar dan serupa di file yang sama - ketika Anda tidak bisa lihat deklarasi kelas setiap saat - Anda mungkin akhirnya menempatkan breakpoints di kelas yang salah dan bertanya-tanya mengapa mereka tidak tertabrak ... Grrr! :)

3
Julia Hayward