it-swarm.asia

Neden kısmi sınıflar kullanılmalı?

Anladığım kadarıyla, partial anahtar sözcüğü, bir sınıfın birkaç kaynak dosya arasında bölünmesine izin vermek dışında hiçbir şey yapmaz. Bunu kod organizasyonu dışında yapmak için herhangi bir neden var mı? Bunun için oluşturulan UI sınıflarında kullanıldığını gördüm.

Tam bir anahtar kelime oluşturmak için kötü bir neden gibi görünüyor. Bir sınıf birden fazla dosya gerektirecek kadar büyükse, muhtemelen çok fazla iş yapıyor demektir. Belki de başka bir programcının tamamlaması için bir sınıfı kısmen tanımlamak için kullanabileceğinizi düşündüm, ama soyut bir sınıf yapmak daha iyi olurdu.

72
Michael K

Sınıfın bir bölümünün bazı özel araçlar tarafından üretildiği her senaryoda çok kullanışlıdır, çünkü üretilen sınıfı devralmadan oluşturulan koda özel mantık eklemenize izin verir. Btw. aynı nedenden dolayı kısmi yöntemler de vardır.

Sadece UI ile ilgili değil, aynı zamanda Linq-To-Sql veya Entity Framework gibi diğer teknolojiler bunu oldukça yoğun bir şekilde kullanıyor.

113
Ladislav Mrnka

Söylediğiniz gibi, genellikle üretilen kodu ayırmak için kullanılır. Genellikle sınıfların/dosyaların boyutuyla ilgisi yoktur.

Oluşturulan kodları ayırmanın yararı bir stildir. Oluşturulan kod oldukça çirkin ve okunamayan olabilir ve birçok kodlama standardında (ve StyleCop kontrollerinde) başarısız olur, ancak sorun değil, hiç kimse onu okumak veya doğrudan korumak zorunda değildir. Yani, başka bir dosyada "saklarsanız", sınıfın geri kalanının standart olduğundan emin olmaya odaklanabilirsiniz, StyleCop denetimlerini geçer ve bu şekilde devam eder.

Kullandığım başka bir alan, bir sınıfın birden fazla arayüz uyguladığı yerdir, uygulamayı ayrı dosyalara ayırmak oldukça güzel olabilir, ancak bu daha fazla kişisel tercih meselesidir, daha önce herhangi bir kodlama standardının gerektirmediğini görmedim ( veya önleyin).

26
Steve

Çalıştığım geliştiricilerden biri, birkaç hafta önce, kontrolden çıkmış ve çok sayıda kamu yöntemine sahip olan büyük Tanrı sınıflarının yeniden düzenlenmesi için onlar için oldukça iyi bir kullanım için geldi: Sınıfı ayrı bir kısmi sınıfa ayırır, sınıfı, mevcut işlevselliği bozmadan sınıf olması gereken daha atomik birimlere ayırabilir, neyin ortak ve neyin olmadığını görmenize izin verebilirsiniz. Bu ilk aşama olarak kısmi parçaları kendi bağımsız sınıflarına ayırabilir ve kod tabanı boyunca uygulayabilirsiniz. Bunun güzel bir fikir olduğunu düşündüm.

Ancak, genel olarak sadece yeni kod yazarken makine tarafından oluşturulan sınıfları artırmak için kullanılması gerektiğini düşünüyorum.

19
user23157

Kısmenlerin mantıklı olduğu birkaç yararlı senaryo düşünebilirim, bunların çoğu kendimi projelerimde kullanıyorum:

  • Araç/IDE/Designer kodunu korumakta olduğunuz koddan ayırmak için. Windows form uygulamaları için tasarımcı tarafından oluşturulan kodu içeren Form.Designer.cs Dosyası buna iyi bir örnektir. Diğer birçok .NET biçiminde, projenizi oluştururken potansiyel olarak yeniden oluşturulabilen bazı araç tarafından oluşturulan kodlar bulunur ve bu nedenle tüm özel değişiklikleriniz kaydırılır. Ayırma, kodunuzu ve değişikliklerinizi bu tür otomatik değişikliklerden korumanıza yardımcı olur.

  • Uygulamada çok fazla kod içeren çoklu arayüzler uygularken. Bu gibi her adlandırma için ayrı bir kısmi dosya kullanma eğilimindedir: {Class}.{Interface}.cs. IDE {Class} 'Un hangi arayüzleri uyguladığını ve nasıl uyguladığını görmek benim için kolaydır.

  • Sınıfın bir veya daha fazla iç içe sınıf içermesi gerektiğinde, özellikle de ayrı bir dosyaya konacak yeterli kodla. Yukarıdaki kalıba sadık ve her iç içe sınıf için {Class}.{NestedClass}.cs Adlandırma kuralını kullanın. Benzer uygulama Virtlink'in cevabı ile zaten belirtilmiştir.

  • uzantı yöntemlerini tutacak static sınıfları yazdığımda. Genellikle benzer sınıflara veya arabirimlere aynı genişletme yöntemi mantığını sağlamak söz konusu olacaktır - örneğin genel ve genel olmayan koleksiyonlarda Reverse gibi. Tek bir sınıf veya arabirim için tüm genişletme yöntemlerini statik sınıfın ayrı bir kısmına koyardım. Örneğin, bir yerde IList arabirimi için tüm uzantı yöntemleri ve başka bir dosyada IList<T> İçin olan aynı yöntemler olurdu. Başka bir yaklaşım, this parametresi için olası tüm sınıflarla aynı yöntemi (aşırı yüklemelerinin tümü) aynı kısmi olarak koymak olacaktır - tüm Reverse uygulamalarını tek bir dosyada bulundurmak gibi. Bu, hangisinin kod hacmi açısından ayırmayı daha iyi haklı çıkaracağına veya sizin veya kuruluşunuzun bağlı olabileceği bazı iç kurallara bağlı olduğuna bağlıdır.

  • Bunu kullanmıyorum, ama burada tarif edeceğim yaklaşım gibi bazı C/C++ millet gördüm: sadece kısmi yöntemleri ile sınıf için bir kısmi oluşturun. Bu, arabirimleri tanımlamak ve yöntem bildirimini uygulamadan ayırmak için C/C++ yoluna benzer.

  • Tamamen mantıksal kaygılarla ayırma . Kendi içinde birden fazla mantıksal işlem kümesini birleştiren büyük bir sınıfla çalışıyorsanız, mantıksal olarak ilgili her kodu ayrı bir kısmi olarak ayırabilirsiniz. Genellikle bu tür sınıfların varlığı endişelerin ayrılması prensibine aykırıdır, ancak özellikle eski kod tabanları için sıklıkla gerçek hayattaki bir durum gözlenir. Diğer kullanıcı Steve Evers onlardan bu soruya cevabı , onlardan tanrı nesneleri adıyla bahsetmiştir. Şahsen kısmi sınıfların yaklaşımını, işimi kolaylaştırmak ve yeniden düzenlemeyi daha şeffaf hale getirmek için, bu kadar büyük dosyaların yeniden düzenlenmesi gerçekleşmeden önce kodu bölmek için kullanırım. Bu aynı zamanda SVN gibi sürüm oluşturma sistemleri söz konusu olduğunda potansiyel olarak karşılaşacağım çatışmaları da azaltacaktır.

19
Ivaylo Slavov

Kimsenin bahsettiğini görmedim: İç içe sınıfları kendi dosyalarına koymak için partial kullanıyorum.

Tüm kod dosyalarım yalnızca bir sınıf, yapı, arabirim veya numaralandırma içerir. Dosya adları aradığınız şeyin adını gösterdiğinde bir nesnenin tanımını bulmayı çok daha kolay hale getirir. Visual Studio proje klasörlerini ad alanlarıyla eşleştirmeye çalıştığından, dosya adlarının sınıflarla eşleşmesi gerekir.

Bu, NestedClass sınıfının içinde yer alan MyClass sınıfının projelerimde kendi dosyası olacağı anlamına gelir: MyClass.NestedClass.cs.

partial class MyClass
{
    private class NestedClass
    {
        // ...
    }
}
15

Oluşturulan kodu kullanma dışında, sadece onları tanrı nesneleri örtbas etmek için kullanılan gördüm. Yeni bir kod tabanını anlamaya çalışmak veya aynı nesne olan birden fazla kaynak dosyada gezinmek çok can sıkıcı bir durum.

Yani Why use partial classes? Cevap: oluşturulan kodu kullanmadıkça yapmayın.

10
Steven Evers

Kod organizasyonu tek nedendir, ancak ilk bakışta göründüğünden daha derine iner. Parçaların oluşturulduğu kısmi sınıflarınız varsa kolayca yapabilirsiniz:

  • Yazdığınız sınıflardaki manuel değişiklikleri algılamak zorunda kalmadan kodu yeniden oluşturun (böylece bu parçaların üzerine yazmazsınız).
  • Oluşturulan kısmi sınıfları test kapsamından, kaynak kontrolünden, metriklerden vb. Hariç tutun.
  • Oluşturulan kodu, kalıtım stratejinizi onun etrafında dayandırmaya zorlamadan kullanın (yine de diğer sınıflardan devralınabilirsiniz).
6
Deckard

Onlar için kirli bir kullanım düşünebilirim.

Ortak işlevsellik gerektiren bazı sınıflarınız olduğunu, ancak bu işlevselliği üstlerindeki miras zincirine enjekte etmek istemediğinizi varsayalım. Veya ortak bir yardımcı sınıf kullanan bir grup sınıfınız var.

Temelde birden fazla miras yapmak istiyorsunuz ama C # hiçbir likey. Yani yaptığınız şey aslında C/C++ 'da bir #include olanı yaratmak için kısmi kullanmak;

Tüm işlevleri bir sınıfa yerleştirin veya yardımcı sınıfı kullanın. Sonra yardımcıyı X kez kopyalayın ve kısmi sınıf A, B, C olarak yeniden adlandırın. ve A, B, C sınıflarınıza kısmi olarak koyun.

Feragatname: Evet, bu kötülük. Bunu asla yapma - özellikle de başkalarını sana kızdırırsa.

1
Mark

Oluşturulan/ima edilen sınıfların kısmi olarak ilan edildiği birkaç yer de vardır, bu nedenle Dev'in onları genişletmesi gerekiyorsa, her yerde devralma ve geçersiz kılma konusunda karışıklığa gerek kalmadan tam erişime sahip olurlar. Bir webforms sitesini ilk kez çalıştırdıktan sonra IIS altında bazı örnekleri yakalamayı denemek istiyorsanız) asp.net geçici alanında oluşturulan sınıflara bakın.

1
Bill