Про разработку ПО (через стек 1С)
Про книги
Про кино
Про всякое
Post #93
195
Сложные условия - верный путь в ад
Многострочные условия занимают прочное место в топе легальных издевательств над людьми, где-то сразу после «пенопластом по стеклу».
Давайте разберёмся как из чего-то ебанного типа (и это ещё не самый плохой пример
сделать нечто удобоваримое.
Что нам может помочь?
Метод # 1. Объединение условий в переменные и/или методы
Или вообще засунуть все условия в один метод
Метод # 2. При переборе строгих равенств использовать массив
Метод # 3. Использовать логические функции
P.S. Важно понимать, что если Вы опираетесь в логике проверки на ленивое выполнение логических операций платформой - то при переформатировании условий это свойство может быть утеряно и проверки потребуют более тщательного подхода.
#медвежийкодстайл
Многострочные условия занимают прочное место в топе легальных издевательств над людьми, где-то сразу после «пенопластом по стеклу».
Давайте разберёмся как из чего-то ебанного типа (и это ещё не самый плохой пример
Если (ВажныеДанные = ПервоеЗначение
ИЛИ ВажныеДанные = ВтороеЗначение
ИЛИ ВажныеДанные = ТретьеЗначение
//еще много значений
ИЛИ ВажныеДанные = ЕщеОдноЗначение)
И (ВажнаяДата >= ЗначениеВажнойДаты
ИЛИ ВыполнятьВнеЗависимостиОтДаты)
И СтатусВажныхДанных = ДействительныйСтатус
И (ВажныеДанные.Свойство = ПервыйВариантСвойства
ИЛИ ВажныеДанные.Свойство = ВторойВариантСвойства
ИЛИ ВажныеДанные.Свойство = ТретийВариантСвойства) Тогда
//какой-то код
КонецЕсли;
сделать нечто удобоваримое.
Что нам может помочь?
Метод # 1. Объединение условий в переменные и/или методы
ЗначениеДанныхВыполняется = ВажныеДанныеНужногоЗначения(ВажныеДанные);
ДатаДанныхЗаебись = ВажныеДанныеПроверкаДаты(ВажныеДанные);
СтатусДанныхСоответствует = СтатусВажныхДанных = ДействительныйСтатус;
ДанныеОбладаютНужнымСвойством = СвойствоДанныхУдовлетворительно(ВажныеДанные);
Если ЗначениеДанныхВыполняется
И ДатаДанныхЗаебись
И СтатусДанныхСоответствует
И ДанныеОбладаютНужнымСвойством Тогда
//какой-то код
КонецЕсли;
Функция ВажныеДанныеНужногоЗначения(ВажныеДанные)
Возврат ВажныеДанные = ПервоеЗначение
ИЛИ ВажныеДанные = ВтороеЗначение
ИЛИ ВажныеДанные = ТретьеЗначение
//еще много значений
ИЛИ ВажныеДанные = ЕщеОдноЗначение;
КонецФункции
Функция ВажныеДанныеПроверкаДаты(ВажныеДанные)
Возврат ВыполнятьВнеЗависимостиОтДаты
ИЛИ ВажныеДанные.ВажнаяДата >= ЗначениеВажнойДаты;
КонецФункции
Функция СвойствоДанныхУдовлетворительно(ВажныеДанные)
Возврат ВажныеДанные.Свойство = ПервыйВариантСвойства
ИЛИ ВажныеДанные.Свойство = ВторойВариантСвойства
ИЛИ ВажныеДанные.Свойство = ТретийВариантСвойства;
КонецФункции
Или вообще засунуть все условия в один метод
ВажныеДанныеПрошлиПроверки() - что в целом не очень информативно, потому что из тела основного метода не будет очевидно, какие именно проверки выполнялисьМетод # 2. При переборе строгих равенств использовать массив
ПодходящиеЗначения = Новый Массив;
ПодходящиеЗначения.Добавить(ПервоеЗначение);
ПодходящиеЗначения.Добавить(ВтороеЗначение);
ЗначениеДанныхВыполняется = ?(ПодходящиеЗначения.Найти(ВажныеДанные) = Неопределено, Ложь, Истина);
Метод # 3. Использовать логические функции
Операнды = Новый Массив;
Операнды.Добавить(ВажныеДанные = ПервоеЗначение);
Операнды.Добавить(ВажныеДанные = ВтороеЗначение);
Операнды.Добавить(ВажныеДанные = ЕщеОдноЗначение);
ЗначениеДанныхВыполняется = Коньюкция(Операнды);
Операнды.Очистить();
Операнды.Добавить(ВыполнятьВнеЗависимостиОтДаты);
Операнды.Добавить(ВажныеДанные.ВажнаяДата >= ЗначениеВажнойДаты);
ДатаДанныхЗаебись = Дизъюнкция(Операнды);
Операнды.Очистить();
Операнды.Добавить(ВажныхДанных.Свойство = ПервыйВариантСвойства);
Операнды.Добавить(ВажныхДанных.Свойство = ВторойВариантСвойства);
Операнды.Добавить(ВажныхДанных.Свойство = ТретийВариантСвойства);
ДанныеОбладаютНужнымСвойством = Дизъюнкция(Операнды);
Операнды.Очистить();
Операнды.Добавить(ВажныеДанныеНужногоЗначения);
Операнды.Добавить(ДатаДанныхЗаебись);
Операнды.Добавить(СтатусВажныхДанных = ДействительныйСтатус);
Операнды.Добавить(ДанныеОбладаютНужнымСвойством);
Если Коньюкция(Операнды) Тогда
//какой-то код
КонецЕсли;
Функция Коньюкция(Операнды)
Для Каждого Операнд Из Операнды Цикл
Если Не Операнд Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Функция Дизъюнкция(Операнды)
Для Каждого Операнд Из Операнды Цикл
Если Операнд Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
P.S. Важно понимать, что если Вы опираетесь в логике проверки на ленивое выполнение логических операций платформой - то при переформатировании условий это свойство может быть утеряно и проверки потребуют более тщательного подхода.
#медвежийкодстайл
- 🔥 4
- ✍ 1
- ❤ 1
- 👍 1
