В этой статье Алекса Пападимулиса вы можете увидеть этот фрагмент:
private void attachSupplementalDocuments()
{
if (stateCode == "AZ" || stateCode == "TX") {
//SR008-04X/I are always required in these states
attachDocument("SR008-04X");
attachDocument("SR008-04XI");
}
if (ledgerAmnt >= 500000) {
//Ledger of 500K or more requires AUTHLDG-1A
attachDocument("AUTHLDG-1A");
}
if (coInsuredCount >= 5 && orgStatusCode != "CORP") {
//Non-CORP orgs with 5 or more co-ins require AUTHCNS-1A
attachDocument("AUTHCNS-1A");
}
}
Я действительно не понимаю эту статью.
Я цитирую:
Если бы каждая константа бизнес-правила была сохранена в каком-то файле конфигурации, жизнь была бы намного [более ( sic )] трудной для всех, кто обслуживает программное обеспечение: было бы много файлов кода, которые совместно использовали один, большой файл (или, наоборот, куча крошечных конфигурационных файлов); развертывание изменений в бизнес-правилах требует не нового кода, а изменения файлов конфигурации вручную; и отладка намного сложнее.
Это аргумент против наличия целого числа «500000» в файле конфигурации или «AUTHCNS-1A» и других строковых констант.
Как это может быть плохой практикой?
В этом фрагменте «500000» не является числом. Это не, например, то же самое, что:
int doubleMe(int a) { return a * 2;}
где 2 - число, которое не нужно абстрагировать. Его использование очевидно, и оно не представляет собой то, что может быть использовано позже.
Наоборот, «500000» - это не просто число. Это значительная ценность, представляющая идею точки останова в функциональности. Этот номер можно использовать более чем в одном месте, но это не тот номер, который вы используете; это идея предела / границы, ниже которой применяется одно правило, а выше которого другое.
Как обращение к нему из файла конфигурации, или даже из того #define
, const
что предоставляет ваш язык, хуже, чем включение его значения? Если впоследствии программе или другому программисту также потребуется эта граница, чтобы программное обеспечение сделало другой выбор, вы облажались (потому что при его изменении ничто не гарантирует, что оно изменится в обоих файлах). Это явно хуже для отладки.
Кроме того, если завтра правительство потребует «Начиная с 5/3/2050, вам нужно добавить AUTHLDG-122B вместо AUTHLDG-1A», эта строковая константа не является простой строковой константой. Это тот, который представляет идею; это просто текущая стоимость этой идеи (то есть «вещь, которую вы добавляете, если регистр превышает 500 КБ»).
Позвольте мне уточнить. Я не говорю, что статья неверна; Я просто не понимаю этого; возможно это не слишком хорошо объяснено (по крайней мере для моего размышления).
Я понимаю, что замена любого возможного строкового литерала или числового значения на постоянную, определяемую или конфигурационную переменную не только не нужна, но и усложняет вещи, но этот конкретный пример, кажется, не подпадает под эту категорию. Откуда ты знаешь, что тебе это не понадобится позже? Или кто-то еще в этом отношении?