11.03.2019, 11:11 | #1 |
Участник
|
axforum blogs: Паттерн Related Table
Источник: //axforum.info/forums/blog.php?b=8266
============== Пожалуй уже всем надоело каждый раз выискивать подходящий метод на таблице для поиска подчиненных (ну или просто связанных) записей. Возьмем к примеру таблицу 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, однако... лушчее - враг хорошего. Я предлагаю для таких случаев использовать отдельные методы, иначе данный паттерн потеряет свою простоту, а вместе с тем и свою привлекательность. Источник: //axforum.info/forums/blog.php?b=8266
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
|
|