Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;“实时”;可变类设计_C#_Winforms - Fatal编程技术网

C# &引用;“实时”;可变类设计

C# &引用;“实时”;可变类设计,c#,winforms,C#,Winforms,我的应用程序用于离心泵叶轮的设计。用户可以通过WinFormGUI实时更改某些属性(流速度、维度等),并且应该实时向用户提供大部分结果 有13个用户可更改的参数和大约70个计算参数 大多数计算在数学上相当复杂,其中一个参数需要迭代(不超过10次迭代) 到目前为止,我对包含并计算所有参数的类的解决方案是: 使用描述用户可更改参数的属性和计算结果参数的方法初始化 类,该类是不可变的,并在创建时计算所有内容 使用.NET4.0中的惰性类的惰性解决方案 我问了一个关于CR的问题,从那个里我得到了懒惰的解

我的应用程序用于离心泵叶轮的设计。用户可以通过WinFormGUI实时更改某些属性(流速度、维度等),并且应该实时向用户提供大部分结果

有13个用户可更改的参数和大约70个计算参数

大多数计算在数学上相当复杂,其中一个参数需要迭代(不超过10次迭代)

到目前为止,我对包含并计算所有参数的类的解决方案是:

  • 使用描述用户可更改参数的属性和计算结果参数的方法初始化
  • 类,该类是不可变的,并在创建时计算所有内容
  • 使用.NET4.0中的惰性类的惰性解决方案
  • 我问了一个关于CR的问题,从那个里我得到了懒惰的解决方案


    所以我的问题是,哪种方法最适合“实时”解决方案?还有其他更好的解决方案吗?

    我会选择解决方案1,我怀疑每个泵都有相同的特性,只是特性值不同

    public class Pump
    {
        public double Speed { get; set; }
        public double Size { get; set; }
        public void GetCFM() { return Speed * Size; }
    }
    
    GetCFM
    的任何调用都将始终返回最新的计算结果

    如果不想手动调用
    GetCFM
    ,则可以实现。使用观察者模式,您将触发一个处理程序,该处理程序在任何属性更改时都会收到通知


    此外,我怀疑您对性能的理解与文章中的解释不同。

    性能是一个问题吗?也就是说,每当需要瓶颈时,就单独重新计算这70个参数?@ChrisSinclair到目前为止,对于第一个解决方案,它工作得相当好,但一些方法在用户更改一个参数后被调用了100多次。也许选项2是最好的。让用户输入他们想要的新驾驶参数,用这些参数创建一个新对象,并让它预先计算70个其他参数,然后将该对象输入系统。至少这样,您不会陷入这样一种情况:您在计算值的同时,用户正在更新其他值。编辑:可能尝试将对象拆分为2。第一个类仅用作输入参数,它有一个
    Calculate
    方法,该方法返回第二个不可变类,该类包含所有输入参数和70个驱动值。第二个类驱动系统的其余部分。系统的其余部分不关心您如何获得这些值,因此您的GUI可以自由地执行它想要执行的任何惰性/非惰性工作,并将一个简单的不可变对象提供给业务逻辑。这是我的第一种方法,但当我注意到不必要地多次调用的方法时,例如:public void GetABC(){return GetCFM()*GetDEF();}还有textBox.Text=GetABC().ToString()我已经开始寻找可以保存值直到下次重新计算的东西。我仍在使用此解决方案,但它似乎不正确:)。您可以调用一个私有/受保护的方法来获取计算,当您更改属性(在properties
    set
    方法中)时,您可以调用此方法,该方法在内部保存值,然后使用其他属性公开。但是,我建议您不要这样做,因为这将导致代码非常难以理解。计算机计算数字的速度非常快,除非你真的发现了瓶颈,否则你可能只是在写更复杂的东西(而且很难维护)不必要地编写代码。实时意味着用户不需要按“提交”按钮或类似的按钮,每次更改后都会提供重新计算的值。@Archibald只需聆听GUI控件的各种
    OnChange
    事件,重新计算,并且重新填充这些值。@Archibald我的建议是,如果它能够创建正确的计算,速度足够快,并且易于维护,那么我会保留它。