2010-04-02 12 views
6

İlk denememi düşünün, F # içinde aşağıdaki gibi basit bir tür:F # içinde bir özelliği düzgün bir şekilde nasıl uygularım?

type Test() = 
    inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged() 
    let mutable prop: string = null 
    member this.Prop 
     with public get() = prop 
     and public set value = 
      match value with 
       | _ when value = prop ->() 
       | _ -> 
        let prop = value 
        this.OnPropertyChanged("Prop") 

Şimdi bunu C# ile test ediyorum (bu nesne C# projesine maruz kalıyor, bu yüzden görünen C# semantikleri arzu ediliyor):

[TestMethod] 
public void TaskMaster_Test() 
{ 
    var target = new FTest(); 
    string propName = null; 
    target.PropertyChanged += (s, a) => propName = a.PropertyName; 
    target.Prop = "newString"; 

    Assert.AreEqual("Prop", propName); 
    Assert.AreEqual("newString", target.Prop); 

    return; 
} 

propName düzgün şekilde atanmış, F # Setter'ım çalışıyor, ancak ikinci assert başarısız oluyor çünkü prop'un temel değeri değişmiyor. Bu tür bir şey bana mantıklı geliyor, çünkü mutable alanını prop alanından kaldırırsam, hata oluşmaz (ve değeri değiştirmeye çalıştığım için bir tane olması gerekir). Sanırım temel bir kavram eksik olmalıyım.

Test sınıfında prop değerini tekrarlamak/mutasyona sokmanın doğru yolu nedir, böylece birim testimi geçebilir miyim?

cevap

8

bu deneyin:

type Test() = 
    inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged() 
    let mutable prop: string = null 
    member this.Prop 
     with public get() = prop 
     and public set value = 
      match value with 
       | _ when value = prop ->() 
       | _ -> 
        prop <- value 
        this.OnPropertyChanged("Prop") 

Sen bağlayıcı kesilebilir yapmak ve sonra setter değerini değiştirmek gerekir. İlk kodunuzda, ayarlayıcınızda yeni bir ciltleme (prop olarak da adlandırılır) oluşturuyordunuz, böylece hiçbir değişiklik görünmüyordu. Aynı ada sahip böyle bir değeri bağlama ne zaman desen maçında

+0

Teşekkür, @kvb. Hiçbir şey bana dilde bir n00b gibi hissettiriyor, bu kadar basit bir düzeltme değil. :) –

+0

@Greg - sorun değil. Bağlamaların ve gölgelenme çalışmalarının alışması biraz zaman alabilir, özellikle de diğer diller çok farklı şeyler yapar. Ancak, zihinsel modelinizi düzelttikten sonra, F'nin yaklaşımının zerafetinin belirgin olduğunu düşünüyorum. – kvb

5

aslında

let prop = value 

ile yeni bir değer bağlayıcı, bu yeni ilan birinin kapsamı için başka bir değer gölge olacaktır. o kod daha özlü yapar gibi bir yan not olarak

prop <- value 
9

, muhtemelen patterh eşleştirme İhtiyacınız olduğunda özellikle değerlidir (yerine match yapının if .. then kullanır: Ne aslında yapmak istediğim bu olduğuna inanıyoruz değeri birden fazla karmaşık paterni test etmek için). Ayrıca publicmember için varsayılan erişim, yani biraz daha kısa ve öz kodunu yapabilirsiniz:

type Test() = 
    inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged() 
    let mutable prop : string = null 
    member this.Prop 
     with get() = prop 
     and set(value) = 
      if value <> prop then 
       prop <- value 
       this.OnPropertyChanged("Prop") 
+1

Kesinlikle kitabınızı aldım. :) Faydalı okuma, keşke bu soruyu sorduğumda elimde tutmayı isterdim! –

İlgili konular