Я в настоящее время работаю с (собственной) платформой, которая предоставляет себя хорошо UI-as-state-machine парадигме, и она может определенно уменьшить (но не устранить), проблемы со сложными и непредвиденными взаимодействиями между элементами UI.
основное преимущество - то, что это позволяет Вам думать в более высоком уровне абстракции при более высокой гранулярности. Вместо того, чтобы думать, "Если кнопка A нажимается тогда, заблокировано поле комбинированного списка B, текстовое поле C очищено и и Кнопка D разблокирована", Вы думаете, что "Нажимающая кнопка A помещает приложение в ПРОВЕРЕННОЕ состояние" - и ввод того состояния означает, что определенные вещи происходят.
я не думаю, что это полезно (или даже возможно) смоделировать весь UI как единственный конечный автомат, все же. Вместо этого обычно существует много конечных автоматов меньшего размера, что каждый обрабатывает одну часть UI (состоящий из нескольких средств управления, которые взаимодействуют и принадлежат вместе концептуально), и один (возможно, больше чем один) "глобальный" конечный автомат, который обрабатывает более основные проблемы.
Следующие методы расширения могут быть полезны для реализации предложения Кевина:
public static bool IsEqualTo(this double a, double b, double margin)
{
return Math.Abs(a - b) < margin;
}
public static bool IsEqualTo(this double a, double b)
{
return Math.Abs(a - b) < double.Epsilon;
}
Теперь вы можете просто сделать:
if(x1.IsEqualTo(x2)) ...
if(x1.IsEqualTo(x2, 0.01)) ...
Просто измените IsEqualTo
на более подходящее имя или при необходимости измените поле по умолчанию на значение лучше, чем double.Epsilon
.
Обычно числа с плавающей запятой следует сравнивать, используя конструкцию типа
if( abs((x1 - x2) < 0.001) )
Причина указанного вами предупреждения заключается в том, что у вас может быть два метода вычисления чего-либо, и они могут быть равны, если у вас не было ошибка округления, но ошибка округления немного отличается.