C # 'da kullanılmayan yönergeleri kullanarak neden kaldırılsın?


120

Geliştiricilerin UsingsVisual Studio 2008'de " Kullanılmayanları Kaldır " özelliğini kullanmasının herhangi bir nedeni olup olmadığını merak ediyorum (kaynak kodunu düzeltmenin dışında) ?


Sanırım bu, Visual Studio'nun kendisinin değil, Visual Studio için PowerCommands'ın bir özelliğidir.
Hosam Aly

3
VS2008'de, kesinlikle VS'nin kendisinin bir özelliğidir (kullanım deyimlerini sıralama yeteneği ile birlikte).
Richard

1
@Hosam: PowerCommands, tüm proje / çözüm için bunu yapmanızı sağlar. Bunu dosya başına yapmak VS'nin kendisinin bir özelliğidir.
konfigüratör

3
BTW, bu tür bir temizleme üzerinde daha hassas kontrol istiyorsanız Yeniden Paylaşım'a bakın.
John Feminella

2
Aslında bu özellikten gerçekten hoşlanmıyorum - kendimi her zaman bir dosyayı düzenlerken buluyorum ve birileri temizledikten sonra tüm Sistem ad alanlarını yeniden eklemek zorunda kalıyorum (genellikle System, System.Collections.Generic ve System.Linq.) kurtardığından daha fazla sürtünme. Şimdi, çerçeve ad alanlarından ziyade kendi proje ad alanlarınız - bunları temizlemek, programınızın kablolamasını netleştirmek için daha mantıklı. VS'nin yalnızca belirli ad alanlarından içe aktarmaları temizlemesinin ve Sistemi daha sık ihtiyaç duyduklarınızı bırakmanın bir yolu olsaydı.
user1454265

Yanıtlar:


186

Onları çıkarmak istemeniz için birkaç neden var.

  • Bu anlamsız. Hiçbir değer katmazlar.
  • Kafa karıştırıcı. Bu ad alanından ne kullanılıyor?
  • Bunu yapmazsanız using, kodunuz zamanla değiştikçe aşamalı olarak anlamsız ifadeler biriktireceksiniz .
  • Statik analiz daha yavaştır.
  • Kod derlemesi daha yavaştır.

Öte yandan, onları içeride bırakmak için pek fazla neden yok. Sanırım kendinizi onları silme zahmetinden kurtarıyorsunuz. Ama o kadar tembelsen, daha büyük sorunların var!


59
İyi bir programcı tembeldir, YAPMAMASI gereken işi maksimize eder. : D
Nicolas Dorier

34
İyi bir programcının tembel olduğuna katılmıyorum, ancak ifadenizin düşüncesine katılıyorum. İyi bir programcı, kodunu temiz tutmak ve böylelikle kendisi ve başkaları için gelecekteki işlerden / sorunlardan / sorunlardan kaçınmak için bunları siler.
Allan

2
Doğru, bu harika bir bağlantı. Sanırım demek istediğim, "kötü tembel" yerine "iyi tembel" istediğimizdi; ikincisi, programcıların iyi kod yazmaktan rahatsız olmadıkları yerdir.
Allan

5
Standart ad alanlarını bırakmanın da faydası vardır. Büyük projelerde ve ekiplerde, onları daha az potansiyel birleştirme çatışması ve kod incelemesi için daha az dosyayla sonuçlarda bırakmak. Ek olarak, birçok geliştirici şeylere kafa karıştırıcı ve bulunması zor uzantı yöntemleri ekler ve bazen bu uzantı yöntemleri için gerekli ad alanlarını bulmak bir güçlüktür. Yeni geliştiriciler, kod dosyalarında bulunan System.Linq'e alışmış olabilir ve yardım istemeden önce belirli yöntemlerin neden mevcut olmadığını anlamaya çalışırken çok zaman harcayabilir.
Mark At Ramp51

5
Gelecekteki kodlamalarda zekanın cehennem kadar aptal olmasını önlemek için bazılarını saklamak isteyebilirsiniz.
yazanpro

24

Tam tersini söyleyebilirim - gereksiz, gereksiz ifadeleri kaldırmak son derece yararlıdır.

Kodunuza 3, 6, 9 ay içinde geri dönmeniz gerektiğini veya başka birinin kodunuzu devralması ve bakımını yapması gerektiğini hayal edin.

Gerçekten ihtiyaç duyulmayan uzun bir ifade kullanma listeniz varsa, koda bakmak oldukça kafa karıştırıcı olabilir. Bu ad alanında hiçbir şey kullanılmıyorsa, neden orada kullanılıyor?

Sanırım profesyonel bir ortamda uzun vadeli sürdürülebilirlik açısından, kodunuzu olabildiğince temiz tutmanızı şiddetle öneririm - ve buna gereksiz şeylerin atılmasını da içerir. Daha az dağınıklık, daha az kafa karışıklığı ve dolayısıyla daha yüksek sürdürülebilirlik demektir.

üzüm posası


14

Bu bana çok mantıklı bir soru gibi görünüyor ve yanıt veren insanlar tarafından oldukça küstahça ele alınan bir soru.

Kaynak kodundaki herhangi bir değişikliğin gerekçelendirilmesi gerektiğini söyleyebilirim. Bu değişikliklerin gizli maliyetleri olabilir ve soruyu soran kişinin bundan haberdar edilmesini istedi. Bir kişinin tahmin ettiği gibi "tembel" olarak adlandırılmak istemediler.

Resharper'ı yeni kullanmaya başladım ve sorumlu olduğum proje hakkında uyarılar ve stil ipuçları vermeye başlıyor. Bunların arasında fazlalık kullanım yönergesinin kaldırılması, ancak aynı zamanda fazlalık niteleyiciler, büyük harf kullanımı ve daha pek çoğu yer alır. İçgüdülerim kodu düzeltmek ve tüm ipuçlarını çözmek, ancak iş başım beni haksız değişikliklere karşı uyarıyor.

Otomatikleştirilmiş bir derleme süreci kullanıyoruz ve bu nedenle SVN depomuzdaki herhangi bir değişiklik, projelere / hatalara / sorunlara bağlayamadığımız değişiklikleri oluşturacak ve önceki sürümlerde hiçbir işlevsel değişiklik sağlamayan otomatikleştirilmiş derlemeleri ve sürümleri tetikleyecektir.

Gereksiz niteleyicilerin kaldırılmasına bakarsak, bu, Etki Alanı ve Veri katmanlarımız yalnızca niteleyiciler tarafından ayırt edildiğinden, geliştiricilerde kafa karışıklığına neden olabilir.

Anakronimlerin (yani ABCD -> Abcd) büyük harf kullanımının doğru kullanımına bakarsam, o zaman Resharper'ın bu referans sınıf adlarını kullandığımız Xml dosyalarının hiçbirini yeniden düzenlemediğini dikkate almalıyım.

Dolayısıyla, bu ipuçlarını takip etmek göründüğü kadar basit değildir ve saygılı davranılmalıdır.


6
İyi Nokta, ancak temiz ve karmaşık olmayan kod korumanın aynı zamanda bir iş hedefi olan sürdürülebilirliği artırdığını da unutmamalısınız. İkisine de ağırlık vermelisiniz. İdeal olarak, bu tür yeniden düzenlemeleri bir sürümden hemen sonra yapmak istersiniz, böylece yenisini başlatmak için olabildiğince temiz bir listeye sahip olabilir ve nihai gerilemeleri yakalamak için bolca zamanınız olur.
David Reis

14

Önceden verilen nedenlere ek olarak, gereksiz adlandırma çatışmalarını önler. Bu dosyayı düşünün:

using System.IO;
using System.Windows.Shapes;

namespace LicenseTester
{
    public static class Example
    {
        private static string temporaryPath = Path.GetTempFileName();
    }
}

Bu kod derlenmez çünkü hem System.IO hem de System.Windows.Shapes ad alanlarının her biri Path adında bir sınıf içerir. Tam sınıf yolunu kullanarak düzeltebiliriz,

        private static string temporaryPath = System.IO.Path.GetTempFileName();

veya basitçe satırı kaldırabiliriz using System.Windows.Shapes;.


13

Intellisense açılır penceresindeki daha az seçenek (özellikle ad alanları çok sayıda Uzantı yöntemi içeriyorsa).

Teorik olarak Intellisense de daha hızlı olmalıdır.


1
Intellisense için +1. Aslında başlangıçta yavaş (düzenli olarak "Önbellek oluştur, daha sonra tekrar dene" mesajını görüyorum), bu yüzden bu gerçekten önemli olabilir. Herkesin bahsettiği zamanı derleyin ... Henüz rakamları görmedim.
Luc

5

Onları kaldır. Bakılacak ve merak edilecek daha az kod, zamandan ve kafa karışıklığından tasarruf sağlar. Keşke daha çok insan ŞEYLERİ BASİT, DÜZGÜN ve DÜZGÜN TUTAR. Odanızda kirli gömlek ve pantolon olması gibi. Bu çirkin ve neden orada olduğunu merak etmelisin.


4

Ayrıca, kullanılmayan kullanımları kaldırdıktan sonra projenizden bazı dll / proje referanslarını da kaldırabileceğinizi varsayarak, yanlış döngüsel bağımlılıkları önlemeye yardımcı olur.


3

Kod daha hızlı derlenir.


5
Bunu destekleyecek herhangi bir kanıt var mı?
cjk

14
Oh CK - beni yine yakaladın. Yalan söyledim. Gereksiz metni kaldırmak kodun derlenmesini yavaşlatır. Bir düşünün :)
Ölü hesap

@ck: Kullanılmayan ifadeleri işteki bir projeden kaldırmanın derleme süresini dikkate değer bir miktarda iyileştirdiğini doğruladım. Tabii ki - sabit sürücüden okumak için daha az bayt.
konfigüratör

19
Bazı gerçek istatistikleri görmek güzel olurdu. Derleme sırasında sadece birkaç milisaniye tasarruf ediyorsak, hız zorlayıcı bir argüman değildir. Ancak, gereksiz ifadeleri kullanmanın başka nedenleri de vardır.
Greg

3
Yalan söylemek ya da söylememekle ilgili değil. Mantıklı her insan, daha az dağınıklığın daha fazla verimlilik anlamına geldiğini tahmin eder. Bunu destekleyecek "kanıt", yanıtınıza değer katmak ve "daha hızlı" ifadesinin yalnızca birkaç ms anlamına gelmediği, aslında projenizi daha hızlı derlemek için geliştirilmiş bir deneyim anlamına geldiği argümanını desteklemektir.
Matheus Felipe

3

Son zamanlarda, kullanılmayan ithalatları silmenin oldukça yararlı ve önemli olmasının başka bir nedeni var.

Birinin diğerine başvurduğu iki derlemeniz olduğunu hayal edin (şimdilik ilkini Ave başvurulanı arayalım B). Şimdi A'da B'ye bağlı bir kodunuz olduğunda her şey yolunda. Bununla birlikte, geliştirme sürecinizin bir aşamasında, aslında artık bu koda ihtiyacınız olmadığını fark edersiniz, ancak using-ifadesini olduğu yerde bırakırsınız. Şimdi sadece anlamsız bir var using-directive değil, aynı zamanda bir montaj başvuru için Bherhangi bir yere kullanılmaz hangi ama eskimiş yönergede. Bu, öncelikle yüklenmesi gerektiği Agibi derleme için gereken süreyi artırır B.

Dolayısıyla bu, yalnızca daha temiz ve okunması daha kolay kodla ilgili bir sorun değil, aynı zamanda referans verilen tüm montajların bile mevcut olmadığı üretim kodundaki montaj referanslarının korunmasıyla ilgili bir sorun .

Son olarak bizim örneğimizde B ve A'yı birlikte göndermek zorunda kaldık, ancak B, A'da herhangi bir yerde değil- usingbölümünde kullanılır. Bu kitlesel etkileyecek çalışma zamanı içinde -Temsil Azaman yükleme düzeneği.


2

En azından teoride, size bir C # .cs dosyası (veya herhangi bir tek program kaynak kodu dosyası) verilmişse, koda bakabilmeli ve ihtiyaç duyduğu her şeyi simüle eden bir ortam yaratabilmelisiniz. Bazı derleme / ayrıştırma teknikleriyle, bunu otomatik olarak yapacak bir araç bile oluşturabilirsiniz. Bu, en azından sizin tarafınızdan yapılırsa, kod dosyasının söylediği her şeyi anladığınızdan emin olabilirsiniz.

Şimdi, usingyalnızca 10 tanesinin kullanıldığı 1000 yönergeli bir .cs dosyası verilip verilmediğini düşünün . Dış dünyaya atıfta bulunan kodda yeni eklenen bir sembole her baktığınızda, ne olduğunu anlamak için bu 1000 satırdan geçmeniz gerekecektir. Bu açıkça yukarıdaki prosedürü yavaşlatır. Yani onları 10'a indirebilirseniz, yardımcı olacaktır!

Kanımca, C # usingyönergesi çok zayıftır, çünkü genellik kaybolmadan tek bir genel sembolü belirtemezsiniz ve usinguzantı yöntemlerini kullanmak için takma ad yönergesini kullanamazsınız. Java, Python ve Haskell gibi diğer dillerde durum böyle değildir, bu dillerde dış dünyadan (neredeyse) tam olarak ne istediğinizi belirtebilirsiniz. Ama olay o usingzaman, mümkün olduğunda takma ad kullanmayı önereceğim .

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.