Tek bir .cs dosyasında birden fazla sınıf - iyi veya kötü? [kapalı]


30

Bir .cs dosyası içerisinde birden fazla sınıf oluşturmanız önerilir mi yoksa her .cs dosyasının ayrı bir sınıfı mı olmalı?

Örneğin:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

Bunun bir an için iyi mimarinin kötü bir örneği olduğu gerçeğini göz önüne alarak, .cs dosyasında tek bir sınıftan daha fazlasına sahip olmak, kod kokusu mu?

Yanıtlar:


30

Verdiğiniz örnek aslında benim görüşüme göre iyidir. İç sınıfları ilan ediyorsunuz , bu yüzden onları aynı dosyada tutmak kusursuz . Bunun etrafındaki tek yol, Itemssınıfınızı kısmi bir sınıf yapmak ve onu birden fazla dosyaya bölmektir. Bu kötü uygulamayı düşünürdüm. İç içe geçmiş sınıflar için genel politikam, küçük ve özel olmaları gerektiğidir. Bunun iki istisnası var:

  • Bir sınıf kümesi tasarlıyorsunuz (objektif-c'de daha yaygın), bu nedenle kısmi sınıf yaklaşımını kullanmak mantıklı olabilir.
  • yalnızca üst sınıfın genel API'si ile birlikte kullanılan bir enuma ihtiyacınız vardır. Bu durumda, ad alanımı kirletmek yerine üst sınıf içinde ilan edilmiş bir enum olmasını tercih ederim. Enum bir "iç enum" olmak etkili bir şekilde iyi tanımlanmış bir kapsam verilmesine neden olur.

Eğer soruyu biraz farklı söyler ve "Her ad alanı- düzey sınıfını kendi dosyasına yerleştirmeli miyim?" Diye sorarsanız cevabım "evet" olur.

Sınıfları tasarlarken, Tek Sorumluluk İlkesine saygı duyuyoruz. Şekli semantiklerini takip ederse kod okumak çok daha kolay hale gelir, bu nedenle dosyaları sınıfa bölmek mantıklıdır.

Mekanik açıdan, sınıf başına bir dosyaya sahip olmanın çeşitli avantajları vardır. Aynı anda birden fazla sınıfı farklı pencerelerde açabilirsiniz. Bu, özellikle ciddi bir geliştirici iki ekrandan daha az ekranla çalışmadığı için önemlidir. Daha bağlam bilgisine sahip olabilme ön kafamdan ben daha fazla bağlam tutmak anlamına gelir içinde kafamda. (Çoğu IDE aynı dosyayı iki kez açmanıza izin verir, ancak bunu garip buluyorum).

Bir sonraki önemli husus, kaynak kontrolü ve birleşmedir. Sınıflarınızı ayrı tutarak, aynı dosyada değişiklik yapıldığında çok fazla zorluk çekmezsiniz, çünkü ayrı sınıfların değiştirilmesi gerekir.


1
Katılıyorum, ama sonra yine iç sınıflar benim deneyimimde çok nadirdir. Adil olmak gerekirse, iç sınıfları gerçekten haklı çıkaracak pek bir şey yoktur, bildiğim tek örnek, numaralandırılabildiğiniz sürece gerçek sınıfla ilgili olamadığınız IEnumerable sınıflarıdır. Diğer tüm durumlarda, her sınıf kendi dosyasını almalıdır. Kaynak kontrol sorunları nedeniyle başka bir sebep yoksa.
Homde

2
İç sınıfların nadir bir istisna olması gerektiğini ve neredeyse hiç kamuya açık olmaması gerektiğini eklerdim.
Josh,

Yup bana bu kadar hızlı olduğumu öğretti, iç sınıflar gayet iyi, ancak iç sınıfları kullanıp kullanmamayı sormak başka bir sorudur :)
Krystan onur

11

Vahşice dürüst olmak gerekirse, lütfen bir dosyaya birden fazla kök sınıfı eklemeyin. Son işimde, sadece çoklu sınıflara sahip değil, aynı zamanda birden fazla ad alanına sahip dosyalar vardı ve bu da binlerce kod satırına uzanıyordu. Takip etmeye çalışmak çok zor.

Yakından ilgili olan sınıflar varsa, dosyalarını benzer şekilde adlandırın veya bir alt klasöre koyun.

Sınıf dosyalarının fiziksel olarak ayrılması, her şeyin sonu değil, dikkatlerin ayrılmasına ve daha gevşek bir bağlantıya neden olur.

Öte yandan, örneğiniz birden fazla kök sınıf göstermiyor. Birkaç iç içe sınıf vardır (not: iç içe sınıfları hiçbir şey yapmamaya çalışın ama privatebunu tasarlayabilirsiniz) ve bu tek bir dosyada olması gayet iyi .


3
Oh tanrım - kulağa korkunç geliyor.

Neden soruyorsun? Birisi sana oy verdi mi ve nedenini sormak istiyorsun?

Bekle ... son işim hakkında küçük bir fıkraya mi bakıyordun? Eğer öyleyse, yanlış anladım ve bunun için özür dilerim.
Jesse C. Dilimleyici

Tamamen katılıyorum. Çoğu dosyanın dosya başına en az 4 sınıfa sahip olduğu bir proje üzerinde çalışıyorum. Ve bazıları dosya başına 22 sınıfa kadar + 1 arayüze sahip.
L_7337

7

Eğer dosyalar oldukça uyumluysa, örneğin çok kısa, benzer şekilde adlandırılmış dosyalara sahip olmanın bir alternatifi olduğunda, o zaman iyi bir fikir olabilir.

Mesela Fluent NHibernate kullanırken, saklanırsam daha kolay olduğunu biliyorum. Entity ve EntityMapbenim araçlar bu konuda söylemek zorunda ne rağmen, tek bir dosyada.

Çoğu durumda, sadece sınıfları bulmayı zorlaştırır. Dikkatli ve dikkatli kullanın.


1
Özellikle Fluent NHibernate için onları sadece aynı dosyada değil aynı zamanda aynı sınıfta tutmayı da faydalı buldum. Varlıklarımın hepsinde Map adında iç içe geçmiş bir sınıf var.
James Beninger,

7

Basitçe evet, bunu yapmanın iyi bir formu olmadığını ve nedenini söyleyeyim, bir süre sonra çözümünüz büyük olduğunda sınıfların nerede olduğunu unutursunuz, dosya adı artık içeriğin ne olduğunu, dosya adının ne olduğunu temsil etmez AnimalPersonObject.cs bu mümkün değil.

Tabii ki, türlere atlamak için yeniden zıplayan gibi araçlardaki özellikleri kullanarak bu sorunu çözebilirsiniz, ancak dosya başına 1 sınıf (arayüzler dahil), sadece .net'te değil, java'da ve şimdiye kadar gördüğüm herhangi bir kod standardının bel kemiğidir. c ++ ve diğer birçok dilde, çoğu zaman bakım sorunları olmayanlar ve küçük geliştiricileri kodunu kavramakta zorlanırlar.

Neredeyse tüm kod optimizasyon araçları size sınıfları ayrı bir dosyaya taşımayı söyleyecektir, bu yüzden benim için evet bu bir kod kokusu ve onu etkisiz hale getirmek için biraz zorlama gerektiriyor :)


3

Başka bir konu, aynı dosyadaki çok büyük ve benzer sınıflarla - sınıf bildirimini her zaman göremediğiniz zaman - yanlış sınıfa sınır değerler koyup neden vurulmadıklarını düşünerek sona erebilir ... grrr! :)


-3

Temel olarak, bu sınıfı yalnızca "parent" sınıfı içinden (kapsam açısından) kullanmanız gerekiyorsa, genellikle yuvalanmış bir sınıf olarak tanımlamak için uygundur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.