Harici koddaki rasgele işlevlere / sınıflara çağrıları yasakla


12

Sistemdeki olumsuz sonuçları önlemek için harici kütüphanelerin ve çerçevelerin API'sine erişimi kısıtlamanın değerli olacağı durumlar yaşadım.

Örneğin, bir SharePoint uygulamasında spList.Items.GetItemById, liste döngüsünde, hatta bir döngüde bile, bunun büyük performans sorunlarına yol açabileceğini fark etmeden aramak doğal görünebilir .

Ayrıca, test ortamındaki tüm e-postaları düzgün bir şekilde proxy ve alay edebilmemiz için herkesi e-posta göndermek için kendi sınıfımızı kullanmaya zorlamak için SmtpClient kullanımını yasaklamamız gerekebilir.

Kendi kodumuzdaki belirli yerler hariç, dış kodda bu kısıtlamaları gerçekleştirmenin güvenilir ve makul bir yolu var mı? Her durumda, bu yöntemlere / sınıflara erişimi önlemek, örneğin yansıma veya sadece bir tür devre dışı bırakma ile kesinlikle gerekli değildir, bunların kullanılmaması gerektiğine dair kesin bir uyarı olmalıdır. Tercihen programlayıcıyı mümkünse / gerekirse bu kısıtlamaları geçersiz kılmak için aktif olarak önlemler almaya zorlamak.


11
Bu, aşırı bir kodlama stilinin uygulanmasına benziyor (Belirli bir kütüphane çağrısının kullanılması yasak). Bu yüzden benim için ilk olarak herhangi bir kod incelemesi veya stil kontrolü yapıyor musunuz?
Peter M

3
Bu çağrıları yakalamak ve engellemek için çalışma zamanı mı yoksa derleme zamanı mı?
MetaFight

1
C # kullandığınız için, StyleCop'u hiç duydunuz mu? İstediğiniz gibi özel kurallar oluşturabileceğinizi biliyorsunuz , değil mi?
Machado

10
" Dış kodlara ilişkin bu kısıtlamaları ulaşmak kendi kodunda belli özel yerlerden hariç herhangi güvenilir ve makul basit yolları var mı? ". Evet: derleme hatası olarak belirli API'lara erişmeyi bildirmek için kendi Roslyn Analyzer'ınızı yazın.
David Arno

3
@Machado, StyleCop etkili bir şekilde ölü bir üründür. Yerine Roslyn'in üstüne inşa edilen StyleCopAnalyzers yerleştirildi. Bu günlerde özel StyleCop kuralları yazmak için zaman harcamak kesinlikle iyi bir fikir olmaz.
David Arno

Yanıtlar:


8

Kendi kodumuzdaki belirli yerler hariç, dış kodda bu kısıtlamaları gerçekleştirmenin güvenilir ve makul bir yolu var mı?

Soru özellikle C # ile ilgili olduğundan, bu tür kuralları uygulamak için kullanılabilecek derleyici tabanlı bir çözüm var: Roslyn Analyzers . Bir derleme hatası veya uyarısı olarak belirli API'lara erişildiğini bildiren kendi analizcinizi yazabilirsiniz.

Kendi kodunuzu yazarken çok sayıda örnek kod sağlayan bir dizi analizör C # için eski StyleCop özelliğinin yerini alan StyleCop Analizörleri'dir .

Bunu söyledikten sonra, bu tür otomatik kontroller her zaman "kuralları çiğnemeye" kararlı halk tarafından çözülebilir. Bu nedenle, bu yaklaşım Karl Bielefeldt'in cevabında tartışıldığı gibi kod incelemelerinin yerini tutmaz. Bu tür incelemelere yardımcı olabilir, ancak değiştirilmemelidir.


Asla başka bir şeyi değiştirmek niyetinde değildi, sadece araç kutum için özel bir araç arıyordum.
Alex

25

Harici API'nin etrafına istenmeyen işlemlerinizi bırakan bir sarmalayıcı yazmak gibi zaman alıcı şeyler yapabilirsiniz, ancak hiçbir şey eğitim ve kod incelemelerini yenemez, çünkü hangi standartlar veya teknik önlemler koyarsanız, insanlar bunları aşmanın yaratıcı yollarını bulacaktır .

Örneğin, Scala'da yazılmış birçok hizmetimiz var ve kod inceleme zamanında sorduğumuz şeylerden biri değişmezlik için, ancak bunu genellikle kurtulmak olarak bildiriyoruz vars. Geçen gün birisi, listedeki tek öğe olarak tek bir değişken değişken tutmak için val x: ListBuffer [Boolean] kullandı. X'e başka bir atayamazsınız ListBuffer, ancak listedeki öğeleri istediğiniz kadar değiştirebilirsiniz. A var, ama sinsi kullanmak kadar kötü .

Başka bir deyişle, insanların teknik çözümlerinizin etrafında dolaşıp dolaşmadıklarını kontrol etmeniz gerekir. Bu teknik çözümler maliyetli ve karmaşıklık ekliyorsa, doğru şekilde kodlayıp kodlamadıklarını da kontrol edebilirsiniz.


Kahretsin sinsi!
whn

@snb Java'nın tek bir nesneyi / değeri döndürüp düzgün referans argümanlarına sahip olamamak için hack olarak yaptığı işe eşdeğerdir; bunun yerine, içeriği güncellenecek bir dizi geçiyor. (Bazı örnekler: AtomicMarkableReference.getve AtomicStampedReference.get).
JAB

Cevabınız için teşekkür ederim, ancak kesinlikle dış kodun etrafına sarmalayıcılar yazmak gibi zaman alıcı karmaşık şeyler yapmakla ilgilenmiyorum. Bu, muhtemelen kaynağa gidebilecekleri için bile yardımcı olmaz. Bu yanıt, bir çözümün maliyetli olacağını ve karmaşıklık katacağını varsayar . Saf ve basit bir çözüm ne olacak?
Alex

1
@Alex en basit çözüm orada: "hiçbir şey eğitim ve kod incelemeleri yenemez".
Bay Mind

2
"Hiçbir şey manuel olarak yapamaz", birisi otomatikleştirene kadar haklıdır.
Ewan

0

Karl'ın cevabı% 100 doğrudur. Uyumu garanti etmenin bir yolu yoktur. Bununla birlikte, eğitim ve kod incelemelerine ek olarak, uyumluluğu sağlamak için statik analiz araçlarının kullanımını göz önünde bulundurun. (Not: Ben "ek olarak" dedim, biri de Karl belirttiği gibi aynı şekilde atlayabilirsiniz).

Statik analiz araçlarını kullanmanın avantajı, "IEnumerable'ın çoklu kullanımı" veya baktığınız haftanın hangi performans sorunu olursa olsun (veya en azından her zaman kendimi hissettiğimi hissettiğim) sıkıcı insan kodu analizlerini kaldırmaktır. bakmak). Bu, kod incelemelerinin ve eğitiminin daha "ilginç" konulara odaklanmasını sağlayacaktır.

C # için, özellikle, aşağıda bazı öneriler ekledim. Bunları yapı ortamınıza takın ve hazırsınız. Ancak, genellikle, hangi dili kullanırsanız kullanın, orada bir yerde statik bir analiz aracı vardır.

Doğrudan Wikipedia sayfasından kopyalayın / yapıştırın, en son bilgiler ve bağlantılar için wiki sayfasını kullanın: https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#.NET

  • .NET Derleyici Platformu (Codename Roslyn) - Microsoft .NET tarafından geliştirilen C # ve Visual Basic .NET için açık kaynaklı derleyici çerçevesi. Sözdizimini analiz etmek ve değiştirmek için bir API sağlar.
  • CodeIt.Right - Statik kod analizi ve otomatik yeniden düzenleme işlemlerini kod hatalarının ve ihlallerinin otomatik olarak düzeltilmesini sağlayan en iyi uygulamalarla birleştirir; C # ve VB.NET'i destekler.
  • CodeRush - Kullanıcıları en iyi uygulama ihlallerine karşı uyaran bir Visual Studio eklentisi.
  • FxCop - Microsoft .NET programları için CIL'e derlenen ücretsiz statik analiz. Bağımsız ve bazı Microsoft Visual Studio sürümlerine entegre edilmiştir; Microsoft tarafından.
  • NDepend - Kod bağımlılıklarını analiz ederek ve görselleştirerek, tasarım kurallarını tanımlayarak, etki analizi yaparak ve kodun farklı sürümlerini karşılaştırarak karmaşık bir .NET kod tabanını yönetmeyi basitleştirir. Visual Studio ile bütünleşir.
  • Parasoft dotTEST - Visual Studio için statik analiz, birim testi ve kod inceleme eklentisi; C #, VB.NET, ASP.NET ve Managed C ++ dahil olmak üzere Microsoft .NET Framework ve .NET Compact Framework dilleriyle çalışır.
  • Sonargraph - Bağımlılık analizi, otomatik mimari kontrolü, metrikler ve özel metrikler ve kod denetleyicileri ekleme yeteneğine odaklanarak C #, Java ve C / C ++ 'ı destekler.
  • StyleCop - Bir dizi stil ve tutarlılık kuralını uygulamak için C # kaynak kodunu analiz eder. Microsoft Visual Studio içinden çalıştırılabilir veya bir MSBuild projesine entegre edilebilir.

-1

Başka bir cevapta ortaya konan "eğitim ve kod incelemesi" önerisini ayrıntılı olarak incelemek için: Yasaklamak istediğiniz kod yasal kod olduğundan, bunu önleyen derleyiciye güvenemezsiniz ve daha sonraki bir işleme güvenmeniz gerekir, gözden geçirme.

Bu, hem manuel hem de otomatik inceleme adımlarını içerebilir (ve içermelidir):

  • Bilinen sorunların bir kontrol listesini hazırlayın ve bunları manuel kod incelemelerinizde tek tek ele alın. Kontrol listesini gözden geçirmek ve güncellemek için tekrar eden bir toplantı yapın. Ne zaman kötü bir hata yakalanır ve analiz edilirse, kontrol listesine ekleyin.

  • Bilinen kalıpları aramak için check-in kuralları ekleyin. Bu yazmak karmaşık olabilir, ancak büyük bir proje için zamanla yararlı olabilir. TFS, C # 'da kurallar yazmanıza izin verir ve diğer derleme sistemlerinin kendi kancaları vardır. Kalıpla eşleşen check-in'leri reddetmek için geçitli yapıları kullanmayı düşünün. Evet, gelişmeyi yavaşlatır, ancak belirli bir proje boyutu ve karmaşıklığından sonra, geliştiricileri yavaşlatmak iyi bir şey olabilir.


-1

Belki de derleyici istenmeyen aramaları yakalamanıza yardımcı olabilir.

Harici lib istemcileri tarafından kullanılmaması gereken kendi lib'inizdeki sınıfları / kod yöntemlerini yeniden adlandırın. Alternatif olarak sınıfları / yöntemleri dahili hale getirin ve sınıfları kullanmalarına izin verilen sınıflara görünür hale getirin.

Harici lib kullanıcıları derleme hatası yöntemi / sınıfı bulunamadı.

Halk kütüphanelerinden Yasak Sınıflar / yöntemler: kütüphanenizde aynı ad alanını / sınıfı / yöntemi oluşturun

Harici lib kullanıcıları, yinelenen sınıf bulunduğundan derleme hatası alır

[Güncelleme]

Kesinlikle her koşulda bu yöntemlere / sınıflara erişimi önlemek, örneğin yansıma veya sadece bir tür devre dışı bırakma, gerekli değildir.

programcıyı (... lib müşterisi ...) mümkünse / gerektiğinde bu kısıtlamaları geçersiz kılmak için aktif olarak önlemler almaya zorlar.


Bunu aşağılamak, sadece kötü bir hack olduğu için değil, aynı zamanda ex- aliases kullanarak C # (OP'nin soruyu etiketlediği) ile kolayca çalışılabilir .
David Arno
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.