AXForum  
Вернуться   AXForum > Блоги > dech
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

Оценить эту запись

Паттерн Related Table

Запись от dech размещена 17.10.2018 в 15:29

Пожалуй уже всем надоело каждый раз выискивать подходящий метод на таблице для поиска подчиненных (ну или просто связанных) записей. Возьмем к примеру таблицу SalesLine, у которой есть такие методы как salesTable(), inventTable(), inventDim() и так далее...
Т.е. у нас есть некоторый внешний ключ, по которому мы хотим найти связанную запись в таблице, для которой данный ключ является первичным. Чтобы не плодить кучу методов, я решил добавить один новый метод, который будет "лучше старых двух".
Как лучше к нему обращаться? Нужно,чтобы метод был универсальным, т.е. мог вернуть любую таблицу, какую хотим. Ну и конечно же необходима совместимость с самими методами, которые мы хотим заместить новым. Т.е. нужно добавить возможность выборки для обновления.
Таким образом, напрашиваются следующие варианты:
X++:
salesTable  = salesLine.related(tablenum(SalesTable));
custTable   = salesLine.related(tablenum(CustTable), true);
Это, конечно, немного длиннее, чем вызывать конкретно salesLine.salesTable(), однако читабельности это совсем не вредит. Второй плюс, уже более очевидный - это стандартизация кода. Когда видишь такие строчки, тебе четко ясно, что хотел донести разработчик. Третий плюс - нам больше не нужны методы salesTable(), inventDim() и им подобные! У нас есть один метод, который будет работать за всех остальных. Дармоеды нам не нужны!)))
Ну вот и сам метод:
X++:
public Common related(TableId _tableId, Boolean _forUpdate = false)
{
    switch (_tableId)
    {
        case tablenum(SalesTable):
            return SalesTable::find(this.SalesId, _forUpdate);

        case tablenum(InventTable):
            return InventTable::find(this.ItemId, _forUpdate);

        case tablenum(InventDim):
            return InventDim::find(this.InventDimId, _forUpdate);
    }

    throw error(strfmt("Relation on %1 to %2 table not implemented yet", tableid2name(this.TableId), tableid2name(_tableId)));
}
Проявляется и четвертый плюс: расширяемость. Всегда можно добавить пару строчек кода и использовать единый метод в кастомном коде.

P.S. Спешу заметить, что могут встречаться несколько полей, ссылающихся на одну и ту же таблицу. Например FromInventDimId, ToInventDimId и т.д. По каждому из них хотелось бы искать связанную запись точно таким же способом. Напрашивается добавление параметра по FieldId, однако... лушчее - враг хорошего. Я предлагаю для таких случаев использовать отдельные методы, иначе данный паттерн потеряет свою простоту, а вместе с тем и свою привлекательность.
Размещено в Без категории
Просмотров 74817 Комментарии 0
Всего комментариев 0

Комментарии

 


Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:00.