Size: a a a

CODE BLOG / Чат

2020 February 12

SG

Spectra GameSport in CODE BLOG / Чат
Эх, были бы паттерны на все случаи жизни)
источник

4

4g in CODE BLOG / Чат
Steel Sword
@fiogdi, покажите оптимизацию SQL-запроса!)
Ооо я не такой большой спец по этим вещам, но знаю что не  совсем декларативно - подходов, чтобы получить выборку данных по заданной структуре и заданным входным параметрам довольно много и порой зависит от СУБД, от того как сама СУБД будет видеть запрос и какие действия выполнит чтобы выдать ответ.
Чаще всего конечно есть очень простые варианты запросов, которые оптимизируются приблизительно в разных СУБД похожим способом.
Чаще всего это связано с избавлением от излишней "вложеннности" запросов, joinов ненужных, иногда при небольшом объеме проще из связанной таблицы выбрать во временную таблицу часть данных к которым потом будет обращение, вместо того чтобы пробегать по все все таблице чтобы сцепить данные joinом
источник

SS

Steel Sword in CODE BLOG / Чат
4g
Ооо я не такой большой спец по этим вещам, но знаю что не  совсем декларативно - подходов, чтобы получить выборку данных по заданной структуре и заданным входным параметрам довольно много и порой зависит от СУБД, от того как сама СУБД будет видеть запрос и какие действия выполнит чтобы выдать ответ.
Чаще всего конечно есть очень простые варианты запросов, которые оптимизируются приблизительно в разных СУБД похожим способом.
Чаще всего это связано с избавлением от излишней "вложеннности" запросов, joinов ненужных, иногда при небольшом объеме проще из связанной таблицы выбрать во временную таблицу часть данных к которым потом будет обращение, вместо того чтобы пробегать по все все таблице чтобы сцепить данные joinом
Вроде еще какие-то индексы есть...
источник

󠀠

󠀠 in CODE BLOG / Чат
Steel Sword
У меня калькулятор.

Я делал с размахом в 2 этапа:
1. Парсинг на токены - объекты с общим наследником.
2. Сортировка в постфиксную форму, и одновременно, проверка правильности порядка.

Так как у меня котлин, я сделал в полу-функциональном стиле (анонимные функции с одинаковой сигнатурой в хеш-таблице), но можно просто через switch или if вызывать приватные классы метода.

Сперва парсинг.
Суть вот в чем: есть объект с состоянием. Там только поля, и вроде-бы еще был какой-то метод. Короче, заменитель struct'а.
И функции. Они принимают состояние, текущий символ и следующий символ. И типы:
Есть унарные операторы, числа, открывающие скобочки, закрывающие скобочки. Функции я отнёс к типа-унарным операторам. Когда уже идет работа с токенами, я часто писал (функция или унарный оператор). Ну похоже же:
sqrt(16) и -16
Из-за скобочек пришлось выносить функции в отдельный тип.

Ну так вот. В объекте есть стек для завершенных токенов, есть буфер для символов, чтобы по символам добавлять название функции или многозначное число, есть булевый флаг того, оператор ли сейчас или операнд, есть флаг того, была ли точка в числе. Это для борьбы с числами типа 23.345.3.456.
Глобальный цикл итерируется по символам, скидывает его функции, которая возвращает тип (я не помню, этой функции вроде бы нужен объект состояния), по типу получает соответствующую функцию, скидывает ей объект, текущий символ и следующий символ.
Если весь парсинг делать в одном классе с методами, то объект состояния не нужен, просто свойства в парсере. Я сперва так сделал, потом переделал на независимые функции.

Теперь самая главная вещь в алгоритме - это флаг оператор/операнд. Функция проверки говорит что текущий символ "+" - это бинарный оператор, но флаг стоит в положении операнд - функция для бинарных операторов выбрасывает исключение. И т.д.

У каждого типа своя маленькая функция. Например открывающая скобочка (она соответствует операнду):
Если сейчас оперетор:
   Выкинуть исключение
Иначе:
   Добавить OpenBracketToken() в стек.

Или вот бинарный оператор:
Если сейчас оператор:
   Добавить BinaryOperatorToken(symbol) в стек
   Переключить в операнд
Иначе:
   Выкинуть исключение

(два бинарных оператора не могут идти подряд). С помощью такого простого флага мы невзначай отсеиваем половину невалидных выражений, еще можем отличить унарный минус от бинарного.

Короче, как-то так. У функций и чисел проверяем следующий символ, если конец, выгребаем буфер в строку, потом в число если число, потом в токен. Если точка уже была (смотрим флаг), но появилась снова, выбрасываем исключение. И если следующий символ - не закрывающая скобочка, переключаем в с операнда в оператор, закрывающая скобочка тоже переключает в оператор если после нее не идет еще одна закрываюшая скобочка. Пробелы нужно пропускать. Думаю, все варианты сам разберешь. В конце вываливаем стек в массив.
В начало я кладу StartToken, в конец EndToken.
Итого у нас выходит вот такое. Из:
(sqrt(5) * 7)
Вот это (в котлине не нужен new):

[StartToken(), FunctionToken("sqrt"), OpenBracketToken(), NumberToken(5.0), CloseBracketToken(), BinaryOperatorToken('*'), NumberToken(7.0), CloseBracketToken(), EndToken()]

И вот содержимое части, занимающейся парсингом:

Класс с состоянием {
   Парочка
   Полей
}

Хеш-Таблица {
  Тип : Функция,
  Тип : Функция,
  Тип : Функция
}

Функция главного цикла { }

Проверка типа { }

А переделать  можно вот так:

Класс парсинг {
  Поле раз
  Поле два
  Поле три

  Главный цикл { }

  Получить тип { }
 
  Функция типа A { }
  Функция типа Б { }
  Функция типа В { }
}
Все, конечно же приватно.

Потом сортировка в постфикс, но это уже другая история, да и гуглится легко. Только мне пришлось еще придумать как обрабатывать функции (как унарный оператор, но после него обязательна скобочка).

Отдельная история - запятая аргументов функции.

Так как токены у нас - это классы, то мы можем запихать проверки вводимых данных, еще мне пришлось перегрузить операторы сравнения, чтобы NumberToken(5.0) был равен другому NumberToken(5.0).

Короче, думать пришлось много. И парочка костылей п
Хуячь статью на хабре
источник

4

4g in CODE BLOG / Чат
Steel Sword
Вроде еще какие-то индексы есть...
Индексы да, но я немного про другое. Кстати на той фото что на немецком классный пример 8.1.3 раздел.

Индексами все поля не обвесишь, потому что это будет тормозить работу.

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

Я тут как-то писал в нашем проекте одна небольшая хранимка, начитывала данные 4-5 раз, причем так, что оттуда по большому счету нужна была одна запись. Пока записей в главной таблице в пределах 3-5 ничего не замечаешь, а как только там 80-100 записей время запуска сервера приложения увеличивало на 40+ секунд.
источник

4

4g in CODE BLOG / Чат
󠀠
Хуячь статью на хабре
+++++
источник

SG

Spectra GameSport in CODE BLOG / Чат
С вами тут всегда интересно)) Нужный чат знаете ли)
источник

SS

Steel Sword in CODE BLOG / Чат
󠀠
Хуячь статью на хабре
Загрызут нафиг)))
источник

󠀠

󠀠 in CODE BLOG / Чат
Steel Sword
Загрызут нафиг)))
Не
Попытайся разжевать для новичков, и не сожрут
источник

SG

Spectra GameSport in CODE BLOG / Чат
Steel Sword
Загрызут нафиг)))
Та, эти диванные воины конечно могут что то написать, но тебе нужно не их мнение а решение)
источник

󠀠

󠀠 in CODE BLOG / Чат
Spectra GameSport
Та, эти диванные воины конечно могут что то написать, но тебе нужно не их мнение а решение)
++
источник

SS

Steel Sword in CODE BLOG / Чат
Один умник на гитхабе сделал примерно то же самое (только без функций), но уложился в 40 строк. У меня больше 500. Как - я вообще хз. Там какие-то странные методы из стандартной библиотеки, которые мне было лень гуглить.
источник

SG

Spectra GameSport in CODE BLOG / Чат
Если ты напишешь статейку на том же хабре, то тебе могут предложить решение с помощью которого ты реализуешь то, что тебе нужно) А страхи, лень и сомнения это все в голове)
источник

SG

Spectra GameSport in CODE BLOG / Чат
Но насчет решения еще как может повезти) Может нужному человек на глаза просто не попасть)
источник

D

Darya in CODE BLOG / Чат
Программисты несут материальную и уголовную ответственность во время исполнения проф обязанностей?
источник

t

the sentinel in CODE BLOG / Чат
Darya
Программисты несут материальную и уголовную ответственность во время исполнения проф обязанностей?
смотря что за ПО
если работают на ведомства и с гостайной - несут, за утечку информации
источник

PG

Pavel Grachev in CODE BLOG / Чат
Darya
Программисты несут материальную и уголовную ответственность во время исполнения проф обязанностей?
наши как-то обмолвились, что ответственность за производственное задание на мебелюху лежит на их стороне. если вдруг там ошибка какая-либо.
источник

SS

Steel Sword in CODE BLOG / Чат
Darya
Программисты несут материальную и уголовную ответственность во время исполнения проф обязанностей?
Чёт я не помню, чтобы кого-то посадили за баг 🤔
источник

D

Darya in CODE BLOG / Чат
Steel Sword
Чёт я не помню, чтобы кого-то посадили за баг 🤔
Счастливцы)
источник

SG

Spectra GameSport in CODE BLOG / Чат
Steel Sword
Чёт я не помню, чтобы кого-то посадили за баг 🤔
Ну если покемонов в церкве можно считать багом)
источник