Имя: Пароль:
1C
1С v8
Удобочитаемость кода
, ,
0 spectator_in
 
14.12.11
10:40
Часто встречаю вот такой код

Если Не НайденныйЗаказ = Справочники.Заказы.ПустаяСсылка() Тогда

и никак не пойму в чем потаенной смысл данной конструкции и почему нельзя вот так использовать, по моему первый вариант гораздо менее удобочитаем

Если НайденныйЗаказ <> Справочники.Заказы.ПустаяСсылка() Тогда

Единственное предположение что из-за неправильного интерпритатора 1с первый код выполняется быстрее чем второй.
41 spectator_in
 
14.12.11
11:25
(38)
какой агрессивный участник форума

отсюда вывод) неправильные привычки причина агрессии и нетерписомости)
42 vicof
 
14.12.11
11:26
(41) "нетерписомости" чего-чего?
43 spectator_in
 
14.12.11
11:27
(39) для boolean полностью согласен)
не писать же Если Васядурак=Ложь
44 spectator_in
 
14.12.11
11:27
(42) опичатка)
45 vovus
 
14.12.11
11:28
(43) ВасяДурак=Не(Сумма=1000)
46 DrHiHi
 
14.12.11
11:28
(40) ты еще предложи пользоваться PuntoSwich (вроде бы так пишется)
для тех кто лениться менять раскладку (таких как я) есть сочетание клавиши, типа "ALT + 60 (62)" ;))
47 spectator_in
 
14.12.11
11:28
Если Васядурак=Ложь Тогда

Хотя думаю найдутся люди которые так привыкли )
и ввели это в стандарт
48 IamAlexy
 
14.12.11
11:29
(43) вот и я про что..
и в итоге получается что для того чтобы не делать зоопарк из вариантов и чтобы текст смотрелся органично и "в едином стиле" - я везде пишу конструкции  "НЕ проверяемое_условие"

ибо:

1. это типа стандарт
2. это типа проще писать и проще читать
49 Axel2009
 
14.12.11
11:30
мне удобочитаемей НЕ Сумма = 100. глаза не режет =)
50 spectator_in
 
14.12.11
11:33
хм...

(48)

получается веселая конструкция

Если Не Переменная<>10 Тогда

))) так чтоль? круг замкнулся
51 DrShad
 
14.12.11
11:35
(50) Если Переменная = 10 Тогда
52 spectator_in
 
14.12.11
11:35
а если условий больше?

Если Не (Не переменная1 <> 6 ИЛИ Не переменная2 = 8) Тогда
53 Reset
 
14.12.11
11:35
по моему НЕ Сумма = 100  это из категории НЕ Отказ=Истина
54 Axel2009
 
14.12.11
11:35
(43) писать, если Васядурак может быть Неопределено, а проверить нужно на Ложь.
55 DrShad
 
14.12.11
11:36
(52) а вот это уже типичный быдлокод
56 IamAlexy
 
14.12.11
11:36
(50) да забудь ты про "<>"
57 spectator_in
 
14.12.11
11:37
чтобы текст смотрелся органично и "в едином стиле" - я везде пишу конструкции  "НЕ проверяемое_условие"

Это не я сказал
58 spectator_in
 
14.12.11
11:38
ладно, закрываю тему)
59 IamAlexy
 
14.12.11
11:38
(57) ептыть.. где я сказал что использую <> ?

как раз вместо проверки что А не равно Б  я использую конструцию "НЕ А=Б"  и не использую конструкцию "А<>Б"
60 vovus
 
14.12.11
11:39
Пока ВасяДурак<1000 Цикл
 ТекстКода="Если Не(Не"+ТекстКода+")";
 ВасяДурак=ВасяДурак+1;
КонецЦикла
61 IamAlexy
 
14.12.11
11:39
(59) для проверки
62 Reset
 
14.12.11
11:41
операторы >, >=, <= тоже лишние

можно вместо > писать "НЕ < И НЕ ="
вместо >= писать Не <
и тд

понапридумывали лишних операторов
63 IamAlexy
 
14.12.11
11:42
(62) вообще булево должно быть из одного значения "ложь"
если чо можно написать НЕ ЛОЖЬ :)
64 Reset
 
14.12.11
11:42
(63) Точно)
65 IamAlexy
 
14.12.11
11:43
(64) надо будет прикольнутся - сделать тотальную замену "ИСТИНА" на "НЕ ЛОЖЬ" в какойнить конфе - глянуть.. работоспособность сохранится ли...
66 Reset
 
14.12.11
11:44
имхо если в скобках (не ложь) то вполне :)
67 IamAlexy
 
14.12.11
11:45
(66) хотя да.. нверняка на какомнить тупорылом

если васядурак = истина Тогда

споткнется...
68 V_V_V
 
14.12.11
11:46
Всегда поражало переключать/не переключать раскладку. Всего-навсего поставьте шаблон от Груви (или напишите сами), включите автозамену и забудьте за переключение раскладок при комбинациях <> (бю), [] (хъ) и т.д. и т.п. - автоматом будет заменять.
69 pavig
 
14.12.11
11:46
(66) "НЕ" приоритетнее, можно без скобок
(0) в данном случае использую НЕ ЗначениеЗаполнено(..)
70 IamAlexy
 
14.12.11
11:48
(68) переключение раскладки - вторично..
первично именно "стандартизация" и "удобочитаемость"

использование "НЕ" удобнее и универсальнее...

в итоге выбор простой: либо у тебя в перемешку НЕ и "<>" либо всюду стандартно "НЕ"
71 vovus
 
14.12.11
11:49
(68) чтобы автозамена работала, надо будет еще пробелы нажимать
72 V_V_V
 
14.12.11
11:49
(70) Да я понимаю что вторично. Но тут этому уделено много внимания - так почему не использовать автозамену...
73 V_V_V
 
14.12.11
11:51
(71) Да, есть такое. Но можно настроить шаблон так, чтоб тебя выбрасывало после автозамены в любое место строки шаблона...
74 IamAlexy
 
14.12.11
11:52
(72) про раскладку тут речь идет в контексте "мало того что .... да еще и раскладку переключать"

то есть раскладка вторична. благо всякие снегопаты и прочие пунтосвитчеры могут эту проблему решить запросто...
75 vovus
 
14.12.11
11:52
(73) я имел в виду, ты не сможешь написать Сумма<>1000, надо будет пробел после Сумма нажать
76 V_V_V
 
14.12.11
11:53
(74) Я понял о чем ты говоришь. В твоем примере пробел придется ткнуть после "бю".
77 spectator_in
 
14.12.11
11:53
Стандарт всех языков программирования операторы сравнения
>
<
=
>=
<=
<> (!=)

А так же логические
НЕ (NOT)
ИЛИ (OR)
И (AND)

1с ники походу из-за неудобства раскладки свой стандарт ввели и перемешали операторы по сути разных классов
78 Evil-Wisp
 
14.12.11
11:53
(68) Удобно. Только автозамена неудобна, для этого и других шаблонов. Быстрей Ctrl+Q нажать когда нужно.
Я всегда использую <>. Не использую только для булева.
79 IamAlexy
 
14.12.11
11:55
(77) еще раз... стандарты действуют.. просто давай уточним


"не васядурак" это сравнение и или логика?
80 V_V_V
 
14.12.11
11:56
(75) Лично я на пробелы не жадный. :)
Кстати, не понимаю когда пишут "Сумма=Пер1+Пер2" вместо "Сумма = Пер1 + Пер2". Пробел самая большая кнопка, в нее тяжело промахнуться...   :)
Но это дело каждого....
81 spectator_in
 
14.12.11
11:57
(79) это логическое отрицание
82 artbear
 
14.12.11
11:58
ИМХО главное в коде, помимо его работоспособности - это легкость его прочтения и понимания.
Поэтому второй вариант намного удобнее, чем первый.
83 Buster007
 
14.12.11
11:59
только "НЕ"! А это <> убрать из возможностей для использования!
84 spectator_in
 
14.12.11
11:59
не васядурак
сокращенно от
васядурак = Ложь

так же как

Не Число = 5
сокращается до
Число <> 5

простота написания, удобство чтения)
85 IamAlexy
 
14.12.11
12:00
(81) то есть получается что НЕ используем. так?

продолжаем диалог:

"не признакдурачины = ДуракЛиВася()"

это что?
86 Evil-Wisp
 
14.12.11
12:02
(84)
Не васядурак
не сокращено никак.
Это просто "Не васядурак"
87 Rie
 
14.12.11
12:03
(77) Точно для всех? А то я в нескольких, видимо, малоизвестных, языках программирования пишу проверку на равенство как ==, а не как =
Наверное, мне надо отказаться от этих нестандартных языков?

Вообще, что за поиски панацеи и единственно верного стиля? НЕ А=Б вполне могло возникнуть после того, как "заинлайнили" какое-нибудь НЕ Подходит(А,Б) - и что теперь, вешаться из-за этого?
88 Axel2009
 
14.12.11
12:16
(77) в ява языке попробуй забацать выражение if(!1=1)
89 acsent
 
14.12.11
12:20
В стандартах 1С не рекомендует юзать " НЕ = "
90 spectator_in
 
14.12.11
12:27
(87) в большинстве случаев да
== сравнение
= присвоение

никто не городит избыточные конструкции
и уж тем более не возводит их в стандарт
91 Rie
 
14.12.11
12:38
(90) Или = - сравнение, а := - присваивание. У каждого языка - свой стандарт.
Что касается "городит избыточные конструкции" - как указал в (89) acsent - "избыточная конструкция" в 1С не только не является стандартной, но и не рекомендована. И если она встретилась где-то в коде - то это проблемы конкретного программиста. Возможно, это неаккуратность. Возможно, это и ошибка (например, НЕ А=Б вместо (НЕ А)=Б). А возможно, что этому и были какие-то причины так написать.
Но к 1С это не имеет никакого отношения. Пиши, как считаешь нужным.
92 Reaper_1c
 
14.12.11
12:40
В стандартах 1С точно не рекомендуется использовать ЗначениеЗаполнено(). Метод предназначен только для ситуаций с неопределенным типом, а для случаев когда заранее известны все возможные типы стандарт рекомендует делать сравнение со всеми пустыми значениями. Потому как ЗначениеЗаполнено() само по себе сравнивает передаваемое значение с пустыми значениями ВСЕХ типов платформы. А вообще я вам всем завидую, если у вас по основные потери времени - это превосходство "<>" над "НЕ ... =". Мне лично проще читать код написанный на русском языке, чем дешифровать операторы языка. Будь моя воля - я б еще и вот так писал:
93 Reaper_1c
 
14.12.11
12:41
Если Не Неопределено = Переменная тогда
   // обработчик
КонецЕсли;

Но коллеги жалуются, пришлось бросить.
94 acsent
 
14.12.11
12:42
лучше так:
Если Не Не Не Неопределено = Переменная тогда
95 spectator_in
 
14.12.11
12:43
(87)
просто моя главная специализация это интерфейсы, юзабилити.
Еще многолетный опыт работы в команде программеров с разными стилями тоже наложил отпечаток.
Если есть оператор <> заменяющий два оператора Не =
Значит его не просто так придумали. Проще код проще понимание.
Рекомендацию (если она есть) 1с к использованию такой конструкции могу зачесть только как "временно латание бага интерпритатора"

Если Число<>5 Тогда - лаконично (читается "если число не равно 5 тогда")
Если НЕ Число=5 Тогда - избыточно ( читается "если не число равно 5 тогда")

В нормальной человеческой логике есть понятие "Это не яблоко"
И только программерский ум мог породить "Не(это яблоко)" и считать это нормой

Если Число>=5 Тогда - лакончино (читается "если число больше или равно 5")
Если Число>5 И Число=5 Тогда - тоже избыточно
96 Reaper_1c
 
14.12.11
12:50
(94) Пример надуманный конечно. Обычно нужна конструкция:
Если Неопределено = Переменная тогда
   // обработчик

КонецЕсли;

Тут вернее всего особенности восприятия винованы. Видя запись "Не неопределено" я например фокусируюсь на условии, а "Если Переменная" - сначала вспоминаю что у меня там лежит, или лезу разбираться, что туда положили. А обычно знать что там лежит даром не надо.
97 acsent
 
14.12.11
12:52
(96) Если 5<Число Тогда
Тоже так пишешь?
98 Reaper_1c
 
14.12.11
13:01
(97) Сравнение с числом? А такое нужно на практике??? Не пишу - не приходилось.
99 Rie
 
14.12.11
13:03
(95) А какой "баг интерпретатора"? Или такое полезное качество, как "ортогональность конструкций языка" Вы считаете багом?
Как раз ситуация, когда язык программирования запрещает по каким-то там высшим причинам использовать синтаксически и семантически корректную конструкцию - это не "юзабилити", а маразм. НЕ применяется к любому логическому выражению; А=Б - логическое выражение. И даже А<>Б - тоже логическое выражение. Значит, если кто-то решит написать НЕ А=Б или даже НЕ А<>Б - интерпретатор обязан это обработать. А если что-нибудь вместо этого вякнет - вот это уже будет баг.
100 M0narch
 
14.12.11
13:03
100 )
101 Neco
 
14.12.11
13:08
(0) Мне кажется такие конструкции использую по инерции, есть много кошерных вариант использование оператора "Не", например в функциях, которые возвращают логическое значение:
Если Не ЗначениеЗаполнено(Переменная) Тогда
....
102 Wingless
 
14.12.11
13:08
(97) похоже на наследие С++ с его == и =. Если ошибиться и написать 5=а, ошибка обнаружится сразу, а вот при записи а=5 нет.
103 Reset
 
14.12.11
13:11
(92) "ЗначениеЗаполнено() само по себе сравнивает передаваемое значение с пустыми значениями ВСЕХ типов платформы"
Есть источник? Любопытно. Полагал(ю) что сравнивается только пустым значением того типа, что и переменная (ну несколько сложнее с составным типом, но и там явно не со всеми типами платформы)
104 Wingless
 
14.12.11
13:12
В случае (0), когда условие простое, пишу
Если НайденныйЗаказ = Справочники.Заказы.ПустаяСсылка() Тогда
Иначе
...
КонецЕсли;
Имхо проще читается
105 Rie
 
14.12.11
13:14
(103) В 8.0 не было ЗначениеЗаполнено, но была функция в общем модуле.
Эта функция смотрела тип значения и сравнивала его с пустым значением этого типа.
С составными типами проблем нет, поскольку _значение_ всегда имеет тот или иной конкретный тип.
106 GoldenDawn
 
14.12.11
13:15
(0)
Не ... =
так пишут тру программисты
107 Reset
 
14.12.11
13:16
(105) Про 8.0 - я в курсе, спасибо)
Про составной - ну тем более.
108 Rie
 
14.12.11
13:18
(107) Приношу свои извинения. _Крайне_ невнимательно прочитал.
109 iomoe
 
14.12.11
13:46
(0) интерпритатор правильно писать так: интерпретатор, а НайденныйЗаказ <> так: Не НайденныйЗаказ =
110 Reaper_1c
 
14.12.11
13:51
+(103) На актуальной версии не нашел этой рекомендации. Зато нашел, что этот метод платформа использует для обработки проверки заполнения реквизитов. По всей видимости фичу оптимизировали. Спасибо за пинок, подновил знания.
111 spectator_in
 
14.12.11
14:26
(99)
"А какой "баг интерпретатора"? "
Баг интерпритатора интерпретировать по разному указанные в (0) строчки кода

"Или такое полезное качество, как "ортогональность конструкций языка" Вы считаете багом?
Как раз ситуация, когда язык программирования запрещает по каким-то там высшим причинам использовать синтаксически и семантически корректную конструкцию - это не "юзабилити", а маразм. НЕ применяется к любому логическому выражению; А=Б - логическое выражение. И даже А<>Б - тоже логическое выражение. Значит, если кто-то решит написать НЕ А=Б или даже НЕ А<>Б - интерпретатор обязан это обработать. А если что-нибудь вместо этого вякнет - вот это уже будет баг."

Интерпритатор прекрасно отработает и
Если Не Не Не Не Число=1 Тогда

Но вот программера который раздувает на пустом месте лишние операторы (не важно по каким причинам) как то сложно считать хорошим кодером.


Жуть какой диспут поднялся по такому по сути пустяковому вопросу)
Вот он "русский бейсик" )
112 orefkov
 
14.12.11
14:29
(63)
Правильно писать не "НЕ ЛОЖЬ" а "НЕ КЛАДИ" :)
113 orefkov
 
14.12.11
14:32
(94)
Два "Не" подряд интерпретатор 1С не пропустит.
Тольк "Не(Не "
114 orefkov
 
14.12.11
14:34
(111)
Насчет "Не Не Не Не" см. (113)
115 spectator_in
 
14.12.11
14:44
Насколько я понял тема очень актуальная))

Надо написать в 1с чтобы просто ввели сишное !=
и проблема решена)
раскладку переключать уже не надо)
116 Rie
 
14.12.11
14:46
(111) Что значит "интерпретатор по разному интерпретирует указанные в (0) строчки кода? Проверьте - результат вычисления будет одинаковым.
Или Вы упрекаете авторов интерпретатора в том, что они плохо оптимизируют генерируемый код? Тогда так и пишите - "плохая оптимизация", а не "баг".
(Вообще говоря, хорошая оптимизация в _интерпретаторах_ - скорее исключение, нежели правило).

А насчёт диспута - не помните, кого этот пустяковый вопрос затронул настолько сильно, что он тут тему создал?
117 vovus
 
14.12.11
14:49
(115) а тогда левым пальцем надо будет тянуться к !, а правым - к =. А потом, для отдельно стоящих < и > все равно придет раскладку переключать
118 Rie
 
14.12.11
14:50
(115) Гениально! И сотни тысяч программистов будут обеспечены (высокооплачиваемой) работой по срочной замене в десятках миллионов строк кода "<>" на "!="... Да, вот это "юзабилити"!

Ну так ли уж принципиально - <> или != или как-то ещё? (разумеется, за уши притянутые объяснения, что надо именно вот так, а не от сяк - появятся в изобилии).
119 Mort
 
14.12.11
14:51
Лучше бы ввели += и т.п.
120 Reaper_1c
 
14.12.11
14:55
Лучше бы ТС зарплату сдельную получал.
121 spectator_in
 
14.12.11
15:17
(118)
!= как равноценный оператор с <>
зачем же ломать построенное...

вроде программеры отличались логикой...
простой код понятный код

может еще тему открыть о замене оператора вычитания? -

Число = Число1 - Число2; убираем и признаем стандартом

Число = -1*Число2 + Число1;

Ведь полюбому найдется человек которому так читать удобнее ;)
122 spectator_in
 
14.12.11
15:18
(120)
да уж... насмотрелся я на франчкод "лишбыработало"
123 artbear
 
14.12.11
15:20
(112) (orefkov) Кстати, Саш, а может быть, добавить замену != на <> в Снегопат?
ЗЫ да и в обычные шаблоны можно :)
124 MatrosoV AleXXXand_R
 
14.12.11
15:21
ИМХО
Вот так лучше смотрится;

Если НЕ ЗначениеЗаполнено(НайденныйЗаказ) Тогда
125 Lys
 
14.12.11
15:22
(0) А мне - покуй. Я и так, и так прочитаю.
Наносекунды разницы по времени исполнения меня мало волнуют, чтобы из-за них себе моск иметь.
126 Поручик
 
14.12.11
15:56
А ещё бы ввели .=, оператор объединения With
127 k_aleks80
 
14.12.11
16:02
(0) Поддерживаю ТС. Лично мне его вариант более удобен и понятен.
128 Reaper_1c
 
14.12.11
16:43
*достал канистру с бензином*
(122) Зато у них уже работает, а ты еще даже писать не начал.
129 spectator_in
 
14.12.11
17:03
(128)
вазы тоже сотнями клепают
но восхищяются все таки мазератти и бугатти

не все можно мерить деньгами)
даешь движение "За красоту КОДА" )
130 Reaper_1c
 
14.12.11
17:38
131 spectator_in
 
15.12.11
09:25
(130)
полнейшая чушь)
132 Reset
 
15.12.11
10:40
(124) Забавно, что большинство показывающих пример, как надо, при этом меняют условие из (0) на обратное. Тенденция? :)
133 Rie
 
15.12.11
16:29
(121) Хм... Вам же уже сказали, что НЕ А=Б _не_ рекомендуется писать. Вы же упорно рассуждаете о каких-то "стандартах"...
134 Vladal
 
15.12.11
17:35
(35) А шаблоны автозамены отменили?
У меня просто старый релиз, 8.14.540 ну и 7.70.027
135 Vladal
 
15.12.11
17:47
(115) У меня как раз в шаблонах сначала так и было - != заменялось на <>.
Потом я стал использовать БЮ, Б, Ю, Б= и Ю=.

Никаких извращений. Впервые такой подход я заметил в восьмерочных конфигурациях.
Так и понял, что кому-то было влом написать шаблон, а писать дополнительных 3 символа "НЕ " не влом.
136 TeddySlaf
 
15.12.11
18:50
иной раз проще написать вместо

Если текЗн <> предЗн  Тогда
  предЗн = текЗн;

вот так

Если текЗн = предЗн  Тогда
Иначе
  предЗн = текЗн;

:)
137 Эмбеддер
 
15.12.11
19:02
(136) +1 чтобы не запутаться в логике
138 kosts
 
15.12.11
19:31
(136) Особенно, если чуть позже и для "истины" вариант находится :)
139 Нуф-Нуф
 
15.12.11
19:39
Есть стандарты разработки
140 spectator_in
 
16.12.11
11:12
(136) вот к этому варианту у меня претензий нет)