Паттерн Related Table
Запись от dech размещена 17.10.2018 в 15:29
Пожалуй уже всем надоело каждый раз выискивать подходящий метод на таблице для поиска подчиненных (ну или просто связанных) записей. Возьмем к примеру таблицу SalesLine, у которой есть такие методы как salesTable(), inventTable(), inventDim() и так далее...
Т.е. у нас есть некоторый внешний ключ, по которому мы хотим найти связанную запись в таблице, для которой данный ключ является первичным. Чтобы не плодить кучу методов, я решил добавить один новый метод, который будет "лучше старых двух".
Как лучше к нему обращаться? Нужно,чтобы метод был универсальным, т.е. мог вернуть любую таблицу, какую хотим. Ну и конечно же необходима совместимость с самими методами, которые мы хотим заместить новым. Т.е. нужно добавить возможность выборки для обновления.
Таким образом, напрашиваются следующие варианты:
Это, конечно, немного длиннее, чем вызывать конкретно salesLine.salesTable(), однако читабельности это совсем не вредит. Второй плюс, уже более очевидный - это стандартизация кода. Когда видишь такие строчки, тебе четко ясно, что хотел донести разработчик. Третий плюс - нам больше не нужны методы salesTable(), inventDim() и им подобные! У нас есть один метод, который будет работать за всех остальных. Дармоеды нам не нужны!)))
Ну вот и сам метод:
Проявляется и четвертый плюс: расширяемость. Всегда можно добавить пару строчек кода и использовать единый метод в кастомном коде.
P.S. Спешу заметить, что могут встречаться несколько полей, ссылающихся на одну и ту же таблицу. Например FromInventDimId, ToInventDimId и т.д. По каждому из них хотелось бы искать связанную запись точно таким же способом. Напрашивается добавление параметра по FieldId, однако... лушчее - враг хорошего. Я предлагаю для таких случаев использовать отдельные методы, иначе данный паттерн потеряет свою простоту, а вместе с тем и свою привлекательность.
Т.е. у нас есть некоторый внешний ключ, по которому мы хотим найти связанную запись в таблице, для которой данный ключ является первичным. Чтобы не плодить кучу методов, я решил добавить один новый метод, который будет "лучше старых двух".
Как лучше к нему обращаться? Нужно,чтобы метод был универсальным, т.е. мог вернуть любую таблицу, какую хотим. Ну и конечно же необходима совместимость с самими методами, которые мы хотим заместить новым. Т.е. нужно добавить возможность выборки для обновления.
Таким образом, напрашиваются следующие варианты:
X++:
salesTable = salesLine.related(tablenum(SalesTable)); custTable = salesLine.related(tablenum(CustTable), true);
Ну вот и сам метод:
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, однако... лушчее - враг хорошего. Я предлагаю для таких случаев использовать отдельные методы, иначе данный паттерн потеряет свою простоту, а вместе с тем и свою привлекательность.
Всего комментариев 0