SORU
20 HAZİRAN 2010, Pazar


Gerçekten C CodeContracts gibi çalışıyor#

Nihayet için eklenen her yeni yetiştiği oynuyorum .NET 3.5/4.0 Çerçeveleri. Son bir kaç gündür CodeContracts ile çalışıyorum ve gerçekten onlar gibi olmaya çalışıyorum. Diğer insanlar C CodeContracts uygulanması hakkında ne düşünüyorsun merak ediyorum#? Özellikle, insanların nasıl Sözleşme için arayüzleri, sözleşme yöntemleri için Sözleşme sınıfları gibi şeyler Değişmezler vb düzenliyor?

Sözleşmeler sağlayan doğrulama seviyorum, ilk bakışta harika görünüyor. Birkaç basit hatları ile bazı güzel hatta benim kod çalıştırmak için önce yapı denetimi alabilirim. Ne yazık ki, zor bir zaman kodu sözleşmeler yolu C uygulamak olduğuna dair bir his içinde yaşıyorum# benim kod sözleşmeler belgeleyen daha karmaşık. Ve almak dolu avantaj sözleşmeler, ben çöp kodum olan varsayımlar ve onayları vs. (biliyorum bazıları diyecek iyi bir sey); ama benim gibi bazı örnekler aşağıda gösterecektir çıkıyor, bir tek, basit bir çizgi içinde 4 veya 5 satır, ve pek eklemek yeterli değer bence üzerinde alternatif yaklaşımlar (yani, iddia, özel durumlar vb).

Şu anda, benim en büyük hayal kırıklıkları

Arayüz Sözleşmeler:

[ContractClass(typeof(IInterfaceContract))]
  public interface IInterface
  {
    Object Method(Object arg);
  }

  [ContractClassFor(typeof(IInterface))]
  internal abstract class IInterfaceContract
  {
    private IInterfaceContract() { }

    Object IInterface.Method(Object arg)
    {
      Contract.Requires(arg != null);
      Contract.Ensures(Contract.Result<Object>() != null);
      return default(Object);
    }
  }

Bu da öznitelikleri veya dil desteği yerleşik form aracılığıyla bana böyle bir cludge gibi, belge gereksinimleri için temizleyici bir yolu olsaydı keşke, hissediyor. Sözleşme belirtin ben sadece bu yüzden benim arabirimi uygulayan bir soyut sınıf uygulamak zorunda olduğum gerçeğini sıkıcı en iyisi gibi görünüyor.

Kod Kabartmak:

typeof(Action<>).MakeGenericType(typeof(Object);

Gerektirir çeşitli varsayımlar bilgileri doğrulamak için sadece hazırdır. Takdir ediyorum tüm Çözümleyicisi bilir o işletim Türüne ve böylece gerek iş üzerinde sınırlı bir bilgi, ama yine de hayal kırıklığına uğratıyor beni bir tek satırlık bir kod gerektirir bana yeniden yazmak gibi

var genericAction = typeof(Action<>);

Contract.Assume(genericAction.IsGenericType);
Contract.Assume(genericAction.GetGenericArguments().Length == 1);

genericAction.MakeGenericType(typeof(Object));

Sadece işleri devam belgelenmiş (Evet biliyorum kullanabilirim ContractVerificationAttribute suçunu kapatmak için bir yöntem/sınıf vb, ya da SuppressMessageAttribbute hedef özel mesajlar, ama o gibi görünüyor yenmek amaçlı olarak kodunuzu ki hızlı hale ile çevrili baskılar vb.

Buna ek olarak, bir durum almak gibi

  public class MyClass
    : IInterface
  {
    private readonly Object _obj;

    public Object Property
    {
      get
      {
        Contract.Ensures(Contract.Result<Object>() != null);
        return _obj;
      }
    }

    public MyClass(Object obj)
    {
      Contract.Requires(obj != null);

      _obj = obj;
    }
  }

n gerekli olduğu için değil null ve set için bir salt okunur alan değiştirilemez, ama ben hala gerekli eklemek için "biçimlendirme" yöntemi sınıfım yani benim şahsıma ihtiyacına cevap boş kanıtlanmış:

[ContractInvariantMethod]
private void ObjectInvariant()
{
  Contract.Invariant(_obj != null);
}

Orada daha fazla, ama düşündüm ben muhtemelen ağız kalabalığı yeter, yaparım da gerçekten takdir içgörü insanlar çok daha zeki bana yardım et "gibi" Kod Sözleşmeler ve bu duygu karmaşasını kodu git. Daha iyi, vb kod çözüm wonkiness sorunları yapısı hakkında herhangi bir fikir büyük mutluluk duyacağız.

Teşekkürler!

CEVAP
23 HAZİRAN 2010, ÇARŞAMBA


Bu da öznitelikleri veya dil desteği yerleşik form aracılığıyla bana böyle bir cludge gibi, belge gereksinimleri için temizleyici bir yolu olsaydı keşke, hissediyor.

CC ekibi Öznitelikleri kullanarak sadece onları Lambda gibi şeyler içerebilir. çünkü yeterince güçlü değil, belirtmiştir. Onlarolabilir[NotNull] gibi şeyler vardır ama CC mümkün olduğunca genel tutmaya çalışıyorlar çünkü chosen not to do so.

CC iki tane kütüphane (uzun bir C parçası olmaktansa#) üzerinden desteklenirtüm.NET dilleri.

Daha fazla takımın mantık hakkında here okuyabilirsiniz.

Aslında bu kullanma açısından, şimdiye kadar sadece aynı yerde belgelerde var bu da demek oluyor ki arabirimi, aynı dosya içinde arayüz sözleşmemin tutuyordum. Geliştirilmesi gereken bir şeydir :)

Kod Kabartmak [...]

İkinci şikayetiniz muhtemelen the code contracts forum yollamak öneririm -- uygulanabilir bir şeydir. (EDİT: biri already has ama henüz bir cevap yok.) Görünüyor

Ancak, her zaman altında belirtilen sözleşmeler daha varsayımlar onları çevreleyen gerekir ki böyle olacaktır. Eğer böyle bir durumla karşılaşırsan .NET çerçeve sözleşmeler Missing Contracts on Libraries thread eklenmesini talep edebilirsiniz.

Buna ek olarak, böyle bir vakayı [...]

Bu 18**. Eğer otomatik bir özellik varsa, sadece boş olmayan ve pre-/post-koşullar oluşturulur değişmeyen bir ekleme var

public class MyClass : IInterface
{
    private Object Property { get; set; }

    [ContractInvariantMethod]
    private void Invariants()
    {
        Contract.Invariant(Property != null);
    }
}

Muhtemelen büyük bir anlaşma değil bu yüzden derslere zaten diğer değişmezler ile sonuna kadar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kim Barbin

    Kim Barbin

    3 Mayıs 2012
  • martin shervington

    martin sherv

    7 EKİM 2011
  • WK

    WK

    9 Ocak 2006