|
|
|
Перечисления
|
|||
|---|---|---|---|
|
#18+
К примеру, в ДБ имеется сущность Applications. Эта сущность имеет свойство Decision, которое может принимать фиксированный набор значений - Arroved, Cancel и Declined. Этот набор значений лежит в своей таблице которая может иметь вид DecisionTypes(ID int, Description varchar(50)). Имеется соответствующий FK на таблицу Applications Нужно реализовать функцию типа ApproveApplication(appNumber). Вот как ее реализовать без хардкодинга либо ID либо названия решения? Т.е. будет получаться что-то типа Код: plaintext Eдиница получается расползется по коду разнообразных ХП. По сути, с тем-же успехом можно напрямую везде вписывать слово "Approve". Как этого избежать и вообще возможно-ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2011, 06:14 |
|
||
|
Перечисления
|
|||
|---|---|---|---|
|
#18+
stenford Как этого избежать и вообще возможно-ли?Боюсь совсем избежать хардкодинга не получится. В одном из проектов таблица DecisionTypes имела поле Code int not null unique которое было определено в приложении как именованная константа cnstApprove и была видима пользователям в отличие от ID. То есть код был как короткое имя величины которая может быть безболезненно переименована. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2011, 07:53 |
|
||
|
Перечисления
|
|||
|---|---|---|---|
|
#18+
stenfordКак этого избежать и вообще возможно-ли? Если оторваться от БД и подумать глобально, то способов избежать "хардкодинга вообще" при сохранении той же бизнес-логики не существует, существуют лишь способы заменить неудобный хардкодинг (например, единицу) более удобным (например, константой appApproved). Удобный хардкодинг имеет несколько отличительных особенностей: компилятор ловит синтаксические ошибки, лексема имеет легко читаемый вид, простые модификации легко осуществляются в небольшом количестве ясных по коду мест, идеально - в одном месте. В БД универсальный способ, отвечающий этим требованиям - использовать хранимки наподобие SetApplicationApproved, то есть по сути закодировать константы в названиях ХП. Также можно использовать [updateable] view с полями типа status_approved, status_declined etc. Кроме того, конкретные СУБД могут иметь специфические способы решения той же задачи. Итого - решения в принципе есть, но не факт, что лучше, чем уместный "прямой" хардкодинг. Например, в одной из своих разработок я поступил следующим образом: завёл пакет с константами (Oracle) и использовал их в серверном коде; в запросах же, приходящих с клиента, компонент запроса ловил фрагменты вида where status = &approved и подставлял туда распарсенное значение константы из пакета. Но в любом случае, это лишний повод подумать о том, чтобы изменить бизнес-логику с целью отказа от хардкодинга, и вместо чётко заложенной модели смены статусов предусмотреть более универсальную конфигурацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2011, 09:34 |
|
||
|
Перечисления
|
|||
|---|---|---|---|
|
#18+
Абсолютно все (даже маленькие) справочники хранить в БД. Никаких проблем с использованием в сторонних решениях (например репортеры, прочие системы) не будет. При этом никто не мешает их кешировать локально, чтоб каждый раз не подчитывать приложением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2011, 11:08 |
|
||
|
Перечисления
|
|||
|---|---|---|---|
|
#18+
LSVАбсолютно все (даже маленькие) справочники хранить в БД. Никаких проблем с использованием в сторонних решениях (например репортеры, прочие системы) не будет. При этом никто не мешает их кешировать локально, чтоб каждый раз не подчитывать приложением.Так у человека и есть справочник, от хардкодинга это это ведь не избавляет. Как уже сказал softwarer, это неизбежно, вопрос только в том, как сделать хардкодинг правильным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2011, 11:27 |
|
||
|
Перечисления
|
|||
|---|---|---|---|
|
#18+
Другое дело что "Например, в одной из своих разработок я поступил следующим образом: завёл пакет с константами (Oracle) и использовал их в серверном коде" так явно то не в plsql это не прокатит. Надо будет как-то с контекстами заморачиваться или с другим способом передачи константы в sql. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2011, 12:33 |
|
||
|
Перечисления
|
|||
|---|---|---|---|
|
#18+
softwarerсуществуют лишь способы заменить неудобный хардкодинг (например, единицу) более удобным (например, константой appApproved). ... Но в любом случае, это лишний повод подумать о том, чтобы изменить бизнес-логику с целью отказа от хардкодинга, и вместо чётко заложенной модели смены статусов предусмотреть более универсальную конфигурацию. да, make sense.. a что, есть методы отказа от перечислений? Ведь вообще-то они довольно много где используются, скажем права доступа для пользователя (full_access, view_access, none_access), стадии обработки какого-либо документа (на стадии обработки конструкторами, технологами, нормировщиками). Мне так кажется, что довольно много бизнес процессов завязано на логике типа "если документ такой-то, то отправляем его к технологам, иначе к нормировщикам". Тип обьекта вроде как менять нелогично (если документ у технологов - это тот-же документ что будет и у нормировщиков, если application было одобрено - все равно это то-же самое application что если-бы было отклонено). Т.е. вроде как переносить запись в таблицу "Одобрено" вместо смены одного аттрибута как-то совсем нелогично, а уж если у сущности несколько таких аттрибутов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2011, 01:21 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37077252&tid=1542343]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
395ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 670ms |

| 0 / 0 |
