我有一个包含三个字段A,B和C的数据对象.问题是用户可以设置其中任何一个,因为:
A*B = C.
因此,如果用户通过设置A和B开始,则将计算C. 但是如果用户设置了C,则会重新计算A,因此会根据用户设置的最后一个字段进行隐式锚定.
我想避免使用大量标志成员变量的解决方案.关于如何编写这门课程的任何最佳实践,而不需要在下面有很多这样的东西
public class Object
{
private double _A;
private double _B;
private double _C;
private bool _enteredA;
private bool _enteredB;
private bool _enteredC;
public double A
{
get
{
if (_enteredC)
{
return _C / _B;
}
else
{
return _A;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果设置A,B和C的逻辑总是在"get"或"set"上.
有没有更清洁的方法来做到这一点?
所以你的规则是:
A = C / B
B = C / A
C = A * B
Run Code Online (Sandbox Code Playgroud)
您需要做的是记住用户输入的最后两个字段,然后计算第三个字段。因此,如果他们输入 A,然后输入 B,那么您将计算 C。如果他们随后更改 C,则重新计算 A,依此类推。
如果您想在不使用布尔标志的情况下对其进行编码,可以使用几种不同的方法来实现。一个队列,或者只是一个简单的数组/映射就可以了:
editOrder = {A : 0, B : 0, C : 0 } // (or just use 0, 1, 2)
editCount = 0;
every time any field is edited :
editCount = editCount + 1
editOrder[field] = editCount
if two fields have an editOrder > 0
recalculate the field with the lowest editOrder
Run Code Online (Sandbox Code Playgroud)
用法示例:
Field changed editOrder recalculate field
A 1,0,0 -
A 2,0,0 -
B 2,3,0 C
C 2,3,4 A
C 2,3,5 A
B 2,6,5 A
A 7,6,5 C
Run Code Online (Sandbox Code Playgroud)