Перейти к основному содержанию
`Ctrl`+`K`

# Полезные практики от опытных разработчиков

## Переопределение checkWorkAbility()

В `checkWorkAbility` нельзя использовать:

- `thisRop()`, заместо этого лучше использовать `getVar/getSelfVar`.

- обходчики, особенно с инвалидацией в БД (запросом на согласование данных в БД) (например, `refreshByParent()`).

Нужно понимать, что `checkWorkAbility` вызывается часто, поэтому его оптимизация сильно сказывается на времени работы бизнес-логики.

## session.flush() заместо session.commit()

`session.commit()` лучше избегать и использовать: `session.flush()`.

- `commit()` - выгружает данные из кэша в БД.

- `flush()` - применяет изменения сессии к БД.

В случае использования `flush()` данные ещё не в БД и есть возможность откатить изменения, например, в случае ошибки.

`commit()` вызывает `afterEdit()` с проверкой обязательных полей в отличии от `flush()`.

## Избегать использование [Option].get и [Collection].head

Не использовать для:

- Option `.get`, если внутри был `None`, то выпадет исключение.

  Использовать `.getOrElse(<значение или исключение, в случае None>)`.

- Коллекций `.head` без проверки на пустоту коллекции.

  Лучше использовать `.headOption`, что вернёт результат в конструкции `Option`, который дальше распаковать через `.getOrElse()`.

## Миксин Btk_Object

Миксин `Btk_Object` хранит все записи классов супер-типа документ и справочник.

В него нельзя вносить изменения! Это системный миксин.