Не спеша, эффективно и правильно – путь разработки. Часть 3. Практика

0. WildHare 342 29.06.20 14:48 Сейчас в теме
Черновой вариант книги Никиты Зайцева, a.k.a.WildHare. Разработкой на платформе 1С автор занимается с 1996-го года, специализация — большие и по-хорошему страшные системы. Квалификация “Эксперт”, несколько успешных проектов класса “сверхтяжелая”. Успешные проекты ЦКТП. Четыре года работал в самой “1С”, из них два с половиной архитектором и ведущим разработчиком облачной Технологии 1cFresh. Ну — и так далее. Не хвастовства ради, а понимания для. Текст написан не фантазером-теоретиком, а экспертом, у которого за плечами почти двадцать три года инженерной практики на больших проектах.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. a_a_burlakov 30.06.20 09:21 Сейчас в теме
Считаю, что по этическим причинам администрация Инфостарта должна где-то наградить, как-то закрепить или чем-то выделить эти публикации, чтобы больше джуниоров из разных 1С-Франчайзи эту книгу увидели и в свою кровь всосали эти правила. Мир стал бы чище.

Словом "должна" я, конечно, преувеличиваю, но какая же полезная информация. Её действительно можно узнать либо от очень адекватного руководства, либо читая западную литературу по чистоте кода, либо долго копаясь в стандартах и методиках 1С, либо набивая шишки в течение многих лет. А тут - прямо очень удобная точка входа в профессиональную разработку, интересно и обстоятельно описанная.

Закинул денег на карту и всех призываю к этому. Была бы книга в печати - купил бы только за эту главу, хотя 1-2 и, уверен, следующие тоже очень полезны.
wowik; o.nikolaev; mvxyz; Rais96; Andreynikus; WildHare; +6 Ответить
3. Rustig 1533 30.06.20 11:03 Сейчас в теме
наглядный пример плохого кода - отрицания отрицательных флагов, используется сейчас в механизмах маркировки:
Если Не (ДополнительныеСвойства.Свойство("НеРассчитыватьКоличествоВложенныхШтрихкодов")
		И ДополнительныеСвойства.НеРассчитыватьКоличествоВложенныхШтрихкодов) Тогда
	
		РассчитатьКоличествоВложенныхШтрихкодов();
		
	КонецЕсли;
	
	Если Не (ДополнительныеСвойства.Свойство("НеРассчитыватьХешСумму")
		И ДополнительныеСвойства.НеРассчитыватьХешСумму) Тогда
		
		Если ТипУпаковки = Перечисления.ТипыУпаковок.МаркированныйТовар Тогда
			ХешСумма = "";
		Иначе
			ДанныеДляВычисления = Справочники.ШтрихкодыУпаковокТоваров.ДанныеДляВычисленияХешСуммы(ЭтотОбъект);
			ХешСумма = Справочники.ШтрихкодыУпаковокТоваров.ХешСуммаСодержимогоУпаковки(ДанныеДляВычисления);
		КонецЕсли;
		
	КонецЕсли;
Показать
triviumfan; WildHare; +2 Ответить
4. antonivan 30.06.20 12:41 Сейчас в теме
Интересно, что подход автора к комментированию кода прямо противоположен мнению Роберта Мартина (автора "Чистого кода"), который считает наличие комментария в коде признаком того, что программисту не удалось достаточно ясно сформулировать в виде программного кода свою мысль, и поэтому как только возникает желание написать комментарий следует подумать, достаточно ли прозрачна логика комментируемого метода. Не Мартину ли автор передает привет, упоминая изделие "Молчаливый Боб"?)
ashinkarenko; zqzq; +2 Ответить
5. zqzq 21 30.06.20 13:26 Сейчас в теме
(4) Про запихивание параметров в структуру Мартин тоже не лестно отзывался -- по сути создаётся искусственный объект только для того, чтобы "загрести мусор под ковёр". Т. е. вместо исправления разросшейся функции с >7 параметров, параметры прячутся, что только усложняет использование/тестирование/понимание функции. Чисто 1С-ное ноу-хау, частично следуемое из отсутствия ОПП. Но я лично против такого подхода, только добавляется дополнительный уровень сложности (ещё 1С советует специальные функции-помощники, которые создают пустую структуру параметров для главной функции... бррр...).

Но комментирование именно программного интерфейса (экспортных методов) вполне разумно и не противоречит Мартину. Особенно когда нет типизации параметров в 1С.
6. antonivan 30.06.20 14:59 Сейчас в теме
(5) Согласен, что с учетом отсутствия типизации в 1С ценность заголовочных комментариев с описанием параметров значительно повышается.
22. AnatolPopov 69 04.07.20 20:49 Сейчас в теме
(4) Когда я листал упомянутую книгу, хотелось назвать ее "Сферический чистый код в вакууме" ;)
27. ltfriend 510 10.07.20 08:51 Сейчас в теме
Речь об заголовочном описании процедуры/функции, а не о комментировании кода.
А про запихивание параметров в структуру. Так это вынужденная мера из-за отсутствия ООП. И вот вместо передачи объекта со своими свойствами и методами приходится применять структуру, а процедуру, которая заполняет такую структуру значениями по умолчанию можно рассматривать как подобие конструктора. И лучше передать структуру (типа, объект), чем 100500 параметров, особенно, если половина из них в большинстве случаев использует значения по умолчанию. А если среди параметров у вас есть мусор, то, может, не заметать его под ковёр, а просто выкинуть (удалить ненужные параметры/свойства)?
7. pm74 176 30.06.20 20:42 Сейчас в теме
как всегда интересно , поставил +
некоторые соображения по поводу правила одного экрана :
декомпозиция на составные части - это правильно , но лично у меня начинается просто "ацкий батхерт" когда (и особенно в типовых конфигурациях) пытаешься понять логику какого нибудь метода и это происходит примерно так F12 -> F12 -> F12 -> F12 -> F12 -> F12 -> F12 -> F12 -> F12 -> Сtrl(-) -> Сtrl(-) -> Сtrl(-) -> Сtrl(-) -> Сtrl(-) -> Сtrl(-) -> Сtrl(-) -> Сtrl(-) -> Сtrl(-) -> Сtrl(-) ->
и это еще в лучшем случае , потому что может быть и так
МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
МодульУправлениеДоступом.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей(Источник, Отказ, РежимЗаписи, РежимПроведения);
// это код из первого попавшегося общего модуля конф.  БСП 

и где тут простота и удобочитаемость ???

зы. глаз зацепился за ошибку в процедуре СделатьВсеКакНадо
..
//ЗагрузитьРасчетныеДокументы(..., ПараметрыМетода = Неопределено); заменить на 

ЗагрузитьРасчетныеДокументы(..., ПараметрыМетода );

// иначе ПараметрыМетода  станут  Истина и ошибка  ретранслируется в остальные процедуры
dabu-dabu; bulpi; WildHare; orefkov; Rais96; Rustig; +6 Ответить
9. pm74 176 30.06.20 21:42 Сейчас в теме
(7) " ПараметрыМетода станут Истина " опечатка конечно
10. WildHare 342 01.07.20 15:20 Сейчас в теме
(7) Да, действительно, это опечатка, код писался с голоса. Исправим. Спасибо за наблюдательность ;-)
11. WildHare 342 01.07.20 15:33 Сейчас в теме
(7) Вроде бы, путешествие по стеку можно немножко сократить, например, вот так:
- F9
- F5
- Ctrl+Alt+C
- О_О ???????
- PROFIT!!!!!
Хотя, конечно, двадцать уровней стека – это, мягко говоря, перебор.
Что же до техники «Условный вызов БСП», то это очень старый объект критики, платформа позволяет написать так, чтобы и синтаксический контроль не ругался, и контекстная подсказка работала, но увы – так исторически сложилось™, ничего не поделать.
33. Cyberhawk 120 31.07.20 09:39 Сейчас в теме
(11)
платформа позволяет написать так
А как?
8. Andreynikus 1338 30.06.20 21:09 Сейчас в теме
Огромное спасибо за труды! Эх, эту бы книгу да разработчикам типовых...
wowik; bulpi; WildHare; mvxyz; +4 Ответить
12. bulpi 174 01.07.20 19:15 Сейчас в теме
"отладчик в седьмой платформе был настолько не похож на нынешний, и работа с ним была настолько, скажем так, своеобразной, что у тогдашних специалистов-разработчиков этот инструмент пользовался крайне ограниченным спросом. В ходу были другие средства и способы."

УУПС! Не понял! Я что-то пропустил в своем знакомстве с 7.7 с 199... года ? Какие на фиг "другие средства и способы" ????
19. WildHare 342 02.07.20 12:03 Сейчас в теме
(12) Наверное, пропустили 7.0 и 7.5 ;-)

Если же серьезно – перезапуск всей отладочной механики после внесения в код мелкой поправки был занятием настолько муторным, что очень многие специалисты этой механикой просто не пользовались. Гораздо проще было добавить какой-нибудь ФлагОтладки, пару универсальных функций и писать телеметрию в обычный текстовый лог, не говоря уже о примитивных приемчиках типа

табТовары.ВыбратьСтроку();

которые попадаются даже и в современном «восьмом» коде. Много было разных способов.
dabu-dabu; +1 Ответить
13. Vortigaunt 82 01.07.20 23:52 Сейчас в теме
Какие же длинные части. Как здесь закладку поставить?
По поводу английского языка позвольте все-таки высказаться. Не все аспекты автор указал.
В английском языке меньше букв и при этом самые употребляемые слова содержат преимущественно один слог. Или для таких слов есть жаргонизм с одним слогом. В любой сфере деятельности так, и в IT тоже постарались так сделать.
try - catch (против Попытка - Исключение)
case when then end (против Выбор Когда Тогда Конец)
if else (против Если Тогда)
В предметной области тоже самое:
good (Товар)
unit (Единица измерения)
cash (Наличка)
И в повседневной жизни. Например транспортные средства:
car, bike, ride.
Плюс начертание латинских символов визуально проще, чем кириллических (хотя и ненамного).

Это, с моей точки зрения, преимущества английского безотносительно сферы употребления. В 1С же код лучше писать на русском, как бы это не смешно звучало, ради того, чтобы реже переключать раскладку. Думаю, по этому поводу многие завидуют американцам. Им вобще не приходится переключаться. А предметную область как раз можно изложить на английском. Привычные нам термины учета все переведены если не с английского, так с немецкого.
16. Rais96 02.07.20 11:28 Сейчас в теме
(13) То что в английском меньше букв это никак не преимущество, а наоборот. Термины в русском более понятны, unit в английском имеет несколько понятий, Единица измерений имеет однозначное толкование.
WildHare; +1 Ответить
18. WildHare 342 02.07.20 11:56 Сейчас в теме
(13) У английского языка по сравнению с русским есть один чудовищный недостаток – английский язык необходимо специально изучать, и далеко не в рамках школьной программы. Тогда уже более логичным выглядит разработка специального айтишного диалекта эсперанто, в комплект к дотракийскому и валирийскому языкам. В плане языковой стройности и легкости изучения это будет гораздо продуктивнее английского. Это первое.
Так называемая краткость английских слов является довольно зыбким аргументом в виду огромного количества значений и сильнейшей контекстуальной зависимости таких слов. Строго говоря, в русском есть прекрасный аналог, когда при помощи всего-то трех словоформ можно описать любую ситуацию из любой предметной области. Правда сейчас, кажется, публикация таких описаний даже в формате программного кода является противозаконной. Это второе.
Ну и третье – достаточно посмотреть английский стенд-ап, высмеивающий даже не американский диалект (А знаете, как они называют конкур? «Катание на спине лошади», им же приходится уточнять и про спину, и про лошадь. А знаете, как они называют сквош?), а хотя бы шотландскую версию английского, чтобы понять – завидовать там нечему.
20. Vortigaunt 82 02.07.20 21:37 Сейчас в теме
(18)
У английского языка по сравнению с русским есть один чудовищный недостаток – английский язык необходимо специально изучать, и далеко не в рамках школьной программы.

Речь же шла не об общении на английском, а о написании программного кода. Чтобы писать код язык вобще можно не знать. Intellisense и Copy-Paste творят чудеса. Я лично наблюдал, как абсолютно безграмотные в переписке люди писали рабочий и понятный код.
Допустим, человек не знает ни русского ни английского. Какой язык ему проще выучить? Я уважаю 1С за популяризацию идеи: писать программный код на родном языке, но мировое сообщество программистов все-таки общается на английском.
Меньше букв и упрощенное начертание символов - все-таки преимущество. Простыня текста из коротких слов, которые состоят из простых символов воспринимается легче. Вы можете этого не замечать в печатном тексте, но попробуйте написать текст от руки. Если у вас плохой почерк, то английский текст будет разборчивее, чем русский.
Вот что реально доставляет неудобство, так это "QWERTY" раскладка клавиатуры. Ее специально придумали неудобной, чтобы снизить скорость нажатия на клавиши. На древних печатных машинках клавиши заедали. А то я с трудом освоил "QWERTY" и думаю: а почему же так тяжело текст набирать? Реально мизинцы устают сильнее, чем на кириллице. А оно вон в чем дело.
WildHare; +1 Ответить
14. Hans 1 02.07.20 09:00 Сейчас в теме
выложи все в ПДФ сюда за деньги.
a_a_burlakov; +1 Ответить
15. kalyaka 583 02.07.20 11:19 Сейчас в теме
Возврат Запрос.Выполнить().Выгрузить().Свернуть("Ссылка").ВыгрузитьКолонку("Ссылка");
Преимущество такого кода в том, что в нем нет промежуточных состояний. Неправильное использование лишних переменных тоже является частым источником ошибок в алгоритмах.
17. WildHare 342 02.07.20 11:40 Сейчас в теме
(15) В данном конкретном случае «лишние» переменные позволяют получить доступ отладчиком ко всем промежуточным результатам работы кода. Это преимущество представляется более важным, чем гипотетическая опасность запутаться в трех соснах.
Simonov_NPM; +1 Ответить
21. orefkov 1012 02.07.20 23:41 Сейчас в теме
Многие из практик, идущих в начале статьи и касающиеся работы с кодом - можно и нужно ставить под автоматический контроль. Благо прогресс не стоит на месте и появляются инструменты для расширенного анализа кода 1С. Например, bsl-language-server кучу встроенных диагностик имеет. Вот как небольшой пример:
Прикрепленные файлы:
23. AnatolPopov 69 04.07.20 20:55 Сейчас в теме
Я не поэт, я типа критик ;)

В стихотворении режет слух лишний слог, нарушающий ритм. Вот здесь "И" лишнее:

- Код со смыком был с рожденья глух,

- И резистивен к испрямленью рук.


А здесь "Но":

- Но гроши нужно до зарезу,

- В типовые я залезу,


Кто будет стихи писать, обращайтесь - я поправлю ;)
WildHare; +1 Ответить
24. Гость 08.07.20 02:30
Прошу уточнить: разве свернуть() в примере:

Возврат Запрос.Выполнить().Выгрузить().Свернуть("Ссылка").ВыгрузитьКолонку("Ссылка");


Это не процедура?
25. developf1com 08.07.20 18:50 Сейчас в теме
(24) Ага, будет ошибка. Но суть не в этом :)
26. Vortigaunt 82 09.07.20 10:18 Сейчас в теме
У меня возник вопрос. Я стараюсь по возможности использовать описанные в статье практики при написании кода. В частности мне особо импонирует принцип коротких методов: "Текст метода должен вмещаться на экран".
У этого правила есть исключение для контейнеров больших текстов: запросы и т.п.
А что делать в ситуации, когда нужно описать длинный скрипт обновления конфигурации?
Имеется процедура
ОбновитьКонфигурацию()

В ней прописана куча условий
Если НомерРелиза >= 1 Тогда
//Действия по обновлению
КонецЕсли;

Если НомерРелиза >= 3 Тогда
//Дейтсвия по обновлению
КонецЕсли;


Как в таком случае лучше поступить, чтобы эта процедура не превратилась в трудночитаемую простыню?
28. ltfriend 510 10.07.20 09:02 Сейчас в теме
(26) Все действия по обновлениям каждой версии вынести в отдельные методы.
29. Vortigaunt 82 10.07.20 10:01 Сейчас в теме
(28)
Все действия по обновлениям каждой версии вынести в отдельные методы.

Это само собой. И при таком раскладе в методе остается куча блоков Если. Может есть какие-то более правильные подходы? Не знаю. Например, создать макет и в нем прописать НомерРелиза => ИмяМетодаОбновления().
Или методы назвать Обновить_Релиз_1(), Обновить_Релиз_2() и т.п. и вызывать через Выполнить()?
30. CheBurator 3425 15.07.20 00:22 Сейчас в теме
"Проектировщик, озадаченный указанной доработкой, начал бы с рисования примерно такой картинки:"
- картинку вообще не понял. Имхо нарисованная проектировщиком картинка вообще мало связана с поставленной задачей.
31. CheBurator 3425 15.07.20 00:57 Сейчас в теме
насчет размера "в 1 экран" - тут можно поспорить.
с существующей практикой написания кода, многими Если, Циклы и пр. с отступами между строками - в один экран влезет что самая примитивная логика 2+2=4.
.
я стараюсь (но не всегда это делаю ;-) код умещать в два экрана. этого уже обычно достаточно.
а если начать мельчит чтобы вписаться "в один экран" - делая много мелких по размеру/коду процедур/функций - количество вложеность вызовов будет расти (что и наблюдается в типовых 8-ках?), будет расти количество параметтров передаваемых все глубже и глубже (структуры упомянутые в книжке) - и получится м.б. еще более страшная задница.
.
дробить на функции/процедуры имеет смысл слабо связанные куски кода, а если код сильносвязный - имхо проще на 2-3-4 экрана растянуть, но иметь перед глазами простым на 1-2 pgup/pgdn от точки исследования..
.как-то так...
32. Sekator 22.07.20 18:08 Сейчас в теме
(31) Согласен. Разделение ради разделения - выглядит нелепо и этим, не всегда, но и не редко грешат типовые. Кроме того, какие-то конструкции можно держать свернутыми. Искусственное "подрезание" кода - бред.
Оставьте свое сообщение
Вопросы с вознаграждением