Зарегистрироваться | Поиск |
Результаты опроса: Как лучше оформлять несколько условий в select where? | |||
Я предпочитаю указывать операторы до условия | 27 | 60.00% | |
Я предпочитаю указывать операторы после условия | 15 | 33.33% | |
Нет предпочтений: иногда делаю так, иногда иначе | 3 | 6.67% | |
Не знаю/Мне все равно | 0 | 0% | |
Голосовавшие: 45. Вы ещё не голосовали в этом опросе |
|
Опции темы |
|
23.06.2011, 12:11 | #1 |
Участник
|
Как лучше оформлять несколько условий в select where?
***** опрос пересоздан Как лучше оформлять несколько условий в select where? Повторная попытка *****
В коде часто встречаются select c несколькими условиями. Вариант 1. (после условия) X++: select firstonly paymentTrans where paymentTrans.AccountNum == factureJour.CustVendInvoiceAccount && paymentTrans.Voucher == factureJour.Voucher && paymentTrans.CurrencyCode == factureJour.CurrencyCode && paymentTrans.PrepaymentFactureId_W == factureJour.FactureId && paymentTrans.Prepayment == NoYes::Yes; X++: select firstonly paymentTrans where paymentTrans.AccountNum == factureJour.CustVendInvoiceAccount && paymentTrans.Voucher == factureJour.Voucher && paymentTrans.CurrencyCode == factureJour.CurrencyCode && paymentTrans.PrepaymentFactureId_W == factureJour.FactureId && paymentTrans.Prepayment == NoYes::Yes; Перед условием или после условия? Почему? А в более сложны случаях? Например, X++: while select bankClientPayment_RU where bankClientPayment_RU.RContractAccount notexists join RContractTable where ( ( RContractTable.RContractPartnerType == RContractPartnerType::Cust && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust ) || ( RContractTable.RContractPartnerType == RContractPartnerType::Vend && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend ) ) && RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount && RContractTable.RContractCode == bankClientPayment_RU.RContractCode Последний раз редактировалось mazzy; 24.06.2011 в 16:52. Причина: добавил пояснение. добавил явное указание на "до условия", "после условия" |
|
23.06.2011, 12:26 | #2 |
Участник
|
Предпочитаю вариант 2:
X++: select firstonly paymentTrans where paymentTrans.AccountNum == factureJour.CustVendInvoiceAccount && paymentTrans.Voucher == factureJour.Voucher && paymentTrans.CurrencyCode == factureJour.CurrencyCode && paymentTrans.PrepaymentFactureId_W == factureJour.FactureId && paymentTrans.Prepayment == NoYes::Yes; 1) Более высокая читабельность кода; 2) Знаки && в начале каждого нового условия говорят о том, что данное условие является продолжением одного большого условия. Если же они стоят в конце, как в 1-м варианте, то снижается наглядность соединения условий. Данную привычку выработал, после прочтения книги Стива Макконелла "Секреты совершенного кода". Третий пример я бы, скорее всего, оформил так: X++: while select bankClientPayment_RU where bankClientPayment_RU.RContractAccount notexists join RContractTable where ((RContractTable.RContractPartnerType == RContractPartnerType::Cust && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust) ||(RContractTable.RContractPartnerType == RContractPartnerType::Vend && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend)) && RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount && RContractTable.RContractCode == bankClientPayment_RU.RContractCode
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 23.06.2011 в 12:30. |
|
23.06.2011, 12:34 | #3 |
северный Будда
|
Одно время ставил оператора в конце строки. Потом от этого отказался. Причина - добавление в select нового условия (или коммент старого) делать удобнее, если мы в той же строке указываем и оператор добавления. Иначе говоря, оператор после условия логически относится не к той строке, в которой он стоит, а к следующей.
Хотя эстетически первый вариант смотрится красивее
__________________
С уважением, Вячеслав |
|
23.06.2011, 12:37 | #4 |
Участник
|
|
|
23.06.2011, 12:37 | #5 |
Участник
|
Второй вариант, так как так нагляднее. В таком случае соблюдается правило Оператор <Условие>. Например,
Where <Условие> And <Условие> And <Условие> .... и видна некоторая законченная структура. А еще чем-то напоминает LINQ. В более сложных случаях еще стараюсь скобки оставлять на отдельной строке - помогает при отладке, когда приходится комментровать условия Последний раз редактировалось Lucky13; 23.06.2011 в 12:52. |
|
23.06.2011, 12:42 | #6 |
Участник
|
Ответил: "после условия", но обосновать причину не могу. Привычка эта вырабаталась уже давно, теперь пишу на задумываясь. В сложных случаях могу позвольть себе вынести оператор вообще на отдельную строку. Например так:
X++: while select bankClientPayment_RU where bankClientPayment_RU.RContractAccount != "" notexists join RContractTable where RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount && RContractTable.RContractCode == bankClientPayment_RU.RContractCode && ( ( RContractTable.RContractPartnerType == RContractPartnerType::Cust && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust ) || ( RContractTable.RContractPartnerType == RContractPartnerType::Vend && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend ) ) Последний раз редактировалось S.Kuskov; 23.06.2011 в 13:01. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
23.06.2011, 12:51 | #7 |
Участник
|
Насколько я вижу, вы не выравниваете операторы справа. так?
как относитесь к выравниванию? тратите ли время на выравнивание? (см. вариант 1 в исходном сообщении) |
|
23.06.2011, 13:23 | #8 |
Участник
|
|
|
23.06.2011, 13:04 | #9 |
Moderator
|
Использую второй вариант. Причины совпадают с изложенными первыми 3мя ответившими.
__________________
Андрей. |
|
23.06.2011, 13:50 | #10 |
Axapta
|
Привычный - первый вариант. Более удобный дла добавления новых условий - наверное второй. Использую - обычно первый. По причине того, что именно он чаще используется в стандартном приложении.
Сложный запрос написал бы как-то так: X++: while select bankClientPayment_RU where bankClientPayment_RU.RContractAccount notexists join RContractTable where ((RContractTable.RContractPartnerType == RContractPartnerType::Cust && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust) || (RContractTable.RContractPartnerType == RContractPartnerType::Vend && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend)) && RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount && RContractTable.RContractCode == bankClientPayment_RU.RContractCode Да! |
|
23.06.2011, 14:27 | #11 |
Участник
|
Тоже выношу оператор условия в начало строки.
where (...) AND (...) AND (...) Причины те же: 1. Наглядность (для меня) 2. Удобство добавления/удаления условий Трачу время на выравнивание для повышения наглядности кода. Для сложного условия постараюсь визуально выделить "не очевидные" операторы сравнения X++: while select bankClientPayment_RU where bankClientPayment_RU.RContractAccount notexists join RContractTable where ( ( RContractTable.RContractPartnerType == RContractPartnerType::Cust && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust) || ( RContractTable.RContractPartnerType == RContractPartnerType::Vend && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend) ) && RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount && RContractTable.RContractCode == bankClientPayment_RU.RContractCode То же самое делаю с математическими знаками в длинных выражениях X++: value = value1 + value2 - value3; Также, зачастую выношу запятые в списке параметров в начало X++: this.MyMethod(param1
,param2
,param3
);
container = [
value1
,value2
,value3
]; PS: Или я не понял формулировку голосования, или она противоречит нумерации примеров, приведенных в первом посте. Я так понимаю, что формулировка "оператор ДО условия" соответствует примеру №2 первого поста. Или это не так надо понимать? |
|
23.06.2011, 14:31 | #12 |
Участник
|
Может изменить формулировку пунктов голосования примерно так:
- Оператор сравнения в начале строки - Оператор сравнения в конце строки Термин "До/После условия", в данном случае, можно понимать очень по разному |
|
|
За это сообщение автора поблагодарили: Gustav (2). |
23.06.2011, 14:35 | #13 |
Участник
|
проголосовало уже 14 человек.
предлагаю не менять. если хочется, то лучше создать новую тему с новым опросом. здесь дать ссылку на новую. в новой дать ссылку сюда. |
|
23.06.2011, 14:54 | #14 |
Ищущий знания...
|
на прошлом месте работы, я писал операторы до условия:
X++: while select inventTable where inventTable.ItemId == '1' && inventTable.ItemName == '2' X++: while select inventTable where inventTable.ItemId == '1' //&& inventTable.ItemName == '2' // удобно while select inventTable where inventTable.ItemId == '1' //&& // неудобно //inventTable.ItemName == '2' P.S. если говорить кратко, то сейчас пользуюсь первым вариантом (по привычке), но считаю более удобным второй (почему написал выше). Вот такой вот, парадокс
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: mazzy (2), Pustik (2). |
23.06.2011, 16:16 | #15 |
северный Будда
|
Цитата:
Насчёт красоты - всё-таки эстетичнее, когда границы текста ровные и справа, и слева. Не зря же текстовые редакторы умеют выравнивать текст
__________________
С уважением, Вячеслав |
|
23.06.2011, 16:19 | #16 |
Ищущий знания...
|
Ага, люблю когда все выровнено и слева и справа и посередине
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
23.06.2011, 18:41 | #17 |
Участник
|
Вы удивитесь, но я предпочитаю ставить && слева, а || справа. (Если кто-то хочет пофлудить, то это отличная тема для флуда ). Аргументы:
- && слева - не требует дополнительного выравнивания - && слева - удобнее вставлять, убирать и комментировать условия - && слева, а || справа - улучшает восприятие, и уменьшает вероятность ошибки при последующем возможном изменении условия (!). Знаков && как правило много, а знак || как правило один, поэтому проблем с выравниванием с ним не возникает.. Если пишу сам с нуля - ставлю слева. Если модифицирую код, где стоят справа - то не меняю (ну разве что если условие сильно запутанное или я его сильно меняю). А еще я предпочитаю переносить "точку с запятой" отдельно на последнюю строку. Хотя иногда не делаю от лени. Аргументы для переноса: - удобнее вставлять дополнительную строку в условие - удобнее убирать (удалять или комментировать) последнюю строку в условии - дополнительная строка между этим и следующим оператором, содержашая только одну точку с запятой, улучшает визуальное восприятие кода |
|
23.06.2011, 19:28 | #18 |
Участник
|
а можно попросить отформатировать третий пример из первого в этой ветке сообщения.
любопытно было бы посмотреть |
|
23.06.2011, 21:05 | #19 |
----------------
|
1+2
Солидарен с Zabr
&& слева, || справа, ( ) меня пугают цель - быстро понять какие условия в запросе и какое нам мешает сначала читаются условия в одну строку начинающиеся с && потом с простыми перечислениями (например статусов) потом разбор сложных-многоскобочных (в них уже последовательность скобочек знаков и отступов определяется текущим ощущением прекрасного) X++: while select bankClientPayment_RU where bankClientPayment_RU.RContractAccount notexists join RContractTable where ( ( RContractTable.RContractPartnerType == RContractPartnerType::Cust && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust ) || ( RContractTable.RContractPartnerType == RContractPartnerType::Vend && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend ) ) && RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount && RContractTable.RContractCode == bankClientPayment_RU.RContractCode |
|
|
За это сообщение автора поблагодарили: Zabr (2). |
23.06.2011, 23:06 | #20 |
Участник
|
Уже столько всего сказано... я предпочитаю форматировать запросы так:
X++: while select createdbBy, createdDateTime, RecId from bankClientPayment_RU where bankClientPayment_RU.RContractAccount notexists join RContractTable where ( ( RContractTable.RContractPartnerType == RContractPartnerType::Cust && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust ) || ( RContractTable.RContractPartnerType == RContractPartnerType::Vend && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend ) ) && RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount && RContractTable.RContractCode == bankClientPayment_RU.RContractCode Собственно, основной принцип, как уже отмечали тут, - это возможность править впоследствии код, затрагивая минимум исходных строк, в идеале - лишь добавляя новые строки, чтобы на сравнении они были бы четко отделены от исходного варианта кода. В этом отношении очень раздражает, что в стандартном функционале какой-нить вызов метода с тучей параметров бывает если и написан даже с каждым параметром на отдельной строке, то последний обязательно оказывается на одной строке с закрывающей скобкой. Ну <censored> просто, ни фига о других не думают... |
|
Теги |
select, как правильно, оформление кода, условия |
|
Похожие темы | ||||
Тема | Ответов | |||
select в X++ и список значений в условии where | 20 | |||
QueryBuildRange в select.. where | 11 | |||
Разница NotInTTS и Found | 6 | |||
Вопрос про Demand Planner | 4 | |||
select * where ... | 10 |
|