LINUX.ORG.RU

Избавиться от if и облагородить

 ,


0

1

Лор, нужна помощь.

Имеется некая система подбора данных из 3 (на данный момент) комбобоксов, заполняемых из базы. Выбираем значение в одном из них (любом), жмем сабмит, получаем значения для остальных. Некоторые значения конфликтуют друг с другом ( т.е. если например в комбокосе №1 выбрать ААА, то во втором не может выпасть BBB, а в третьем не может выпасть CCC).

Сейчас все это работает чудовищным образом - кидается рандом, если значение совпадает с кучей условий по if - кидаем еще до тех пор, пока не будет конфликта. Уже сейчас все условия занимают пару сотен строк, проект растет, энтропия множится, мрак, тлен, пустота.

Сам я тот еще быдлокодер и смог написать только так, но жажда прекрасного требует улучшений.

Как это все можно привести к человеческому виду? Графовые базы какиенить? Ткните носом в мануал/алгоритм/чтонить пжалста.



Последнее исправление: cetjs2 (всего исправлений: 2)

Ответ на: комментарий от goingUp

Нужно получить случайное значение из списка, которое не противоречит условиям. В этом вся суть системы :)

IK_RUS
() автор топика
Последнее исправление: IK_RUS (всего исправлений: 1)
Ответ на: комментарий от IK_RUS

Люди для этого дела целый продукты пишут, вот классический пакет для байесовской статистики основанной на такой генерации случайных чисел (https://en.wikipedia.org/wiki/WinBUGS)

Прикручивай какой то такой движёк и грузи в него описания на его языке?

psv1967 ★★★★★
()

( т.е. если например в комбокосе №1 выбрать ААА, то во втором не может выпасть BBB, а в третьем не может выпасть CCC)

Прямо игровой автомат какой-то...

hobbit ★★★★★
()

Вместо условий if прикрутить хеш-таблицу, содержащую противоречащие запросы, если их число конечно.

iVS ★★★★★
()

Так а что тут именно облагораживать? Если в комбобоксах надо получить именно случайное значение, то без рандома не обойтись. И проверку на конфликт тоже надо делать, никуда от нее не деться. А то что ifы занимают 200 строк, ну тут уже можно подумать. Может логику конфликтов в отдельную базу запихнуть?

morse ★★★★★
()

совпадает с кучей условий по if - кидаем еще до тех пор, пока не будет конфликта

Стейт-машина с рандомным выбором перехода между стейтами.

no-such-file ★★★★★
()

В простом случае как-то так же :

$conficts = [
  "field1" => [
    "AAA" => [
      "field2" => ["BBB"],
      "field3" => ["CCC"],
    ]
  ],
];
$fields = ["field1", "field2", "field3"];
foreach ($fields as $checkable) {
  $value = $values[$checkable];
  if (! isset($conflicts[$checkable], $conflicts[$checkable][$value]))  {
    continue;
  }
  $checkable_fields = $conflicts[$checkable][$value];
  foreach ($checkable_fields as $field=>$checkable_values) {
    $field_value = $values[$field];
    if (in_array($field_value, $checkable_values)) {
      return ValidationError($checkable, $field);
    }
  }
}

alex4321
()

данных из 3 (на данный момент) комбобоксов, заполняемых из базы

эээ если ограничение множества комбинаций определяется таблицей(ну али ещё каким ораклом) - проще(?!) сделать препроцессинг считающий для каждого ключа ему соответсвующиее мультмножество по каждому домену(?) тогда для генерации следующей допустимой комбинации достаточно 1-кратного рэндомa в диапазоне из select from ... where filds u set in some combobox.

qulinxao ★★☆
()

Сам я тот еще быдлокодер
Как это все можно привести к человеческому виду?

Для начала надо привести ТЗ в JOB.
Потом ещё придётся денег заплатить.

Ткните носом в мануал/алгоритм/чтонить пжалста

http://www.labirint.ru/books/110440/

Goury ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.