2010-06-23 11 views
11

ठीक है, मेरे पास अभी तक एक और कोड अनुबंध है।कोड अनुबंधों में अनुबंध। फोरेल का उपयोग

[ContractClassFor(typeof(IUnboundTagGroup))] 
public abstract class ContractForIUnboundTagGroup : IUnboundTagGroup 
{ 
    public IUnboundTagGroup[] GetAllGroups() 
    { 
     Contract.Ensures(Contract.Result<IUnboundTagGroup[]>() != null); 
     Contract.Ensures(Contract.ForAll(Contract.Result<IUnboundTagGroup[]>(), g => g != null)); 

     return null; 
    } 
} 

मैं कोड लेने वाली इंटरफेस है कि इस तरह दिखता है:

public void AddRequested(IUnboundTagGroup group) 
    { 
      foreach (IUnboundTagGroup subGroup in group.GetAllGroups()) 
      { 
       AddRequested(subGroup); 
      } 
      //Other stuff omitted 
    } 

AddRequested एक गैर की आवश्यकता है मैं एक अंतरफलक विधि पर एक अनुबंध है कि (अन्य तरीकों स्पष्टता के लिए छोड़े गए) इस तरह दिखता है शून्य इनपुट पैरामीटर (यह एक इंटरफ़ेस लागू करता है जिसमें अनुबंध की आवश्यकता होती है) और इसलिए मुझे AddRequested में पारित होने पर उप समूह पर अनुचित: समूह! = शून्य 'त्रुटि प्राप्त होती है। क्या मैं ForAll वाक्यविन्यास का सही उपयोग कर रहा हूं? यदि ऐसा है और सॉल्वर बस समझ में नहीं आता है, तो सॉल्वर अनुबंध को पहचानने में मदद करने का कोई और तरीका है या जब भी GetAllGroups() को कॉल किया जाता है तो मुझे बस एक Assume का उपयोग करने की आवश्यकता होती है?

+0

नवीनतम संस्करण ने 'ForAll' को सक्षम किया है, तो आप इसे आज़मा सकते हैं :) – porges

उत्तर

9

Code Contracts User Manual कहता है, "स्थैतिक अनुबंध परीक्षक अभी तक क्वालिअर्स फॉरएल या मौजूदियों से निपटता नहीं है।" ऐसा होने तक, मुझे लगता है कि विकल्प हैं:

  1. चेतावनी को अनदेखा करें।
  2. AddRequested() पर कॉल करने से पहले Contract.Assume(subGroup != null) जोड़ें।
  3. AddRequested() पर कॉल से पहले एक चेक जोड़ें। शायद if (subGroup == null) throw new InvalidOperationException() या if (subGroup != null) AddRequested(subGroup)

विकल्प 1 वास्तव में मदद नहीं करता है। विकल्प 2 जोखिम भरा है क्योंकि यह AddRequested() को बाधित करेगा अनुबंध की आवश्यकता है भले ही IUnboundTagGroup.GetAllGroups() अब पोस्ट-कंडीशन सुनिश्चित करता है। मैं विकल्प 3 के साथ जाऊंगा।

+2

धन्यवाद; मैं सोच रहा हूं कि शायद मैं अस्यूम का उपयोग कर जाऊंगा, क्योंकि मूल कोड (प्री-कॉन्ट्रैक्ट्स) में शून्य की जांच नहीं थी। यह उन विभिन्न स्थानों को भी स्पष्ट रूप से चिह्नित करता है जहां स्थैतिक समर्थक को 'सहायता' की आवश्यकता होती है ताकि उम्मीद है कि मैं वापस जा सकता हूं और उनमें से कुछ को हटा सकता हूं क्योंकि समर्थक अधिक शक्तिशाली हो जाता है। –

संबंधित मुद्दे