Когда-то я написал учебное приложение для JavaScript с SVG (закрытый источник для компании). В своей самой основной форме приложение состоит из двух столбцов (левый и правый), а каждый столбец содержит различные геометрические фигуры (квадраты, треугольники, круги и т.д.)Рефакторинг логики внутри оператора if до минимального минимума
Каждая геометрическая форма в одном столбце может подключиться (, рисуя линию) другой геометрической форме в противоположном столбце. Тем не менее, форма в любом столбце может иметь одно или несколько подключений к нему/в зависимости от его настроек.
Таким образом, форма с настройкой {multiple: false}
может иметь только одно соединение с ней или от нее. Не имеет значения, возникло ли соединение от него или из другой формы к нему; одно соединение означает только одно соединение независимо от источника.
Часть кода, который соединяет фигуры путем рисования строки, является чрезмерно сложным оператором if. Здесь:
if ((!sourceHasLines && !targetHasLines) ||
(sourceHasLines && sourceCanMultiply && !targetHasLines) ||
(sourceHasLines && sourceCanMultiply && targetHasLines && targetCanMultiply) ||
(!sourceHasLines && !sourceCanMultiply && targetHasLines && targetCanMultiply) ||
(!sourceHasLines && sourceCanMultiply && targetHasLines && targetCanMultiply)) {
// Create a line only if one of the above comparisons succeeds
connection = self.connect($source, $target);
}
- Источник относится к форме в одну колонку и мишени к форме в противоположном колонке.
- Пользователи могут инициировать соединение из любого столбца, сначала щелкнув одну форму в первом столбце, а затем щелкнув другую фигуру во втором столбце.
- Невозможно подключить фигуры в одном столбце.
Теперь, глядя на код, я чувствую, что логика внутри оператора if может быть сжата, и у меня есть некоторые идеи. Тем не менее, я чувствую, что это связано с перестановками или с какой-либо другой связанной с CS логикой, такой как Discrete Math. Я в основном самоучка, поэтому я хотел бы посмотреть, как кто-то подходит к этому и реорганизует приведенное выше заявление if.
Обратите внимание, что код отлично работает, но мне интересно, как его можно улучшить.Вот скриншот прототипа с верхними/нижними рядами вместо левой/правой колонки:
Я смог упростить его немного больше, но ваш пример, безусловно, самый простой и элегантный для меня. Благодаря! :) – istos