Resharper, asp.net sayfası başına statik hale getirilebilecek birden fazla işlevi belirtmeyi sever. Onları statik hale getirirsem bana yardımcı olur mu? Onları statik hale getirmeli ve bir yardımcı sınıfa taşımalı mıyım?
Resharper, asp.net sayfası başına statik hale getirilebilecek birden fazla işlevi belirtmeyi sever. Onları statik hale getirirsem bana yardımcı olur mu? Onları statik hale getirmeli ve bir yardımcı sınıfa taşımalı mıyım?
Yanıtlar:
Statik yöntemlere karşı Örnek yöntemleri
10.2.5 C # Dil Spesifikasyonunun statik ve örnek üyeleri arasındaki farkı açıklar. Genel olarak, statik yöntemler örnek yöntemleri üzerinde çok küçük bir performans artışı sağlayabilir, ancak yalnızca aşırı durumlarda ( bu konu hakkında daha fazla ayrıntı için bu cevaba bakınız ).
FxCop veya Kod Analizindeki CA1822 kuralı şunları belirtir:
"[Üyeleri statik olarak işaretleme] 'den sonra, derleyici bu üyelere sanal olmayan çağrı siteleri yayar, bu da geçerli nesne işaretçisinin boş olmamasını sağlayan her çağrı için çalışma zamanında bir denetimi engeller. Bu, ölçülebilir bir performans kazancı ile sonuçlanabilir. Bazı durumlarda, geçerli nesne örneğine erişilememesi bir doğruluk sorununu temsil eder. "
Fayda Sınıfı
Tasarımınızda bir anlam ifade etmedikçe bunları bir fay sınıfına taşımamalısınız. Statik yöntem, belirli bir ToRadians(double degrees)
türle ilişkiliyse , tıpkı bir yöntem, açıları temsil eden bir sınıfla ilgili ise, bu yöntemin bu türün statik bir üyesi olarak var olması mantıklıdır (not, bu, gösterim amacıyla kıvrık bir örnektir).
Bence performans, ad alanı kirliliği vb. Kendinize neyin mantıklı olduğunu sorun. Yöntem mantıksal olarak türün bir örneğinde mi çalışıyor, yoksa türün kendisiyle mi ilgili? İkincisi ise, statik bir yöntem yapın. Bunu yalnızca kontrolünüz altında olmayan bir türle ilgiliyse bir yardımcı program sınıfına taşıyın.
Bazen bir örnek üzerinde mantıksal olarak hareket eden ancak henüz örnek durumundan herhangi birini kullanmayan yöntemler vardır . Örneğin, bir dosya sistemi oluşturuyorsanız ve bir dizin kavramına sahip olsaydınız, ancak bunu henüz uygulamadıysanız, dosya sistemi nesnesinin türünü döndüren bir özellik yazabilirsiniz ve her zaman sadece "file" - ancak mantıksal olarak örnekle ilişkilidir ve bu nedenle bir örnek yöntemi olmalıdır. Bu, yöntemi sanal yapmak istiyorsanız da önemlidir - özel uygulamanızın herhangi bir duruma ihtiyacı olmayabilir, ancak türetilmiş sınıflar gerekebilir. (Örneğin, bir koleksiyona salt okunur olup olmadığını sorma - henüz bu koleksiyonun salt okunur bir formunu uygulamamış olabilirsiniz, ancak açıkça türün değil, koleksiyonun bir özelliğidir.)
Bir yöntemi static
sınıf içinde işaretlemek , kodun gözden geçirilmesi sırasında bilinmesi yararlı olabilecek hiçbir örnek üyesi kullanmadığını açıkça gösterir.
Bu kadar yakından ilişkili, kavram açısından başka bir sınıf tarafından paylaşılmak istenmediği sürece, onu başka bir sınıfa taşımak zorunda değilsiniz.
Eminim bu senin durumda değil, ama bir "kötü koku" Ben bazı kodda gördüm ben bir sürü statik yöntemlerin bir heck kullanılan korunarak acı vardı.
Ne yazık ki, bunlar belirli bir uygulama durumunu kabul eden statik yöntemlerdir. (neden emin, uygulama başına sadece bir kullanıcı olacak! Kullanıcı sınıfı neden statik değişkenlerde bunu takip etmiyor?) Küresel değişkenlere erişmenin yüceltilmiş yollarıydı. Ayrıca neredeyse her zaman kötü bir fikir olan statik yapıcıları (!) Vardı. (Birkaç makul istisna olduğunu biliyorum).
Bununla birlikte, statik yöntemler, aslında nesnenin bir örneğinin durumuna bağlı olmayan etki alanı mantığını dışladığında oldukça kullanışlıdır. Kodunuzu çok daha okunabilir hale getirebilirler.
Onları doğru yere koyduğunuzdan emin olun. Statik yöntemler müdahaleci olarak diğer nesnelerin iç durumunu değiştiriyor mu? Davranışlarının bunun yerine bu sınıflardan birine ait olduğu iyi bir dava yapılabilir mi? Endişeleri doğru şekilde ayırmıyorsanız, daha sonra baş ağrısına girebilirsiniz.
Bu ilginç bir okuma:
http://thecuttingledge.com/?p=57
ReSharper aslında yönteminizi statik hale getirmenizi önermez. Kendinize, bu yöntemin imzasında görünen sınıflardan birinin aksine, neden bu sınıfta olduğunu sormalısınız ...
ancak yeniden düzenleyici belgesel şöyle diyor: http://confluence.jetbrains.net/display/ReSharper/Member+can+be+made+static
Sadece @Jason True'un cevabına eklemek için , bir yönteme 'statik' koymanın, yöntemin 'saf' olacağını garanti etmediğini fark etmek önemlidir. Bildirildiği sınıfa göre vatansız olacaktır, ancak durumu olan diğer 'statik' nesnelere (uygulama yapılandırması vb.) De erişebilir, bu her zaman kötü bir şey olmayabilir, ancak Ben şahsen statik yöntemleri tercih etme eğilimindeyim, eğer saflarsa, çevredeki durum hakkında endişelenmenize gerek kalmadan, onları tek tek test edebilir ve onlarla ilgili akıl yürütebilirsiniz.
Belirli bir senaryoda en okunabilir ve sezgisel olanı yapmalısınız.
Performans argümanı, en aşırı durumlar dışında iyi bir şey değildir, çünkü gerçekte olan tek şey, bir ekstra parametrenin ( this
) örneğin yöntemler için yığına doğru itilmesidir.
Bir sınıf içindeki karmaşık mantık için, örnek girişlerinin yöntem imzasında açıkça tanımlandığı ve hiçbir örnek yan etkisinin meydana gelmediği yalıtılmış mantık oluştururken yararlı özel statik yöntemler buldum. Tüm çıkışlar dönüş değeri veya çıkış / ref parametreleri aracılığıyla olmalıdır. Karmaşık mantığı yan etkisiz kod bloklarına ayırma , kodun okunabilirliğini ve geliştirme ekibinin buna olan güvenini artırabilir.
Öte yandan, fayda yöntemlerinin çoğalmasıyla kirlenen bir sınıfa yol açabilir. Her zaman olduğu gibi, mantıksal adlandırma, dokümantasyon ve takım kodlama sözleşmelerinin tutarlı bir şekilde uygulanması bunu hafifletebilir.
Bir yöntemi statik yapmak, ilk önce o sınıfın bir örneğini oluşturmadan yöntemi sınıfın dışından çağırabileceğiniz anlamına gelir. Bu, üçüncü taraf satıcı nesneleri veya eklentileriyle çalışırken faydalıdır. Con.Writeline () öğesini çağırmadan önce bir "con" Konsolu nesnesi oluşturmanız gerekip gerekmediğini düşünün;
İsim alanı kirliliğini kontrol etmeye yardımcı olur.
Class.a_core_function( .. )
vsa_core_function( .. )
Sadece benim tuppence: Tüm paylaşılan statik yöntemleri bir yardımcı program sınıfına eklemek,
using static className;
kodunuzu daha hızlı yazmanızı ve okumayı daha kolay hale getiren kullanım ifadelerinize ekleyin. Örneğin, devralınan bazı kodda "küresel değişkenler" olarak adlandırılacak çok sayıda var. Örnek sınıf olan bir sınıfta global değişkenler yapmak yerine, hepsini bir global sınıfın statik özellikleri olarak ayarladım. İşi, dağınık ise yapar ve ben zaten başvurulan statik ad alanı var çünkü özellikleri adıyla başvurabilirsiniz.
Bunun iyi bir uygulama olup olmadığı hakkında hiçbir fikrim yok. Ben sadece # Roselyn ipuçları bana rehberlik izin çalışıyorum C # 4/5 ve refactor için çok eski kod hakkında bilgi edinmek için var.
Joey
Umarım, statik ve örnek yöntemler arasındaki farkı zaten anlamışsınızdır. Ayrıca, uzun bir cevap ve kısa bir cevap da olabilir. Uzun cevaplar zaten başkaları tarafından verilmektedir.
Kısa cevabım: Evet, Resharper'ın önerdiği gibi bunları statik yöntemlere dönüştürebilirsiniz. Bunu yapmanın hiçbir zararı yoktur. Bunun yerine, yöntemi statik hale getirerek, aslında yöntemi koruyorsunuz, böylece gereksiz yere herhangi bir örnek üyesini bu yönteme kaydırmazsınız. Bu şekilde, " Sınıfların ve üyelerin erişilebilirliğini en aza indirin .
ReSharper, bir örnek yönteminin statik bir yönteme dönüştürülebileceğini öne sürdüğünde, aslında size "Neden .. bu yöntem, durumlarından hiçbirini kullanmadığı için bu sınıfta oturuyor?" Size düşünce için yiyecek verir. Daha sonra, bu yöntemi statik bir yardımcı sınıfa taşıma ihtiyacını anlayan sizsiniz. SOLID ilkelerine göre, bir sınıfın sadece bir temel sorumluluğu olmalıdır. Böylece, sınıflarınızı daha iyi bir şekilde temizleyebilirsiniz. Bazen, örnek sınıfınızda bile bazı yardımcı yöntemlere ihtiyacınız olabilir. Bu durumda, bunları #region yardımcısı içinde tutabilirsiniz.