kni*_*ick 4 c# programming-languages lazy-evaluation
我正在研究c#中的应用程序.为了使这个应用程序工作,我发现自己做了一些对我选择的语言感到非常不自然的事情.在经历了许多重构和改进后,我逐渐意识到我试图实现的功能实际上是一种"懒惰评估"(我认为).这就是我想要的......
// Criteria 1: Lazy evaluation of expressions
int x = LazyEvaluated.New<int>();
int y = LazyEvaluated.New<int>();
int z = LazyEvaluated.New<int>();
z.Assign(x + y);
Assert.ThrowsException(z.Evalutate());
x.Assign(1);
Assert.ThrowsException(z.Evalutate());
y.Assign(2);
Assert.Equals(3, z.Evaluate());
x.Assign(3);
Assert.Equals(5, z.Evaluate());
// Criteria 2: Referencing relative to parent object
Car myCar = LazyEvaluated.New<Car>();
Engine engineInMyCar = LazyEvaluated.New<Engine>();
double displacementOfMyEngine = LazyEvaluated.New<double>();
engineInMyCar = myCar.Engine;
displacementOfMyEngine = engineInMyCar.Displacement;
Car subaru = new Car(new FlatFourEngine());
Car falcon = new Car(new InlineSixEngine());
myCar.Assign(subaru);
Assert.IsTypeOf<FlatFourEngine>(engineInMyCar.Evaluate());
Assert.IsEqual(2.0, displacementOfMyEngine.Evaluate());
myCar.Assign(falcon);
Assert.IsTypeOf<InlineSixEngine>(engineInMyCar.Evaluate());
Assert.IsEqual(4.0, displacementOfMyEngine.Evaluate());
Run Code Online (Sandbox Code Playgroud)
这些是我用于说明的简单类定义......
public class Car {
private readonly Engine engine;
public Car(Engine engine) { this.engine = engine; }
public Engine Engine { get { return engine; } }
}
public abstract class Engine {
public abstract double Displacement { get; }
}
public class FlatFourEngine : Engine {
public override double Displacement { get { return 2.0; } }
}
public class InlineSixEngine : Engine {
public override double Displacement { get { return 4.0; } }
}
Run Code Online (Sandbox Code Playgroud)
我想要这个功能的原因主要是为了分离问题.为了说明,让我们进一步采用汽车模拟.我的车由很多东西组成; 发动机,轮胎,内饰等.我的轮胎需要每两年更换一次轮胎车间.我的发动机需要每6个月由机修工换油一次.内部需要由细节设备每3个月抽真空一次.能够按照......的方式做一些事情会很好
tyreShop.ReplaceTyres(myCar.Tyres, every2Years);
mechanic.ChangeOil(myCar.Engine, every6Months);
detailer.VacuumInterior(myCar.Interior, every3Months);
Run Code Online (Sandbox Code Playgroud)
这种方法的一些原因;
我没有CS的正规教育,我唯一的编程经验是使用c&c#语言.我刚刚花了6个月的时间熟悉c#和.Net.在大多数情况下,我非常喜欢语言和早期评估.但我现在正在质疑我是否会更好地用另一种语言解决我的特定问题,内置支持懒惰评估.
我的问题是;
这听起来像你正在安排的事情是在以后重复安排一个动作.我建议委托 - 可能使用lambda表达式 - 是最合适的方法:
scheduler.Schedule(every3Months, () => tyreShop.ReplaceTyres(myCar));
Run Code Online (Sandbox Code Playgroud)
这样,您需要了解懒惰方面的唯一代码就是调度程序本身.所有其余代码都可以假设,当您调用方法时,您希望立即执行该操作,这更像是惯用的C#.