вторник, 6 января 2015 г.

Шаблон учетной системы: Настройки "по умолчанию"

(ВНИМАНИЕ! статья в работе! обратная связь принимается)


У настроек должно быть значение "по умолчанию". это должно обеспечить
возмоность использовать настройки более высокого уровня

Шаблон учетной системы: Удаление документов

(ВНИМАНИЕ! статья в работе! Обратная связь принимается)

Как удалять документы в учетной системе?
Или вопрос в общем виде: как удалять ОБЪЕКТЫ в учетной системе?

Обычный ответ: SQL-команда delete.

Но если вы делаете долгоживущую учетную систему, рекомендую задуматься о мягком удалении документов.

Суть: не давать обычному пользователю жестко удалить объект из системы.
Вместо удаления объект помечается удаленным.

Техническим языком можно описать так: у объекта добавляется реквизит: "удален".
Удаление документ интерпретируется как изменение объекта, а именно установка реквизита "удален"

Этот принцип реализован в 1С.

Какие объекты удалять мягко

Я бы рекомендовал мягко удалять все справочники и все документы.

О справочниках и документах см. в статье Шаблон учетной системы: основные виды объектов

Преимущества

В системе хранятся все объекты. Т.е. вы всегда сможете восстановить историю: кто удалял документ. Это основное преимущество больше относится к потребностям клиента/бизнеса, а не разработки, но бизнесу оно бывает очень важно и, если заложить мягкое удаление в архитектуру системы, вы сэкономите много времени в будущем.

Накладные расходы


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

Ручное вмешательство в автогенерируемый код
обычно удаление придется переписывать, если вы пользуетесь средствами генерирующими шаблоны запросов. Команду удаления вам придется заменить на команду изменения.

Ориентировочный вид команды:

update (имя_объекта) set IsDeleted = 1

Скрытие удаленных объектов в выборках
Вам нужно отслеживать, чтобы в выборках по умолчанию не было удаленных объектов.



Шаблон Учетной системы в БД: Наследование в базе

(Внимание! статья находится в процессе написания)

В цикл статей Шаблон Учетной системы:

Тема
наследование в базе

Обычно в учетных системах возникает 2 вида основных объектов

  •   справочник
  •   документ

идея такая:

в ключевых объектах существует ряд реквизитов, общих для всех объектов системы это
  • Дата создания
  • Автор
  • Дата последнего изменения
  • Последний изменивший
  • Признак удаления
Для справочников обычно выделяются такие поля
  • код
  • название
Для документов список общих полей такой
  • дата/время операции
  • номер документа
  • состояние (отношение к проведению)
Если позволяют возможности БД  я бы рекомендовал использовать общую таблицу типа "Системный объект" или "Базовый объект" в которой дублировать записи о любом объекте системы.

Применить такую технику наиболее просто, если вы используете Уникальные идентификаторы в качестве ключевых полей.

Тема использования уникальных идентификаторов применительно к MS SQL раскрыта в статье
MS SQL использование GUID как первичных ключей (Primary key)

UPD

ПРОБЛЕМА ВИРТУАЛЬНОГО НАСЛЕДОВАНИЯ!


Все хорошо звучало в теории.

Когда начал реализовывать систему на практике столкнулся с такой проблемой:

Суть проблемы: СУБД ничего не знает о выдуманном нами наследовании :(

Детали

Есть 2 таблицы объект (к примеру заказ: DocOrder) и таблица предок (BaseObject).
Объект связан с предком связью 1 к 1 (первичный ключ в DocOrder = первичный ключ в BaseObject)
Общие поля объектов находятся в BaseObject. в общих полях в частности есть поле "изменивший пользователь".
И теперь на триггере объекта DocOrder не могу повесить проверку контроля прав. т.к. триггер срабатывает до появления записи в таблице-предке BaseObject с общими полями.

Не нашел пока элегантного способа решения этого вопроса.
А это неудобство сводит на нет преимущества новой модели.

Отзыв о книге: Райан Бенедетти "Изучаем работу с jQuery" (серия "Head First")

Книга "Изучаем работу с jQuery" Р. Бенедетти, Р. КрэнлиКнига "Изучаем работу с jQuery" Р. Бенедетти, Р. Крэнли (на Озоне)
Книга "Изучаем работу с jQuery" Р. Бенедетти, Р. Крэнли (на Литресе)




Простая книга для начинающих. Думаю - неплохой старт для изучения jQuery. Читается быстро (я осилил за неделю), понимается легко.

Принципиально понравился подход с оформлением издательства HeadFirst: код и рисунки прямо по тексту. Врезки прямо в исходниках.

Обратная сторона медали - упрощенная подача материала. Простіе примеры.

Рекомендую новичкам для вхождения в тему или более опытным для систематизаци знаний.

Краткое описание

    место jQuery в триединстве: HTML-CSS-JAVASCRIPT
    По сути утилитная библиотека в двух словах её можно описать как "выбирай и действуй"


    ВЫБОР

        Главная функция
        jQuery() => $()

        $('id|класс|хтмл тег в css нотации' или элменеты страницы)

        $(document).ready(function(){
        })

        $(this) - текущий элемент

        методы для обхода дерева DOM.

    ДЕЙСТВИЯ

        визуальные (css: сдвиг, прозрачность, изменение размеров)
        события на действия объектов
        Ajax-вызовы
        работа с jSON


    + расширяем jQuery UI

        это
          + элементы (календари, попапы, таб-шиты, аккордеоны, бегунки, и др.)
          + расширенная анимация
          + локализация и стилизация


Главы книги

    1. Знакомство с jQuery
    2. Селекторы и методы
    3. События и функции
    4. Операции со структурой страниц
    5. jQuery эффекты и анимация
    6. jQuery и JavaScript
    7. Пользовательские функции для пользовтаельских эффектов
    8. jQuery и Ajax
    9. Данные JSON
    10. jQuery UI
    11. jQuery и API

Моя оценка: 4 из 5
Стоит ли читать: да, если вы начинаете знакомство с jQuery

Ссылки

Книга "Изучаем работу с jQuery" Р. Бенедетти, Р. КрэнлиКнига "Изучаем работу с jQuery" Р. Бенедетти, Р. Крэнли (на Озоне)
Книга "Изучаем работу с jQuery" Р. Бенедетти, Р. Крэнли (на Литресе)


Отзыв о книге: Роберт Матрин "Принципы, паттерны и методики гибкой разработки на языке C#"

Книга "Принципы, паттерны и методики гибкой разработки на языке C#" Р. С. Мартин, М. Мартин - купить книгу Agile Principles, Patterns, and Practices in C# ISBN 978-5-93286-197-4Книга "Принципы, паттерны и методики гибкой разработки на языке C#" Р. С. Мартин, М. Мартин - купить книгу Agile Principles, Patterns, and Practices in C# ISBN 978-5-93286-197-4

Интересная книга.

Главы:

Принципы гибкой разработки: итерации, тесты, пары, отсутствие перегрузов
принципы проектирования​ (SRP, OCP, Принцип подстановки лисков, ISR, DIP)

Обзор доступным языком UML диаграмм (Диаграммы классов, Объектов, Последовательности, Состояний )

Основные паттерны (Команда, Шаблонный метод, Стратегия, Одиночка, Моносостояние, Нулл-объект)

Что понравилось

В одной книге освещены разные аспекты и SOLID и UML и гибкая разработка

Что странно:

Базы данных - почти пофигу. О некоторых вещах автор говорит: я не разобрался и вы не лезьте.


Моя оценка: 4 из 5
Стоит ли читать: да.

Плохие практики при работе с БД

1. Запрос "СЕЛЕКТ ЗВЁЗДОЧКА"

Запрос вида

"SELECT * ..."

Почему плохо: потому что это мина замедленного действия, которая может приветси к торможению при расширении модели БД.
Пример: была таблица из 2-х полей к которой мы применили запрос select * и реально нам для работы в конкретном сценарии нужно было только эти 2 поля.
Через 2 года модеь расширилась, таблица выросла до 20-ти полей, причем появились "длиннотекстовые" поля и блобы(картинки).
Этот же запрос, даже там, где дотстаточно было бы 2- полей теперь всегда выбирает 20.
как нужно: явно указывайте выбираемые поля через запятую. Используйте sql-менеджер для ускорения работы (Детали - у Луценко)

2. Обращение к полям в датасете по номеру.


Это тоже "бомба замедленного действия" , т.к. запрос и обращение к его полям могут быть визуально разделены в прграмме. И, если через год кто-то добавит в средину запроса новое поле (расширяя модель), то сразу нарушится порядок полей. И весь ваш код, в котором Вы обращаетесь к полю по номеру - рушится.
И хорошо, если ошибка видна сразу, а может же случиться, что одно поле переместится на место другого поля, такого-же типа, явной ошибки не будет, и система будет продолжать считать, только данные уже будут не те (например если из-за сдвига подменится поле "сумма заказа" на "сумма заказа со скидкой").
Кроме того очень ухудшается читаемость кода. Как например найти нужное поле в 20-ти строках присваивания вида

ДатаСет.Поле[1] = значение
ДатаСет.Поле[2] = значение
ДатаСет.Поле[3] = значение
...
ДатаСет.Поле[20] = значение


Как нужно: обращайтесь к полям по имени.

3. Формирование запроса в коде путем склеивания строк (подстановка параметров в виде текста)


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

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

Перегнать DVD в AVI

Оставлю пока здесь

перегнать DVD в AVI