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

30

Apakah disarankan untuk membuat beberapa kelas dalam file .cs atau haruskah masing-masing file .cs memiliki kelas individu?

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?


sumber

Jawaban:

30

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 Itemskelas 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 klaster kelas (lebih umum di tujuan-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 "inner enum" secara efektif menghasilkan ruang lingkup yang didefinisikan dengan baik.

Jika Anda mengucapkan pertanyaan sedikit berbeda dan bertanya tentang "Haruskah saya menempatkan setiap kelas tingkat- namespace ke file sendiri" maka jawaban saya akan "ya".

Saat merancang kelas, kami menghormati Prinsip Tanggung Jawab Tunggal. Membaca kode menjadi jauh lebih mudah jika bentuknya mengikuti semantiknya, maka memecah file berdasarkan kelas adalah 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 kepala saya berarti saya dapat menyimpan lebih banyak konteks di kepala saya. (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.

Johannes Rudolph
sumber
1
Saya setuju, tetapi sekali lagi kelas batin sangat jarang dalam pengalaman saya. Agar adil, tidak ada yang benar-benar dapat membenarkan kelas dalam, satu-satunya kasus yang saya tahu adalah kelas IEnumerable di mana Anda tidak benar-benar tentang kelas yang sebenarnya selama Anda dapat menghitungnya. Dalam semua kasus lain, setiap kelas harus mendapatkan file sendiri. Jika tanpa alasan lain karena masalah kontrol sumber.
Homde
2
Saya akan menambahkan bahwa kelas-kelas dalam seharusnya merupakan perkecualian yang langka dan hampir tidak pernah harus umum.
Josh
Yup mengajari saya untuk menjadi begitu cepat melenceng, kelas batin baik-baik saja, namun menanyakan apakah Anda harus menggunakan innerclass adalah pertanyaan lain :)
krystan honor
11

Agar jujur, jangan menambahkan 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 di subfolder.

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

Di sisi lain, contoh Anda tidak menampilkan lebih dari satu kelas root. Ada beberapa kelas bersarang (catatan: cobalah untuk tidak membuat kelas bersarang apa pun tetapi privatejika Anda dapat mendesain ini) dan ini sangat baik untuk dimiliki dalam satu file.

Jesse C. Slicer
sumber
3
Ya Tuhan - kedengarannya mengerikan.
Kenapa kamu bertanya? Apakah ada seseorang yang menurunkan Anda dan Anda ingin bertanya mengapa?
Tunggu ... apakah Anda mengacu pada anekdot kecil tentang pekerjaan terakhir saya? Jika demikian, saya salah mengerti dan meminta maaf untuk itu.
Jesse C. Slicer
Setuju sepenuhnya. Saya sedang mengerjakan proyek di mana sebagian besar file memiliki setidaknya 4 kelas per file. Dan beberapa memiliki hingga 22 kelas + 1 antarmuka per file.
L_7337
7

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 Entitydan EntityMapdalam 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.

mootinator
sumber
1
Khusus untuk Fluent NHibernate, saya merasa berguna untuk menjaga mereka tidak hanya dalam file yang sama, tetapi juga kelas yang sama. Semua entitas saya memiliki kelas bersarang yang disebut Peta.
James Beninger
7

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, apa nama file 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 setiap standar kode yang pernah saya lihat, tidak hanya di .net tetapi juga di java dan c ++ dan banyak bahasa lain, yang tidak sering mengalami masalah pemeliharaan dan Anda akan menemukan para dev 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 :)

kehormatan krystan
sumber
3

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

Julia Hayward
sumber
-3

Pada dasarnya, jika Anda hanya perlu menggunakan kelas ini dari dalam kelas "induk" (dalam hal cakupan), maka biasanya tepat untuk mendefinisikannya sebagai kelas bersarang.

hjdjdg
sumber