Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как ускорить обработку запроса к бд?

Лучший ответ:
Что касается производительности, то вы столкнулись с проблемой N+1 запроса.
Это когда вам надо получить список записей и для каждой из них вы делаете дополнительный запрос к БД. 900 записей? Ок, будет первый запрос + ещё 900, по одному на каждую запись.
Быстрее может быть выполнить всего два запроса. Первый берёт записи, а второй берёт все дополнительные данные сразу для всех записей и потом уже на стороне php вы в цикле засовываете данные в каждую запись.
Вот абстрактный пример:$shops = query("Select * from shop where city='Moscow'");
$shops = indexBy("id",$shops);
$employes = query("Select * from employe join shop on(shop.id = employe.id_shop) where shop.city='Moscow'");
foreach($employes as $eml){
    $shops[$emp["id_shop"]]["employes"][] = $emp;
}

Худший ответ:
Самое элегантное решение, которое смог из себя выдавить
Буду рад правкам.$linkeds = [];
        $lookups = (new Lookup)
            ->query()
            ->select([
                'lookup_id',
                'record_id',
                'lookup_list_id',
                'linked_record_id',
                'data',
                'element_label',
                'field_name',
                'sequence_order',
                'field_no',
                'archive'
            ])
            ->where('company_id', UserData::getDataUser()->company_id)
            ->where('lookup_list_id', $lookup_list_id)
            ->orderBy('sequence_order')
            ->get()
            ->groupBy(function($item, $key) use (&$linkeds) {
                if($item->linked_record_id > 0)
                {
                    $linkeds[$item->record_id] = $item->linked_record_id;
                }
                return $item->record_id;
            });
        $records = [];
        foreach ($lookups as $record_id => $node)
        {
            $records[$record_id]['data'] = $node;
            if(isset($linkeds[$record_id]))
            {
                $link = (new Lookup)
                    ->query()
                    ->select([
                        'lookup_id',
                        'record_id',
                        'lookup_list_id',
                        'linked_record_id',
                        'data',
                        'element_label',
                        'field_name',
                        'sequence_order',
                        'field_no',
                        'archive'
                    ])
                    ->where('company_id', UserData::getDataUser()->company_id)
                    ->where('record_id', $linkeds[$record_id])
                    ->orderBy('sequence_order')
                    ->get()->toArray();
                $records[$record_id]['link_data'] = $link;
            }
        }
Вопрос: Как правильно делать главную страницу Wordpress?

Лучший ответ:
Нет строгого правила по этому поводу. 
Я лично поступаю на всех создаваемых сайтах так:
- Создаю обычную страницу "Главная".
- В настройках чтения указываю ее как главную страницу.
- Создаю шаблон с именем front-page.php (Он служит для главной страницы по умолчанию).
- Подключаю в него header и footer.
- Можно скопировать код из index.php, либо написать свой вывод. На главной может быть секция с акциями, новостями, текстом о компании и т.д. Никогда просто не ограничивается статейной лентой.

Худший ответ:
Всем привет! 
Вопрос очень интересный и щепетильный. И сразу вам стоит думать о том, для каких целей вам главная страница. Если рассматривать ваш блог, как средство для зарабатывания денег в будущем, то главную страницу лучше сделать в виде лид-магнита. 
А отдельно сделать страницу блог, на которой будут отображаться ваши последние сообщения. 
Если хотите меньше мучиться с версткой доверьтесь платным шаблонам, которые имеют таких страницы. 
Был рад помочь. 
Николай.
Вопрос: Как загрузить ES6-модуль?

Лучший ответ:
проблема решена. был неправильно прописан путь до .js файла

Худший ответ:
В моем случае нужно было указать расширение файла при импорте (.js), т.е., вместо
import './js-test_1'
нужно было использовать
import './js-test_1.js'
Вопрос: Авторизация на PHP?

Лучший ответ:
Я бы на вашем месте, начал с понимания интернета и изучения поиска информации в нем. 
банально: заголовок вашего вопроса и поиск на данном ресурсе. 
А уже затем изучать программирование и т.п.

Худший ответ:
На любом фреймворке это уже все реализовано, нужно только настроить. Если хотите изобрести велосипед, посмотрите как это сделано там, тогда совершите меньше ошибок.
Вопрос: Какие санкции последуют если принимать платежи на сайте с помощью криптовалюты?

Лучший ответ:
Пока законов, которые бы четко устанавливали санкции - ну, по крайней мере в России - мне не известно. Но известна позиция ЦБ, известно мнение Путина...
Потенциально - могут записать в пособники терроризма. Какие уж из этого выводы сделают "там" - кто ж его знает.

Худший ответ:
Соответствующие органы с Терморектальным криптоанализатором)) Шутка
А если серьезно налоги плати трогать не должны, если суммы копеечные.
Вопрос: Почему тормозят браузер и Visual Studio 2008?

Лучший ответ:
Самое узкое место - оперативка, на втором месте ЦПУ.
99% что с таким процессором у вас по материнке ограничение оперативной памяти в 4гб - жить можно, но это тоже не фонтан.
Если денег нет, можно просто докупить памяти, но в перспективе нужно будет его апгрейдить.

Худший ответ:
или просто купить новый комп?
вот да. Если нужен соверменный веб и +- современная разработка.
Вопрос: Что делать, если человек не платит за сайт?

Лучший ответ:
Не рекомендую ничего делать с сайтом. Как бы ни было жалко работу, своя репутация дороже - это на случай, если вы хотите навредить.
Но:
1. Вы можете попробовать найти заказчика, для которого написан сайт, написать ему письмо или связаться другим способом и разъяснить, что вся работа по сайту на самом деле была сделана не студией, а лично вами. Можете вкратце пояснить, что студия с вами не расплатилась, и если заказчику нужны будут доработки, то пусть он связывается с Вами напрямую, а не через студию, которая вас "кинула".
2. Сайт смело можно добавлять в свое портфолио и искать другую работу.
3. Деньги жалко, но это всего лишь деньги и всего лишь один из тысяч эпизодов этой жизни. Постарайтесь взять от ситуации больше позитива. Испортить репутацию нехорошей студии можно и позже, когда вы поймете, что никаких других вариантов нет, а вы уже нашли другую работу и там вас оценили.

Худший ответ:
Можно напортить код, но так, чтобы сразу этого не было видно. Например, как-то ограничить функциональность админки. Резервные копии хранятся около недели. Если поганец чухнется позднее, то ему ничего не останется, как обратиться к вам.
Вопрос: Почему Windows 10 видит две wi-fi сети у моего роутера?

Лучший ответ:
2,4 и 5 ГГц?

Худший ответ:
А если такое происходит с роутером TD-W8950N, который работает только на 2.4 ГГц?
Вопрос: Есть ли возможность в одном проекте использовать react.js, react-redux-router и hashHistory?

Лучший ответ:
Добрый день, ну так и спросить у гугла: react redux react-router
(четвертая ссылка похожа на что-то максимально подходящее вам)
А по факту: лучше спокойно разобраться:
Сначала react, затем асинхронная загрузка чего либо на реакте (без redux, recompose, reselect, immutable, react-router, и прочих библиотек, гы-гы, наболело просто). Все это есть как в видео-уроках, так и в текстовых учебниках. В быстрой и краткой форме - есть официальная документация (хорошая).
Затем следующий шаг: добавление redux и асинхронная загрузка (да-да, тех же самых данных) - но уже через redux.
Затем добавляется react-router.
И в таком случае, даже если вы не успеете сделать что-то сейчас сразу быстро (подозреваю, что либо тестовое задание, либо дружеская "халтурка" в помощь), то вы сможете в будущем без проблем все это реализовать.
Если нужно быстрее - либо статья выше, либо с ментором.
P.S. вредный совет - ищите react redux react-router boilerplate - репозитории с шаблоном для новых проектов. Зачастую там все уже есть и настроено. Вредный, потому что будет тяжело вносить изменения в сборку, если нет понимания что откуда и куда. А так как авторы популярных бойлерплейтов уже столько накрутили, то там частенько сложно разобраться.

Худший ответ:
У меня реализовано приложение с redux и redux-router и redux-thunk, собираю всё это дело web-pack-ом. Но после общения с аналитиком понимаю, что мой вариант с 
import { browserHistory } from 'react-router'
не подходит, и требуется использовать hash, я не смог найти, как использовать hashHistory вместе с redux. 
Спасибо большое за статью! Сейчас прочитаю и постараюсь разобраться.
Вопрос: Почему render выполняеться перед componentWillMount?

Лучший ответ:
Потому что библиотека не ожидает возвращаемое значение в componentWillMount и следом сразу вызывает render.
Забудьте этот метод - он не рекомендован к использованию. Как уже писали выше, асинхронные запросы рекомендуется инициировать в componentDidMount. Он выполняется после вызова render, который вы по какой-то неясной причине хотите избежать. 
Вот два варианта решения:
1. До загрузки данных возвращать в render null или прелоадер.render() {
   const { data } = this.props;

   if (!data) return null;
     
    return (
      <div>
        <FilterModels />
      </div>
    )
  }
}
2. Переместить загрузку данных в родительский компонент и отрисовывать целевой по условию:render() {
  const { filterData } = this.props;
  return (
    <Wrapper>
      {filterData  && <FilterForm data={filterData} />}
   </Wrapper>
  )
}

Худший ответ:
Загрузку по апи лучше делать в componentDidMount, и менять стэйты в нем, об этом можно почитать в документации https://reactjs.org/docs/react-component.html#comp... . componentWillMont уже является deprecated, вместо него можно все выполнять в конструкторе (дифанить стэйты и биндить функции). Логи выполняются правильно. Если бы ты прокидывал пропсы в компонент и они бы изменились, то 3 выполнилось бы ещё раз. Если бы отрисовка компонента ожидала загрузку по апи, то мы бы долго ждали пока появится компонент. Компонент появляется без задержки, просто потом перерисовывается, если меняются состояния, которые он использует
Вопрос: Чистый код: блоки try/catch. Стоит ли так делать?

Лучший ответ:
Я бы сказал, применимость такого правила сильно зависит от того, приходится ли вам, читая обработку исключений, лезть в код того, что их вызвало.
Если код выплевывает исключения, которые полностью понятны без чтения этого кода - можно его завернуть в функцию и убрать с глаз долой.
Если же исключительные ситуации связаны с самой логикой метода, то размазывание этой логики по разным функциям просто нелепо.

Худший ответ:
Думаю мартин ровно черкает иначе бы попустили бедолагу
Вопрос: Баш скрипт, открывающий терминалы с программой?

Лучший ответ:
Как написать скрипт, открывающий терминал с несколькими вкладками?

Худший ответ:
SuperPuTTy дает возможность выполнять команду сразу в нескольких окнах.
Вопрос: Kак маштабировать интерфейс у Linux Ubuntu?

Лучший ответ:
Интерфейс чего? Интерфейс кого? Интерфейс куда?
Ubuntu — дистрибутив с 30 тысячами пакетов, из них тысяч 15 графические программы на разных тулкитах. Ваш вопрос не имеет смысла.

Худший ответ:
К примеру, в Xubuntu заходите в настройки окон и меняете размеры шрифтов.
Вопрос: Как переключатся между удаленными репозитриями?

Лучший ответ:
Разные репозитории - разные директории.cd /path/to/project

Худший ответ:
Два разных проекта должны физически лежать в разных директориях и к каждому проекту подключен свой репозиторий. И не нужно ничего переключать. Это неправильно!
Вопрос: Хороша ли данная сборка компьютера, можно что-то доработать?

Лучший ответ:
Оперативная память для офисного компьютера - 8Гб вполне нормально, это чисто в браузере странички смотреть и документы в ворде печатать, ничего более.
Для фотошопа самый минимум 16, а учитывая что и виртуалки крутить собираетесь меньше 32 смысла нет.
Ну и планки размером менее 16Гб я бы брать не стал - слота всего четыре.Жесткий диск: SEAGATE Barracuda ST1000DM010, 1Тб, HDD, SATA III, 3.5"Вполне пойдет для хранения архивов и фильмов. 
Непонятно на что систему ставить будете - SSD в сборке не видно.

Худший ответ:
Задача сборки - игры на максимальных-средних настройках (хотя бы на 3 года вперёд)
Смотря какие игры. Если новинки то уже с играми 2019 года могут возникнуть трудности на максимальных настройках.
Вопрос: Как затемнить фон кроме 1 элемента?

Лучший ответ:
Если тебе нужно модальное окно, то могу подсказать как сделать на jQuery с помощью плагина. Он будет затенять тебе весь сайт, и выводить нужный элемент поверх. Выводимому элементу можешь задать свои стили.

Худший ответ:
затемняешь весь сайт и ниже высветляешь только нужный блок.
Вопрос: Как уменьшить расход памяти в DataGrid у WPF?

Лучший ответ:
Однозначно нужен постраничный вывод. Никто такие объемы за раз не выводит.
В крайнем случае подгрузка по мере скрола, с удалением из грида верхней части.
Даже в ширину не обязательно все выводить, можно не самые критичные данные скрыть за кнопочкой "подробнее" и подгружать для просмотра по клику как дополнительные данные.

Худший ответ:
Еще необходимо посмотреть на код DataGrid'а. Похоже, что Вы выключили в нем виртуализацию.
Вопрос: Как быстро сравнить два url?

Лучший ответ:
tutunak И каждый из них я должен сравнить с 100 000 предыдущих (+ этот же файл будет увеличиваться с каждым появлением новых уникальных url).
Так-то в базах данных есть индексирование, они умеют строить деревья который оптимизируют поиск... 
>>Появилась мысль, что можно сравнивать хеши этих строк. 
Зачем писать велосипед если базы за вас это делают?

Худший ответ:
Судя по описанию, вам нужно сделать примитив в виде:x = []
for i in data.split(" "):
    if i not in x:
        x.append(i)
Вопрос: Адаптировать уже работающий сайт под моб устройств, какие есть нюансы?

Лучший ответ:
Какие есть нюансы?
Смотря какая верстка и как показывает практика, год не имеет значения (если, конечно, не далекие 90-ые), потому что до сих пор есть динозавры, которые верстают таблицами, либо с использованием классов типа "niz", "verx", "a_tyt_ya_ribu_zavorachival".
Самое распространенное: 
- Задана фиксированная ширина, либо у всей обертки (в лучшем случае), либо для .header, .footer, .main.Решение: заменить фиксированную ширину width: 1000px; на max-width: 1000px; width: 100%;.
- Задана фиксированная ширина у остальных блоков (кнопки, формы, ...).Решение:  применять уже медиазапросы @media screen and (max-width: XXpx ) { ... }, лучше, конечно, @media screen and (min-width: XXpx ) { ... } , либо применять ширину в %, где есть возможность.
- Изображения.Решение: img { max-width: 100%; width: 100%; height: auto; }НО все это зависит от ситуации и потребностей. Все зависит от сайта, от дизайна. Так сразу и не скажешь, что все же нужно применять, а что и не стоит.

Худший ответ:
Все нюансы нивелируются достаточным уровнем знания адаптивной вёрстки.
Вопрос: Есть ли книги для развития действительно математического мышления/не зазубривания формул?

Лучший ответ:
Например:
Пойа Д.
Как решать задачу.
Математика и правдоподобные рассуждения.
Математическое открытие.

Худший ответ:
В школе начинать учить математику нужно с дореволюционного Киселёва.
Вопрос: Как найти в многомерном ассоциативном массиве значение и вывести массив данных по ключам php?

Лучший ответ:
Решениеfunction findArray ($ar, $findValue, $executeKeys){
  $result = array();

  foreach ($ar as $k => $v) {
    if (is_array($ar[$k])) {
      $second_result = findArray ($ar[$k], $findValue, $executeKeys);
      $result = array_merge($result, $second_result);
      continue;
    }
    if ($v === $findValue) {
      foreach ($executeKeys as $val){
        $result[] = $ar[$val];
      }
      
    }
  }
  return $result;
}

Худший ответ:
Решениеfunction findArray ($ar, $findValue, $executeKeys){
  $result = array();

  foreach ($ar as $k => $v) {
    if (is_array($ar[$k])) {
      $second_result = findArray ($ar[$k], $findValue, $executeKeys);
      $result = array_merge($result, $second_result);
      continue;
    }
    if ($v === $findValue) {
      foreach ($executeKeys as $val){
        $result[] = $ar[$val];
      }
      
    }
  }
  return $result;
}
Вопрос: Как узнать получить данные наследованного класса в EF 6?

Лучший ответ:
Вы изучите для начала маппинг в БД 3 вида при наследовании.
TPH, TPT, TPC
https://msdn.microsoft.com/ru-ru/data/jj591617.aspx
metanit.com/sharp/entityframework Глава 7. Наследование в Entity Framework
Посмотрите как в БД сохраняется.

Худший ответ:
Проверять совместимость типов .where (p => p is ConcretePhone) и разносить в соответствующие коллекции
Вопрос: Как правильней всего писать сообщения в команде /git comit -m""?

Лучший ответ:
Обычно в хорошем описании можно выделить две части. Одна описывает зачем это изменение нужно: в чём была проблема/чего не хватало/что работало не так. Вторая описывает решение и документирует, почему именно это решение было выбрано.
И это правило работает в обе стороны: если невозможно описать зачем было сделано изменение или почему оно именно такое -- это скорее всего плохое изменение.1 вариант: Добавляет элемент block__element3 блоку block;
2 вариант: Добавляет текст с описанием блоку block;
Оба в равной мере бесполезны, как и сам этот коммит, судя по всему.

Худший ответ:
Обычно в хорошем описании можно выделить две части. Одна описывает зачем это изменение нужно: в чём была проблема/чего не хватало/что работало не так. Вторая описывает решение и документирует, почему именно это решение было выбрано.
И это правило работает в обе стороны: если невозможно описать зачем было сделано изменение или почему оно именно такое -- это скорее всего плохое изменение.1 вариант: Добавляет элемент block__element3 блоку block;
2 вариант: Добавляет текст с описанием блоку block;
Оба в равной мере бесполезны, как и сам этот коммит, судя по всему.
Вопрос: Что лучше ставить на клиентские станции, win7 или 10?

Лучший ответ:
Что лучше в плане безопасности?
До окончания поддержки Windows 7 осталось чуть более 8 месяцев. Ответ, думаю, очевиден.И какой дистрибутив брать?
Официальный.И еще, можно ли ставить хом версии?
Можно. Для операционной системы такого запрета нет. Но редакцией Pro легче управлять.Они же вроде дорабатывали десятку и по идее она должны быть лучше.
Так и есть. Работает как минимум не хуже на том же железе, даже древнем. В ряде случаев лучше.

Худший ответ:
Если железо не совсем древнее, то Win 10. 
Home лицензии нельзя использовать юр. лицам.
Вопрос: Wol для устройства без такового реально?

Лучший ответ:
Если правильно подобрать номиналы конденсатора и резистора, то поставив их вместо кнопки включения, можно добиться автоматического запуска после отключения питания :)
Ну или замкнуть кнопку нафиг, если он от постоянно нажатой кнопки не глюкнет

Худший ответ:
Пробуждения по сети тоже нет...
В нём есть WoL2.
Ещё есть расписание включения (и выключения), хотя на все случаи - не хватит.
И, насколько я помню, просто есть настройка, как и в обычных компьютерах - что делать при сбое питания: всегда включаться, перейти в тот режим, что был до сбоя или оставаться выключенным до особых распоряжений.
Вопрос: Как организовать работу с командой поддержки?

Лучший ответ:
Удалить поддержку из группы в скайпе

Худший ответ:
Прописать досконально workflow под названием "Обращение клиента в техподдержку".
На основании этого выбрать инструмент.
Чаты (skype, whatsup, etc) не эффективны, их отключить.
Обсуждать задачи по отдельности, в Трелло есть комментарии внутри каждой карточки.
Вопрос: Как устранить ошибку Unknown Property – yii\base\UnknownPropertyException Getting unknown property: yii\db\ActiveQuery::all?

Лучший ответ:
app\components\MenuWidget
это кастомный виджет к yii не имеющий ни малейшего отношения. Что там внутри него криво - только автору известно. Вы хоть код бы дали.

Худший ответ:
По пути app\components\MenuWidget замените строчку:$this->data = Category::find()->all;
на:$this->data = Category::find()->all();
Вопрос: Куда идти стажироваться самоучке по C/C++?

Лучший ответ:
Судя потому, что он сам не нашел ответа на свой вопрос методом элементарного гугления, и ему лень даже самому на форуме спросить, а не через друга (тебя), то, да, — дно.

Худший ответ:
Специализация С++ слишком узкая. И сейчас больше подойдет для написания библиотек с  критичных к скорости, как позвоялет делать еще делать ассемблерные вставки. Функции можно илайнить и пр... Так же от разработчика требуется обязательно инициализировать все создаваемые объекты и убирать за собой мусор. 
 C# и Java языки более высоко уровня и  многих плюшек в отличии от С++ лишены. Многие вещи делать не позволяют, но обладают иными достоинствами. Главная особенность это возможность гибкого подключения разного рода фрейворков и генераторов кода. Если научиться всем этим пользоваться, можно достаточно быстро разрабатывать большие приложения. Работать с базами данных, генерировать классы и таблицы.
Я начинал с С++ с форумом на геймдеве. Делал всякие эксперименты на OpenGL и DirectX. Потом были эксперименты C# MVC. 
Сейчас работаю в IT-конторе на поддержке банковских интеграционных шин на Weblogic и Oracle SOA Suite.
Вопрос: Как устранить ошибку при запуске питона?

Лучший ответ:
Я недавно переустановил Windowsпереустановил WindowsWindows
Ошибка найдена. Устраняй.

Худший ответ:

Теперь такая ошибка. Видимо питон не хочет чтобы я на нём писал.
Вопрос: Продажа доступа к статьям на сайте — нужна ли регистрация ИП? Какие есть варианты законных продаж без ИП?

Лучший ответ:
потому что не известно пойдет или нет это дело, какие объемы и прибыль и т.д.Ну так если у вас нет продаж, и вы не знаете будут ли они - зачем вам ИП?
Просто начинаете продавать- это абсолютно законно.
Если дело идет - ну тогда нет никаких проблем зарегистрировать ИП.
Если дело не пошло - свернули лавочку и все.
Собственно все так и делают.

Худший ответ:
За попробовать в течение нескольких месяце никто вас не "прижучит", особенно если за этот период вы по-честному потом решите заплатить 13% как физ.лицо (зачем вас "жучить", если вы и так отдали в 2 раза больше, чем ИП на "упрощёнке")
Вопрос: Как на уровне контроллера сделать уведомление о выполнение POST метода?

Лучший ответ:
Ну как минимум есть: laracasts/flash
Который можно реализовать раз и на долго, после чего использовать в таких случаях:Flash::success( 'Оплата прошла успешно.' );

return redirect( '' );

Худший ответ:
То есть вы хотите задержать редирект? Чтобы PHP, что-то вернул, пользователь  успел среагировать на сообщение, после чего отредиректил бы куда-нибудь. Странное желание.
Может лучше AJAX? 
1) Заполнил форму
2) Отправил AJAX'ом
3) Получил ответ
4) Вывел сообщение об этом
или
4) Вывел окно с сообщением, при закрытие его редиректить.
Вопрос: Как ускориться и быстрее писать веб-приложения?

Лучший ответ:
 Сколько времени у вас уходит на развертыванием веб-проекта
3 часа 14 минут. Не зависимо от ТЗ и сложности. Просто чудо какое-то что б не делал всегда  3,14 часов. Что бы не делал - 3,14 просто ПИ...тое число.Хочу ускориться, делать больше работы за единицу времени
Найми сотрудников. Или прими за единицу времени большую единицу. Еще есть опыт, он со временем даст прирост скорости.Неужели создание сайта (верстка, бэкенд, фронтенд, проектирование бд итд) настолько нудный и муторный процесс?!
Вам виднее, это дело вкуса. Если Вам нудно - значит нудный. Попробуйте копать траншеи, может веселее пойдет.Поделитесь секретными инструментами, приемами, фреймворками, позволяющими выполнять проект за считанные дни. 
boostrap, vue, jquery, gulp, нормальная IDE, опыт и т.д.
если надо волшебства - беритесь за проекты, которые делаются за "считанные дни". Например, работайте только wp и готовыми шаблонами. Думаю за пару часов можно собрать сайт (3 часа 14 минут).

Худший ответ:
Не пытайся уметь всё.
Займись чем то одним. Либо backend либо frontend.
Если хочешь быстро делать сайты, то делай на платных шаблонах для CMS - их по сути только заполнить нужно. На это у тебя уйдет пара часов, не больше.
Вопрос: Как должен называться и обязанности класса регистации, авторизации и прочего для пользователя?

Лучший ответ:
Скачайте например Laravel там по умолчанию есть данный пример.

Худший ответ:
<sarcasm>Combine.php</sarcasm>
Auth.php, Registration.php, User.php - как вариант. Разграничивание кажется более трудозатратным, но в перспективе так будет удобнее. Проще отлаживать, проще использовать.