1

Тема: OFF: о правильном стиле программирования

Перенесено из темы: VBScript: Копирование файлов с запросом о замене существующих.

2

Re: OFF: о правильном стиле программирования

pogudin.sanya, рекомендую не "гадать на кофейной гуще" и не ждать готового решения, а изучить код подробнее. К сожалению код уважаемого коллеги Flasher не совсем идеальное наглядное пособие для начинающего, так как:

1) Нет явного объявления переменных
2) Нет комментариев
3) Отсутствуют префиксы переменных, сообщающих о подтипе хранимых данных
4) Код довольно избыточен
5) Имена некоторых переменных не несут смысловой нагрузки

но это на его усмотрение. В целом идея вполне понятна. Так что разобраться можно.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

Re: OFF: о правильном стиле программирования

Xameleon, разумеется, на моё, код не с целью преподавания выложил.

1) Явное объявление переменных - это никому не нужно, кроме автора.
3) Считаю это глупостью и никогда не применяю.
4) Обоснуйте.

4

Re: OFF: о правильном стиле программирования

Flasher пишет:

Xameleon, разумеется, на моё, код не с целью преподавания выложил.

А дело не в преподавании, а в отношении к тому, что делаешь. Вам же не понравится если на приёме у зубного к Вам в рот полезет врач с грязными руками или если Ваш дом будут строить строители тяп-ляп ? Почему ? Потому что это нехорошее отношение к своей работе.

Опять же это вопрос эстетики и удобства чтения и понимания кода в дальнейшем.

Flasher пишет:

1) Явное объявление переменных - это никому не нужно, кроме автора.

Это нужно для понимания, откуда переменная взялась и для того, чтобы не пересекались области объявления. Подробнее пояснять необходимо ?

Flasher пишет:

3) Считаю это глупостью и никогда не применяю.

Крайне зря. Например под переменной Folder или File может скрываться как объект, так и путь до каталога / файла. Префикс позволяет заранее знать о типе содержимого.

Flasher пишет:

4) Обоснуйте.

1) В процедуре TestFolder первые два условия можно объединить в одну строку через AND.
2) Использование промежуточной переменной T, на мой взгляд лишнее
3) Нет необходимости уничтожать объекты в процедуре TestFolder. Это происходит автоматически при завершении работы кода.
4) Конструкцию проверки слэша на конце пути можно заменить на FSO.BuildPath.

и т.п....

А вообще, автор изначально просил передавать пути в скрипт в параметрах.

P.S Я не собираюсь придираться. Дело Ваше как Вы пишете и дело того, кто Вашим кодом будет пользоваться. Я лишь высказал своё мнение.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5 (изменено: Flasher, 2014-10-09 23:37:42)

Re: OFF: о правильном стиле программирования

Xameleon пишет:

Опять же это вопрос эстетики и удобства чтения и понимания кода в дальнейшем.

Это вопрос восприятия. Я воспринимаю лучше, когда так пишу, вы иначе. Есть смысл обсуждать?

Xameleon пишет:

Это нужно для понимания, откуда переменная взялась и для того, чтобы не пересекались области объявления. Подробнее пояснять необходимо ?

+ открыть спойлер

Option Explicit
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")

И откуда она взялась?
Пересечение - это опять же нужно автору при написании, отладке, в иных случаях это лишние записи.
Вот в Вашем коде переменная явно не объявлена, а оператор Option Explicit зачем-то стоит, но никто слова не сказал (хотя заметил).

Xameleon пишет:

Крайне зря. Например под переменной Folder или File может скрываться как объект, так и путь до каталога / файла. Префикс позволяет заранее знать об этом.

Я считаю, что префикс нужен там, где он будет отличать переменную от той, где его нет. А всякие obj и т.п. мне только глаза мозолят. Опять же вопрос восприятия. Для меня это как раз избыточность.

1) Не, нельзя. Причём это я и исправлял помимо всего прочего.
2) Вовсе нет.
3) Это сделано чисто из эстетических соображений, привычных мне. Т.е. полный Quit, если угодно. Тут много где встречается. Иногда это полезно для оперативки.
4) ОК. Мелочёвка. Доставил в код.

Xameleon пишет:

А вообще, автор изначально просил передавать пути в скрипт в параметрах.

Ну, так Ваш пример всяко не с ними. И я сразу понял, что термин неверно выбран, когда речь пошла о InputBox-е и вводе.

6

Re: OFF: о правильном стиле программирования

Flasher,

Flasher пишет:

Это вопрос восприятия. Я воспринимаю лучше, когда так пишу, вы иначе. Есть смысл обсуждать?

Предполагаю, что Вы не работали с кодом более 10 000 строк, разнесённым в разные скрипты. ) У нас БС построена на скриптах. Там это реально становится актуально, а в дальнейшем приучает к такой политике. Соглашусь, в коротких скриптах это не столь критично, просто правило хорошего тона, но опять же - Вам так удобнее ? - Слава всевышнему ! )

Обращаю Ваше внимание на мою формулировку:

К сожалению код уважаемого коллеги Flasher не совсем идеальное наглядное пособие для начинающего

Я не говорил, что так нельзя писать. Я уточнил, что это не совсем идеальное наглядное пособие для начинающего.

Flasher пишет:
+ открыть спойлер

Option Explicit
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")

И откуда она взялась?

Не понял причём тут этот код. Некая форма сарказма ?

Flasher пишет:

Пересечение - это опять же нужно автору при написании, отладке, в иных случаях это лишние записи.

Не согласен. Если Вы используете готовые функции, написанные кем-то с таким подходом, то вставляя их в код, получить пересечение переменных элементарно. Предположим ситуацию такого кода без Option Explicit и использованием переменной result в коде скрипта и внутри функции. Сравните результаты кода Dim result закомментированна и когда нет. А если функция строк эдак в 100. В ней обращения к БД, выполнение финансовых операций. Вот тут то грабли и попёрли. Вроде бы ыызвал функцию, а половина кода начала работать неадекватно. Чудеса ?


n1 = 1
n2 = 2
result = 10

MsgBox "Результат функции ""Summ"": " & Summ(n1, n2)

MsgBox "Переменная ""result"" содержит: " & result

Function Summ(n1, n2)
    'Dim result
    result = n1 + n2
    Summ = result
End Function
Flasher пишет:

Вот в Вашем коде переменная явно не объявлена, а оператор Option Explicit зачем-то стоит, но никто слова не сказал (хотя заметил).

Это сделано умышленно, дабы пользующийся кодом, наращивая скрипт, уже задумывался об объявлении переменных заранее. Так как у pogudin.sanya пока нет опыта написания скриптов, я считаю важным, обратить его внимание на оператор Option Explicit в первую очередь. Вклад в будущее так сказать. )

Flasher пишет:

Я считаю, что префикс нужен там, где он будет отличать переменную от той, где его нет. А всякие obj и т.п. мне только глаза мозолят. Опять же вопрос восприятия. Для меня это как раз избыточность.

Как говорится - На вкус и цвет... все фломастеры разные. ) Я тоже не сторонник использования длинных префиксов. obj мне тоже мозолит глаза, поэтому сокращаю до одной буквы o - oFSO / oShellApp.


l - long
i - Integer
s - String
o - Object
d - Double
dt - Date
a - Array

Без префикса оставляю только те переменные, которые в коде принимают в себя разные типы данных.

Кстати префикс очень полезен когда пользуешься чужой функцией. Например

 SomeFunc(lCounter,sName,dDate,oRec)

Уже сразу представляешь, что функция ждёт на входе. Опять же пример

Function RecursiveScanFolder(oFolder) и Function RecursiveScanFolder(sFolder)

Тоже сразу даёт понять, что требуется "подать на вход".

Flasher пишет:

1) Не, нельзя. Причём это я и исправлял помимо всего прочего.

Что помешало ?

Flasher пишет:

2) Вовсе нет.

Аргументы ?

Flasher пишет:

3) Это сделано чисто из эстетических соображений, привычных мне. Т.е. полный Quit, если угодно. Тут много где встречается. Иногда это полезно для оперативки.

Уточнение "иногда" считаю справедливым. Но в данном случае считаю эту строку бесполезной.

Flasher пишет:

4) ОК. Мелочёвка. Доставил в код.

Ну хоть в чём то договорились ))

Xameleon пишет:

Ну, так Ваш пример всяко не с ними. И я сразу понял, что термин неверно выбран, когда речь пошла о InputBox-е и вводе.

Мой пример умышленно лишён этого выбора, так как автор на тот момент, сам ещё не определился в каком виде он хочет вносить параметры в код.

Говорят

Критикуя - предлагай, предлагая - делай !

Я бы предложил написать как-то так:


Option Explicit
Dim sSrcPath  'Путь исходного каталога
Dim sDestPath 'Путь конечного каталога 
Dim oFSO      'Объект для работы с файловой системой

Set oFSO = CreateObject("Scripting.FileSystemObject")
sSrcPath = oFSO.BuildPath(InputFolderPath("Введите путь исходной папки"),"*.*")
sDestPath = InputFolderPath("Введите путь конечной папки")
CreateObject("Shell.Application").NameSpace(sDestPath).CopyHere(sSrcPath)

'Функция запроса имени каталога
'sQuery - строка для запроса в InputBox
Function InputFolderPath(sQuery)
    Dim sFldrPath
    Do
        sFldrPath = Trim(InputBox(sQuery))
        if sFldrPath = "" Then 
            MsgBox "Скрипт завершил свою работу"
            WScript.Quit
        End if
        if oFSO.FolderExists(sFldrPath) Then Exit Do
        MsgBox "Каталог """ & sFldrPath & """ не найден !",vbCritical
    Loop
    InputFolderPath = sFldrPath
End Function

Хотя конечно код можно поужать.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

7

Re: OFF: о правильном стиле программирования

Xameleon пишет:

Соглашусь, в коротких скриптах это не столь критично, просто правило хорошего тона

Вот именно, что некритично. Мы большой скрипт обсуждаем? Нет. Правила тона тут, ИМХО, вообще ни при чём.

Xameleon пишет:

Не понял причём тут этот код. Некая форма сарказма ?

Я написал короткий код и хочу понять, что мне даст инструкция Option Explicit. Или мы всё же опять уткнёмся в правила тона и размеры скрипта? )

Xameleon пишет:

Не согласен. Если Вы используете готовые функции, написанные кем-то, используя такой подход, то вставляя их в код, получить пересечение переменных элементарно.

А это самостоятельным написанием, пусть и с использованием чужих заготовок, не считается?

Xameleon пишет:

Это сделано умышленно, дабы пользующийся кодом, наращивая скрипт, уже задумывался об объявлении переменных заранее. Так как у pogudin.sanya пока нет опыта написания скриптов, я считаю важным, обратить его внимание на оператор Option Explicit в первую очередь. Вклад в будущее так сказать. )

Намеренно наталкивать на вызов нервирующих окон, что не объявлена эта переменная или эта? Мне это как раз и не нравится в коротких скриптах. В редакторе можно и так выделить переменную и увидеть потенциальные повторы, а с Option Explicit в скриптах до 200 строк больше возни (для меня во всяком случае).

Про префиксы подумаю, но не уверен, что возьму на вооружение, каждому своё, как говорится.

Xameleon пишет:

Что помешало ?

Как нетрудно заметить выход на Else.

Xameleon пишет:

Аргументы ?

Команда .CopyHere будет выполняться только в случае существования получателя. Т/Test - флаг.

Xameleon пишет:

Уточнение "иногда" считаю справедливым. Но в данном случае считаю эту строку бесполезной.

Всю строку? Или WSCript.Quit всё же оставить? ))

Xameleon пишет:

Ну хоть в чём то договорились ))

Мне это несложно, если я вижу реальную пользу. А исходный вариант есть смысл применять там, где переменная будет вставляться многократно. Я часто использую такую запись для параметров, написал без задней мысли.

Xameleon пишет:

Мой пример умышленно лишён этого выбора, так как автор на тот момент, сам ещё не определился в каком виде он хочет вносить параметры в код.

Разве? Мне так не показалось.

8

Re: OFF: о правильном стиле программирования

Так. По поводу «Option Explicit» — это вообще не обсуждаемо. Это не дело вкуса, не привычки, не правило хорошего тона. Можно обсуждать, пользовать ли «With … End With» или танцевать от точки, следует ли разделять пустыми строками группы кода для наглядности или не стоит. В отношении «Option Explicit» вопрос так не стоит. Оно должно быть. На мой взгляд, не менее половины кода без «Option Explicit», выкладываемого в виде «почему-то не работает», «работает не так, как должно бы» и «не могу найти ошибку», разрешаются на ура после добавления оного оператора и моментального выявления всяческих несуразностей, не выявляемых автоматически в связи с его отсутствием.

9

Re: OFF: о правильном стиле программирования

alexii
Ну, как же не обсуждается? Я же пояснил, что мне это в определённых пропорциях мешает писать.
Объявляйте явно, если хотите, я не буду. Мне никогда добавление инструкции не помогало найти ошибку. Как-то так.

10

Re: OFF: о правильном стиле программирования

Flasher, мне оно помогало их не делать.

11

Re: OFF: о правильном стиле программирования

alexii, жаль у нас на форуме нельзя "плюсомётить". ) Я бы плюсанул.

Flasher,

Flasher пишет:

Вот именно, что некритично. Мы большой скрипт обсуждаем? Нет. Правила тона тут, ИМХО, вообще ни при чём.

Не важно какой длины код, важно то.... Ой ладно, я уже повторяюсь... Понял, что Вы при своём мнении, свои доводы я высказал, а судить будут те, кто потратит время на чтение темы.

Flasher пишет:

Я написал короткий код и хочу понять, что мне даст инструкция Option Explicit. Или мы всё же опять уткнёмся в правила тона и размеры скрипта? )

Длина кода не важна. Важен подход к программированию. Важно то - заботит ли Вас как Вашим кодом будут пользоваться и не будет ли он мешать работе остальной программы или нет.

Этот оператор заранее избавляет от кучи возможных проблем. Ваше право им не пользоваться. Ваш аргумент с коротким кодом так и не понял. Очевидно, что для одной строки это практически роли не играет, но и полезный скрипт в одну строку - большая редкость.

А вообще даже на MSDN пишут почему нужно им пользоваться http://msdn.microsoft.com/ru-ru/library/y9341s4f.aspx

Flasher пишет:

А это самостоятельным написанием, пусть и с использованием чужих заготовок, не считается?

Не понял смысл этого возражения. Мне кажется, я выше уже на это ответил.

Flasher пишет:

Намеренно наталкивать на вызов нервирующих окон, что не объявлена эта переменная или эта? Мне это как раз и не нравится в коротких скриптах. В редакторе можно и так выделить переменную и увидеть потенциальные повторы, а с Option Explicit в скриптах до 200 строк больше возни (для меня во всяком случае).

Хм... А сообщения антивируса о наличии вирей на компе Вы тоже считаете "нервирующими окнами" ? )) Необъявленные переменные это залог непредсказуемого поведения кода. Это просто факт. Пример я Вам уже показал в предыдущих постах.

Про префиксы подумаю, но не уверен, что возьму на вооружение, каждому своё, как говорится.

Flasher пишет:

Как нетрудно заметить выход на Else.

Flasher пишет:

Команда .CopyHere будет выполняться только в случае существования получателя. Т/Test - флаг.

Flasher пишет:

WSCript.Quit всё же оставить? ))

Flasher пишет:

Мне это несложно, если я вижу реальную пользу. А исходный вариант есть смысл применять там, где переменная будет вставляться многократно. Я часто использую такую запись для параметров, написал без задней мысли.

Только сейчас добрался до дачи, сил нет долго расписывать ) Я по этой причине и привёл свой пример кода. )

Flasher пишет:

Разве? Мне так не показалось.

Попробую более явно указать на причину. В т.з. у автора написано:

pogudin.sanya пишет:

Все каталоги задаются параметрами скрипта, причем исходный каталог - первым параметром.

И тут же в коде у автора явно написано:

nach = InputBox("Введите исходную папку")
con1 = InputBox("Введите конечную папку 1")
con2 = InputBox("Введите конечную папку 2")
...

Странноватый подход, не находите ? Вроде нужно через параметры указать, а потом 3 инпутбокса. O_o Где логика ? Естественно я привёл пример с той частью задачи, которая не вызвала сомнений.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

12 (изменено: Flasher, 2014-10-11 00:18:53)

Re: OFF: о правильном стиле программирования

Xameleon пишет:

Понял, что Вы при своём мнении, свои доводы я высказал, а судить будут те, кто потратит время на чтение темы.

Как и Вы. Не на что тратить. У нас тут разговор о погоде. )

Xameleon пишет:

Важен подход к программированию. Важно то - заботит ли Вас как Вашим кодом будут пользоваться и не будет ли он мешать работе остальной программы или Вам на это плевать.

Не понимаю, о какой в данном случае "основной программе" речь...

Xameleon пишет:

Ваше право им не пользоваться. Но Ваш аргумент с коротким кодом так и не понял. Понятное дело, что для одной строки это роли не играет, но и полезный скрипт в одну строку - большая редкость.

Число 200 в глаза не бросилось? Не поняли и ладно. )

Xameleon пишет:

Не понял смысл этого возражения.

Прочтите цитату, на которую давали ответ, вероятно, поймёте.

Xameleon пишет:

Хм... А сообщения антивируса о наличии вирей на компе Вы тоже считаете "нервирующими окнами" ? ))

Представьте себе, есть люди, которые их не ловят либо не пользуются антивирусами вообще, в т.ч. по этой причине.

Xameleon пишет:

Необъявленные переменные это залог непредсказуемого поведения кода. Это просто факт. Пример я Вам уже показал в предыдущих постах.

Вы мне показали то, что в при здравом уме исключено. Если у Вас проблемы с обозрением переменных в небольших кодах, с недопущением совпадений, то Ваш выбор очевиден. Мой другой.

Xameleon пишет:

Я по этой причине и привёл свой пример кода. )

Спасибо за пример. )

Xameleon пишет:

Странноватый подход, не находите ? Вроде нужно через параметры указать, а потом 3 инпутбокса. O_o Где логика ?

Прочитайте мой ответ касаемо ошибки в выборе термина. Данная странность в ситуации с новичком мне понятна.

Предлагаю закончить. Знаю, что Вы всё равно оставите за собой последнее слово с целью оставить меня в дураках. Я могу только пасовать перед Вашим модераторским статусом. Неинтересно наступать на те же грабли.

13

Re: OFF: о правильном стиле программирования

Flasher,

Flasher пишет:

Как и Вы. Не на что тратить. У нас тут разговор о погоде. )

Жизнь рассудит . Позволю себе смелость предположить, что Вы не работали в команде, в крупных проектах. Так как команда не прощает откровенные ляпы в коде и такого подхода. Видел как это бывает. Про себя могу сказать - За свою короткую жизнь я успел побывать в группе разработчиков систем "Клиент-Банк", БС (Банковской Системы для которой разрабатывал модули), занимался автоматизацией документооборота в банке, интегрировал механику сайтов с БС. Сейчас вот налаживаем факторинг с нуля.
Не могу сказать, что это "крупные проекты", но даже в них, программисты соблюдают правила программирования. И каждую разработку, с каждой группой, мы начинали с обсуждения общих правил написания кода. Чтобы кажый из нас мог сев за чужой код в нём разобраться довольно быстро. Каждый модуль проверяется на документированность, скорость работы, и стрессоустойчивость (типа, а что будет если сделать вызов 1000 раз).

Поэтому для Вас это разговор о погоде, для меня приятная мысль о том, что будущие скриптописатели, почитав эту беседу будут писать код более грамотно.

Flasher пишет:

Не понимаю, о какой в данном случае "основной программе" речь...

Удивлён вопросом. Думал этот термин у Вас не вызовет непонимания. Основной код скрипта - код вне процедур, функций и класс модулей. Я постарался своим, максимально упрощённым, примером до Вас это донести. Пояснить чем опасно - пересечение пространств объявления, если нет явной декларации.


Flasher пишет:

Число 200 в глаза не бросилось? Не поняли и ладно. )

Как раз то, что Вы закрываете глаза на эти сообщения и есть то самое кощунственное нарушение правил и соглашений при написании кода. ) Если Вы этого не поняли, то только жизнь сможет Вас переубедить. В нашем коллективе это каралось довольно жёстко. А в случае повторения ситуации вполне могло привести к исключению из группы разработчиков. Благо у нас народ адекватный и со второго раза понимал чем это грозит. А ведь были моменты когда баг выползал не сразу. А иногда и не постоянно. И выяснялось, что заложен он был пару месяцев назад. Чем это грозит в случае таких багов, когда переводы в день идут на миллиарды, думаю представляете. К примеру баг с общей переменной в функции расчёта суммы прописью, а цепляет тип валюты в общем коде. До вызова функции на входе имели рубли, а после выхода из функции уже евро. Оппа. Ничё так курс в 40 раз поменялся. ) Весело правда ? А срабатывает баг только когда сумма больше миллиарда. Приятно за такой баг отвечать головой ? )

Flasher пишет:

Представьте себе, есть люди, которые их не ловят либо не пользуются антивирусами вообще, в т.ч. по этой причине

Ну да, с таким подходом - не знаешь о том, что заражён и слава богу. ) Красота...

Flasher пишет:

Вы мне показали то, что в при здравом уме исключено. Если у Вас проблемы с обозрением переменных в небольших кодах, с недопущением совпадений, то Ваш выбор очевиден. Мой другой.

У меня проблем нет. ) Я стараюсь выкладывать проверенный код, который не создаст проблем остальным разработчикам и не произойдёт подобной ситуации:

--------------------------------------------------------------------

pogudin.sanya пишет:

После того как я ввожу путь источника, окно закрывается и после этого ничего не происходит. Спасибо.

Flasher пишет:

Понял, сейчас поправлю.

---------------------------------------------------------------------


Flasher пишет:

Спасибо за пример. )

Не за что. Может и автор взглянет и задумается.

Flasher пишет:

Предлагаю закончить. Знаю, что Вы всё равно оставите за собой последнее слово с целью оставить меня в дураках. Я могу только пасовать перед Вашим модераторским статусом. Неинтересно наступать на те же грабли.

Пфф. Коллега. Вы плохо обо мне думаете. Я уже не в том возрасте чтобы самоутверждаться на начинающих программистах, но и не в том, чтобы считать себя опытным. При очередных разработках, я открываю для себя что-то новое и поражаюсь тому, что кто-то из нашей команды уже это давно знает и считает общеизвестным фактом. Но порой бывает и обратная ситуация, когда я оказываюсь носителем знаний, которые мне кажутся очевидны. И с каждым разом я убеждаюсь, что мой опыт всё равно ничтожно мал, а область, с которой я работаю, гораздо шире. Недавно стал проникать в механизмы работы интерфейсов COM объектов на нижнем уровне и был крайне удивлён тем, что... Оу... Ухожу от темы. Касательно той темы, которой Вы наверное пытались меня "уколоть", я там ответил по поводу причины закрытия. ) Дело было в нарушении правил. "Власть" модератора очень субъективна. Форум держится на посетителях. Не будет их - не будет и форума. Поэтому любое превышение своих полномочий или использование в своих целях или во вред форуму, так же карается по закону. У нас любые решения по модерации перед их исполнением согласуются в коллективном разделе, который не виден остальным пользователям. И вообще... Кто старое помянет, тому... сами знаете

P.S Согласен, что пора сворачивать тему. Но наш диалог всё равно считаю полезным. Я, пока писал код примера, задумался над тем как можно иначе объявлять переменные и как проще и компактнее организовать возврат значений в моём нынешнем проекте. И за это благодарю. И думаю наша беседа будет полезна и остальным, кто всё-таки потратит время на её прочтение. Конечно мы отошли от темы во многом, поэтому если администрация пожелает зачистить последние посты, то я не против.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

14 (изменено: Flasher, 2014-10-11 06:49:07)

Re: OFF: о правильном стиле программирования

Xameleon
Похоже, Вы меня неверно поняли. Я принимаю во внимание ситуации, когда речь идёт об обслуживании корпоративной среды и ведении комплексных проектов. Но это не означает, что "консервативная писанина" себя оправдает в каждой ситуации.
Для образного примера, это как сравнивать классическое исполнение с соул, в котором у оперников при знакомстве со "свободным стилем" происходит разрыв шаблонов. Вы в данной ситуации "оперник", поскольку Вам нужно чётко придерживаться "заданных интервалов в соответствии с партитурой". Я - "соул-исполнитель", и закрываю глаза на то, что у Вас вызывает "неподдельный страх". И тут "жизнь" меня не "переубедит", я в своей стихии. Прошу отнестись к этой аллегории неформально.
На все пасы я, уж простите, отвечать не буду, несмотря на то, что везде есть чем аргументированно возразить, поскольку КПД от нашей беседы вне рамок темы скатился к минимальным показателям.
То, что написание Вами примера оказалось кому-то полезным, - единственная добрая весть.

P.S.:
Модераторские действия я обсуждать права не имею, так что зря Вы мне всё это без обратной реакции рассказываете.
Я тоже не против зачистки от наших полотенец (как ни пытался я их укоротить, демагогия всё победила).

15

Re: OFF: о правильном стиле программирования

Обсуждение интересное, разве что в отдельную тему выделить.

16

Re: OFF: о правильном стиле программирования

Flasher, опять же в корне не согласен. Считаю Ваше сравнение неправомерным. Я бы с радостью согласился если бы под стилями подразумевался стиль написания кода с использование класс модулей, с акцентом на процедурное конструирование, грамотное написание линейного кода или процедурное конструирование. Но нет же. Если проводить аналогию, то в моём понимании Вы стоите на качающейся табуретке с тремя ножками на краю оркестровой ямы, фальшиво исполняете соул и при этом в руках держите гирю, рискуя свалиться вниз и вдобавок покалечить остальных на кого Вы можете свалиться. И когда Вам снизу вежливо говорят - "Друх ! Да ты ж ща гробанёшься ! Хоть с табуретки слезь и гирю положи !", Вы возражаете - "Отвалите ! Я исполняю соул. Это моя стихия". Именно поэтому мне бы не хотелось, чтобы Вы публиковали подобный код. Так как он заведомо закладывает опасность для тех, кто им будет пользоваться. Но это Ваше право, как участника форума. Конечно - спасение утопающих, дело рук самих утопающих, но остальных то "топить" зачем ? @_@ Я честно старался донести до Вас причину опасности, но Вы меня не услышали.

P.S Поддерживаю предложение YMP о переносе темы. Давайте решим с какого места делить (и надо ли) и куда переносить.

Хотелось бы узнать мнение третьей стороны ( остальных коллег alexii / YMP / JSman / greg zakharov и других участников ) по поводу нашего спора.


P.P.S

Flasher, стало интересно на счёт стихии.

1) Как вы считаете, можно в VBS создать переменную / функцию / процедуру / класс с именем "чудо нерукотворное" или "!" или "d[*_*]b" или "!@#$%^&*()" ?

2) Можно ли из VBS обратиться к методу JavaScript объекта, если имя у него например "_SomeMethod" ?

3) Может ли в VBS выполняться такая конструкция:

MsgBox SomeFunc(1,2) + SomeFunc.SomeMethod()

4) Что может возвращать Вызов Me ?

5) Предположим: Есть некая процедура. При разных вызовах нужно передавать в неё разное количество разнотипных переменных. Обязательное условие - переменные не должны быть глобальными. Как бы Вы решили задачу с минимумом кода ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

17

Re: OFF: о правильном стиле программирования

Xameleon пишет:

Хотелось бы узнать мнение третьей стороны ( остальных коллег alexii / YMP / JSman / greg zakharov и других участников ) по поводу нашего спора.

Разумеется, в коде должен быть порядок и работа должна качественно выполняться.

Что касается объявления переменных. В целях представления какие же переменные используются в коде, желательно их выносить в начало функции/глобального скопа. Также явное объявление переменных не допустит путаницы глобальных переменных с локальными. В JScript иногда это имеет значение (так при отсутствии слова var перед первым присвоением, JScript воспринимает ее как свойство глобального объекта). Для меня критерий хорошего кода - это возможность его легкого встраивания в другой проект.

Что касается комментирования кода. Моя практика показала, что это обязательно нужно делать. Это сэкономит время при повторном рассмотрении части кода. А также улучшит читаемость при демонстрации кода коллегам или работодателю.

Что касается именования переменных. Очевидно, что можно именовать их в соответствии с типами, но у меня часто так бывает, что один из параметров функции может быть числом, пустым типом, объектом или строкой. Обычно я не заморачиваюсь с именованием переменных, но пишу комментарий перед объявлением функции, в котором указываю для чего нужна функция, какие параметры, какого типа, обязательный или нет.

18

Re: OFF: о правильном стиле программирования

Xameleon пишет:

Хотелось бы узнать мнение третьей стороны ( остальных коллег alexii / YMP / JSman / greg zakharov и других участников ) по поводу нашего спора.

Для меня ваша позиция выглядит убедительнее.

19 (изменено: Flasher, 2014-10-11 15:44:52)

Re: OFF: о правильном стиле программирования

Xameleon
Что считать иначе, Вам нужно было рассмотреть мою позицию не с точки зрения стилизации кода, а с точки зрения отрыва от шаблонов, в этом был основной посыл.
И так случилось, что табуретка с тремя ножками оказалась более устойчивой, чем с четырьмя, и пою я фальшиво только с точки зрения "оперника" (подкинувшим своему конкуренту на удачу гирю перед концертом), ибо ему всегда удобно существовать с этим самоутверждающим клише. В итоге первая часть концерта прошла на ура, вторую часть открывает "оперник" и, выходя, низким гнусавым голосом заявляет "Я не слышу, дайте мне камертон!" Публика с пониманием зевает...

P.P.S
Увольте, была мысль по быстрому сыграть в блиц, но не стану этого делать по нескольким причинам:
1) Считаю проведение тестирования в рамках удалённого общения недальновидным действом, исходя из того, что нет временных рамок, и вся информация доступна либо может быть проверена;
2) Вы писали о неверно созданном впечатлении о Вас, но предложение ответить на "школьные" вопросы рассматривается как неуважительный пинок "нерадивому ученику", т.е. впечатление, считайте, что подпорчено.
3) В рамках "стихии", а в моём случае - ситуативных отношений, большая часть вопросов неуместна.

20

Re: OFF: о правильном стиле программирования

Flasher, cтилизация и безопасность разные вещи. Ваш код ОПАСЕН своим поведением. Вы этого не осознаёте. Что сказать - печально.

Вы продолжаете свято верить в её (табуретки) устойчивость, не смотря на аргументы уже четырёх коллег и не приведя ни одного довода с действующими примерами в защиту своего кода. Скрипт из одной строки за пример-аргумент не считаю.
Моё "клише", если Вам так удобнее, не только моё, а общее. Вам уже на это указали. И не вижу причину относить меня к "оперникам" )) Я соул тоже люблю. И ваш с радостью послушаю, лишь бы исполнение было достойное и Вы на меня с гирей не упали. )

1) И пускай информация будет проверена. ) Я не против. Воспринимать отказ как поражение ?

2) Тот кто не считает себя школьником, не будет стесняться ответить на вопросы. Какая разница задал их я или кто либо другой на форуме ? ) Или Вы считаете выше своего достоинства отвечать на чужие вопросы ? Тогда что вы делаете на форуме ?

3) Пфф. ) Слов много. Кода мало. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

21

Re: OFF: о правильном стиле программирования

Flasher, поясните,  пожалуйста, а в чем у Вас отрыв от шаблонов? Я понимаю,  когда речь идет о нестандартных решениях,  алгоритмах. А у Вас что?

22

Re: OFF: о правильном стиле программирования

Flasher пишет:

А тут рассматриваться вполне понятный шаблон - использование инструкции и явного объявления переменных в любых обстоятельствах.

Возможность не объявлять переменные - это "фича" для ленивых, не более. Если отрываться от "чернового" решения, то тут вообще правил никаких нет. Пишите, как хотите. Но при больших объемах кода не следование рекомендациям может сыграть злую шутку.

От себя добавлю, что несмотря на то, что скрипт - это текстовый файл с открытым кодом, написание скриптов можно дифференцировать на следующие типы:
1) Код для чтения - это код, который хоть как-то укладывается в рамки документированности и строгости. Предназначен для демонстрации, интеграции кода в другие проекты.
2) Код для исполнения - это код, который сложно читать, предназначен только для исполнения скрипта.  Код может быть оптимизированным или подвергнут обфускации.

Код для исполнения также можно разделить на три вида:
1) Черновой вариант - это быстрое, грязное, как правило короткое, решение для одноразовой задачи.
2) Оптизированный код - Примером такого кода является результат работы утилиты Google Closure (переменные переименованы, пробельных символов практически нет, применены оптимизации к конструкциям языка).
3) Обфусцированный код.

И вот тут, возможно, появится ответ на вопрос "Когда можно забивать на объявление переменных, комментирование и т.д.".

23 (изменено: Flasher, 2014-10-11 18:32:04)

Re: OFF: о правильном стиле программирования

JSman
Со всем согласен, кроме лени и п.1. Я бы разделил его на черновой для себя или "клиента" и конечный для себя или "клиента". Решение может быть параметризовано и укладываться в рамки уже совсем неодноразовой задачи.

24

Re: OFF: о правильном стиле программирования

Flasher, пардон, в результате цитирования, зацепил Ваш пост выше.

Flasher пишет:

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

В посте номер 24 я пояснил причину опасности.

В 24-ом и 31-ом уже упоминал об опасности ?

Невнимательность или троллинг ?

Flasher пишет:

Обращение к авторитетам или группе известная мне психологическая уловка, но она здесь не работает. Я, конечно, не возьмусь обзывать всех участников оперниками, поскольку то была лишь фигура речи (просил же отнестись неформально), но мне данная позиция заведомо ясна (и в схожести оной со взгядом ваших избранников особо не сомневался), но я её нигде не оспаривал в обобщительном ключе, я писал только о своём личном отношении.

Хм. Теория заговора ? ) Мания преследования ?

Flasher пишет:

1) Поражение в чём? Я с Вами не соревнуюсь.

Я не предлагал соревноваться. Поражение - отказ отвечать

2) Как раз наоборот. Это "школьнику" не имеет смысла стесняться проверять свои знания. Да, я не пишу, что вопросы ненормальные, но в данном диспуте цель и постановка их деструктивна для спора.

А опытному надо стесняться ? Цель вопросов деструктивна ? Боитесь новых знаний ? )

Flasher пишет:

3) Многословности Вам не занимать. Куда уж мне... )

Я потому и предложил перейти к коду. Что-ж Вы медлите ? )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

25

Re: OFF: о правильном стиле программирования

Можно продолжать .

26

Re: OFF: о правильном стиле программирования

В посте номер 24 я пояснил причину опасности.

В 24-ом и 31-ом уже упоминал об опасности ?

Невнимательность или троллинг ?

Увы, ссылки уже мёртвые. Никакого троллинга. Вы написали "ваш код". Значит, я это могу понять как обсуждение решения, предложенное мной студенту. Может, Вы где-то подразумевали безопасность, но я не понял где? Так приведите цитату.

Хм. Теория заговора ? ) Мания преследования ?

Ну, вот, а Вы меня ещё в троллинге обвиняете...

Я не предлагал соревноваться. Поражение - отказ отвечать

Отказ отвечать никак не может считаться поражением без соревновательного мотива.

А опытному надо стесняться ? Цель вопросов деструктивна ? Боитесь новых знаний ? )

Не обязательно надо. Но тут другая история. Ваш провокационный мотив очевиден. В другой ситуации Вам имеет смысл задать данные вопросы без привязки к какому-то флейму, чисто с целью "познать истину", тогда это будет уместно и правомерно. Сделайте паузу.

Что-ж Вы медлите ? )

Да Бог с Вами, я уже своё решение обозначил, раскручивать ситуацию не имеет дальше смысла, тему можно закрывать.
А не продолжать, alexii.

27

Re: OFF: о правильном стиле программирования

alexii, крайне благодарствую. ) По возможности, хотелось бы узнать и Ваше мнение более развёрнуто по нашему обсуждению.

Flasher

1) По поводу кода:

Пост номер 6 в этой теме.

Вот о чём я говорил.

Не согласен. Если Вы используете готовые функции, написанные кем-то с таким подходом, то вставляя их в код, получить пересечение переменных элементарно. Предположим ситуацию такого кода без Option Explicit и использованием переменной result в коде скрипта и внутри функции. Сравните результаты кода Dim result закомментирована и когда нет. А если функция строк эдак в 100. В ней обращения к БД, выполнение финансовых операций. Вот тут то грабли и попёрли. Вроде бы вызвал функцию, а половина кода начала работать неадекватно. Чудеса ?


n1 = 1
n2 = 2
result = 10

MsgBox "Результат функции ""Summ"": " & Summ(n1, n2)

MsgBox "Переменная ""result"" содержит: " & result

Function Summ(n1, n2)
    'Dim result
    result = n1 + n2
    Summ = result
End Function

2)

Flasher пишет:

Ну, вот, а Вы меня ещё в троллинге обвиняете...

Не обвиняю, а спрашиваю. Спрашиваю потому что сообщений не так много. А сообщений, в которых я приводил примеры с кодом, и того меньше. Соответственно найти где я Вам ответил кодом не представляет сложности. Создаётся ощущение, что не хотите видеть.

3)

Отказ отвечать никак не может считаться поражением без соревновательного мотива.

Всеми путями пытаетесь уйти от ответа. Абстрагируйтесь от мысли о провокации. Вы уже который пост под всякими предлогами отказываетесь. Ответить можете или нет ?

4) Ваше решение оказалось избыточно по коду и опять же с проблемами затрагивания данных внешнего кода. Переменная M как раз нарушает безопасность кода так как она явно не объявлена, следовательно автор, используя Ваш код, уже не сможет использовать переменную M, потому что Ваш код будет изменять её значение. Поэтому я и привёл Вам упрощённый пример в пункте 1.

Подводя итоги. Обсудили с JSman Ваш подход. Сошлись во мнении - писать "грязный" код можно, но публиковать его как решение - категорически нет.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

28

Re: OFF: о правильном стиле программирования

Позволю себе разбавить вашу беседу своим комментарием.

Как говорится - На вкус и цвет... все фломастеры разные. ) Я тоже не сторонник использования длинных префиксов. obj мне тоже мозолит глаза, поэтому сокращаю до одной буквы o - oFSO / oShellApp.

l - long
i - Integer
s - String
o - Object
d - Double
dt - Date
a - Array

Префиксы. Возможно это хорошо. Но какой смысл в этих префиксах в многотысячестрочном приложении, которое разрабатывается целой командой?

oFSO, oShell - префиксы не нужны. Так же не нужны префиксы для обозначения типа, например, если известно, что расчет валюты ведется в целых числах:


iCurrency = ...

Гораздо осмысленнее префиксы, указывающие саму валюту.


eur_Currency = rub_Currency ...

Считаю, что такие проекты должны быть правильно спроектированы изначально: модульное и процедурное программирование, минимум глобыльных переменных (только самые необходимые), осмысленные имена переменных, констант, функций. Но и в крайности не стоит впадать - нет необходимости подробно именовать переменные, например, если они используются как индексы массивов.

По возможности, одна функциональность реализуется одним файлом/модулем (хотя не всегда модуль = файл).
Одно действие выполняется одной функцией/процедурой.
Глобальные переменные - только самые необходимые, остальные - локальные в пределах функции или модуля.

( 2 * b ) || ! ( 2 * b )

29

Re: OFF: о правильном стиле программирования

Rumata, вообще речь шла о необходимости декларирования переменных. В целом, я с Вами согласен, что именовать переменные с учетом ее типа не очень хорошая идея. Достаточно при декларировании оставить комментарий для чего нужна переменная и какого она типа. У меня привычка именовать сущностями.

Однозначно я солидарен с Xameleon по поводу нежелательности публикации грязного кода. В принципе если мы тут слово на букву "х" не пишем и пытаемся чтить правила русского языка, чтобы не превратить форум в обычный срачельник, то такие рекомендации надо вводить в отношении публикуемого кода. Ибо культура кодинга должна быть.

Немного "оффтопну". По моему убеждению на форуме полно "грязного" кода (что я понимаю под этим словом я указал выше). И мой интерес (который возможно совпадает с общественным) направлен на использование "опыта" в виде готовых кусков кода для решения что своих задач, что задач участников форума.

Бывает участники приводят классные решения, но их все время приходится редактировать под себя, переписывать.
Рекомендация к написанию "чистого" кода по задумке повысит эффективность использования форума.

И прошу понять меня правильно, что пост не является претензией к участникам форума, а является рассуждением.

30

Re: OFF: о правильном стиле программирования

JSman пишет:

Rumata, вообще речь шла о необходимости декларирования переменных.

О! Это самое важное - декларировать всё и до первого использования.

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

В некоторой степени искусственный пример в качестве иллюстрации. Пусть требуется с помощью Perl подсчитать количество строк во входном потоке, соответствующих заданному шаблону:

perl -ne "/искомая строка/ && $n++; END { print $n; }" filename

Здесь нет необходимости создавать отдельный файл, объявлять переменную. Программа (как бы она ни была крошечна и не соответствующей требованию обязательности декларации) полностью работоспособна. Сравните с примером (в данном случае) избыточности:

perl -ne "BEGIN { $n = 0; } /искомая строка/ && $n++; END { print $n; }" filename
( 2 * b ) || ! ( 2 * b )

31

Re: OFF: о правильном стиле программирования

Xameleon пишет:

alexii, крайне благодарствую. )

И Вам "спасибо", что мой пост грохнули.
1) И где тут отождествление с понятием "ваш код"?
2) С учётом того, что речь шла не о моём коде, ощущение ошибочное.
3) Нельзя абстрагироваться. Не пытайтесь больше. Это нужно Вам, но не мне.
4) Ну, наконец-то перешли к конкретике. Давайте, забудем про первые 3 пункта.
Про избыточность Вы уже писали, с этим всё ясно. Но я привёл код с ходу, написав быстренько "на коленке", вы потратили ещё какое-то время, чтобы его причесать и сделали вариант по сухости оптимальнее (а может, и с нуля написали - не суть), это не значит, что у меня в целом с этим проблемы.
Переменная M никакой формы безопасности не нарушает, т.к. действует в рамках конечного кода, а не подготовительного. Следовательно автору нигде больше эту переменную использовать не придётся. О вероятностях говорить смысла нет, иначе их обсуждение впадёт в "сократовский ступор", и там уже неважно, кто, что и когда мог понять, забыть, добавить, изменить и т.д.
В небольших подготовительных кодах любые инструкции каждый может добавить по своему усмотрению ровно так же, как и объявлять переменные для обнародованных функций.

Xameleon пишет:

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

Я так понимаю, "писать" и "публиковать" в данном случае синонимы. Т.е. Вы хотите подписи "осторожно, грязный код, а не решение"? В некоторых случаях глупо будет выглядеть, не правда ли? Я уже достаточно написал конечных кодов без того, к чему Вы так привыкли, и особого нытья по данному вопросу от вопрошающих не слышал, всё у них работает как часы, никто не жалуется хотя бы потому, что им не приходится менять в коде что-то окромя вводных данных. А чисто из педагогических соображений и во благо университетского пафоса придраться можно к любой закорючке.


Rumata пишет:

oFSO, oShell - префиксы не нужны. Так же не нужны префиксы для обозначения типа, например, если известно, что расчет валюты ведется в целых числах:

Точно подмечено.

Rumata пишет:

Но и в крайности не стоит впадать - нет необходимости подробно именовать переменные, например, если они используются как индексы массивов.

Тоже согласен. А наличие подчёркивания - уже на вкус и цвет.


JSman пишет:

Однозначно я солидарен с Xameleon по поводу нежелательности публикации грязного кода.

Дословно (и в отношении Вас) записано как "нельзя". Нежелательность же она такая же как и желательность, у Вас одна, у меня другая. Я уже писал об этом. На мой взгляд, нужно смотреть на избирательность в допустимости. На вопрос "как можно сделать, чтобы применить..." - отвечаем в пределах зоны осторожности (комментарии и т.п.), на вопрос о конечном рабочем коде на запуск исходим уже из своих предпочтений в написании.


Господа, давайте лучше вспомним статью про трату ресурсов на лишние объявления переменных. Где же она там была, не могу ссылку найти...