Что нового

Вредные и полезные привычки при написаний AutoIt-кода

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Вредные и полезные привычки при написаний AutoIt-кода
или
Плохая и хорошая практика программирования


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


Вот мои полезные привычки (на мой взгляд):

1. Соеденяю стили через BitOR, а не через оператор сложения (+).
2. Проверяю стили и состояния элементов через BitAND, а не через оператор сравнения (=).
3. Всегда использую константы, и не их значения (a.k.a Магическое число).
4. Пишу всегда полные пути к файлам (исключением естественно является FileInstall :smile:).
5. При запуске программ с параметрами, использую кавычки.
6. Использую #Region, #CS/CE и т.п.
7. Дополнительные файлы, ресурсы и библиотеки храню в подпапке (Resoureces или Includes).
8. Стараюсь не использовать системные иконки.
9. Стараюсь добавлять комментарий к важным/сложным частям кода.
10. Стараюсь использовать целые библиотеки по назначению, а не вытаскивать из них только нужные мне функций :whistle:.
11. Стараюсь не использовать временных файлов.
12. Автоматизацию внешнего приложения, стараюсь делать на “программном уровне”, а не использовать имитацию нажатий клавиш и т.п.
13. Выполняю проверку кода после каждого мелкого изменения (это скорее паранноя, но сейчас уже меньше этим занимаюсь).
14. Пишу код так, чтобы не нужно было потом использовать Tidy (аккуратность).
15. Использую немало встроенных аббревиатур (подробнее).
16. GUI полностью пишу руками.
17. Стараюсь код писать так, чтобы через пару лет смог его понять.
18. Если программа имеет запоминаемые настройки (обычно использую ini), обязательно делаю так чтобы она работала сходу и генерировала нужные файлы при запуске.
19. Программы обычно пишу не для себя, поэтому они получаются лучше.

А вот вредные привычки, хотя это под вопросом (раньше кстати их было намного больше):

1. Не использую MustDeclareVars (это скоррее “непривычка”).
2. Вcё же забываю иногда писать комментарий.
3. Пишу код, при этом иногда брожу по комнате в раздумиях :laugh: .
4. Составляю план действия только после того как начал работать над проектом.
5. Часто прекращаю работу над проектом на неопределённое время. И совсем не обязательно из за того что застрял над какой то частью, чаще всего это происходит из за падения мотиваций, либо отсутствия свободного времени (последнее огорчает больше :().
6. Работаю над нескольками проектов сразу :wacko:.
7. Присваиваю переменным уникальные и полные имена, иногда могу “застрять” минут на 10 пока не придумаю достойное имя переменной.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
281
Не знаю, полезная это привычка или вредная.
На первом этапе всегда смотрю и проверяю значения переменных
через MsgBox или _ArrayDisplay.
И вот еще:
на ответах форума (после замечаний) уже не использую вызов
функции через Call("Func"), а просто Func().
В скриптах для себя - Call("Func")
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Call("Func") - это не вредная привычка, а неправильное использование функции Call() или ее непонимание.

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

Yuri

AutoIT Гуру
Сообщения
737
Репутация
281
Yashied
Как ее (Call) правильно понимать?
Возможно подразумевается вызов сторонней
функции (из системной библиотеки, например, или др. библиотеки)?
А так, использовал ее, просто из-за наглядности кода для себя.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Если функция однозначно определена в коде, то ее нужно вызывать просто по имени. Call() в основном предназначена для тех, кто пишет UDF библиотеки, a.k.a. пользовательская Callback функция. Для примера см. AdlibRegister().

Yuriy сказал(а):
А так, использовал ее, просто из-за наглядности кода для себя.
В AutoIt принято пользовательские функции (те, которые не входят в AutoIt.exe) называть с символа "_", например:

Код:
_MyFunc()
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
281
Yashied
Спасибо. Теперь понятно.
Вот еще хотел добавить.
Многие в MsgBox используют первый параметр 0.
MsgBox (0, "111", "222")
Я привык к 3-м:
16 - ошибка
48 - предупреждение
64 - сообщение
И только эти 3 в основном использую.
Это вредная привычка?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Yashied [?]
советую всем завести полезную привычку пользоваться Tidy для приведения вашего кода в читабельный вид
Пользуюсь только для UDF, обычный код (пример, или тело скрипта) пишу сразу аккуратно.
 

ynbIpb

Скриптер
Сообщения
398
Репутация
109
полезные:
1. Обильно коментирую код.
2. Всегда пишу аккуратно (Tidy )
3. Стараюсь делать программы Portable. Чтоб никуда ничего лишнего в систему не пихалось и не привязывалось к абсолютным путям, настройки храню не в реестре, а в ini, типа @scriptdir & "\settings.ini"
4. имена переменных всегда осмысленные на инглише. Использую правила написания переменных типа первая буква означает тип.

вредные:
1. Не довожу проекты до конца. Пропадает энтузиазм.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
ynbIpb [?]
Стараюсь делать программы Portable. Чтоб никуда ничего лишнего в систему не пихалось и не привязывалось к абсолютным путям, настройки храню не в реестре, а в ini, типа @scriptdir & "\settings.ini"
+1.


Не довожу проекты до конца. Пропадает энтузиазм.
Мда, оказывается я не один такой :reading_book:
 

Ganibal95

GreenBytes
Сообщения
875
Репутация
237
Вредные или хорошие, да у меня по моему все вредные)
1. Пытаюсь делать программы много функциональными
2. Как что-нибудь новое узнаю сразу прикручиваю к том что уже делаю...
3. Редко довожу проекты до конца(Очень редко, если цель поставлю ток)
4. Пишу код не акуратно, другие не могут понять где-что, а я быстро нахожу. И хоть не акуратно пишу, зато работает)
5. Переменные на бум, с ними не заморачиваюсь
6. Использую tidy
7. После мелких или больших изменений врубаю скрипт и любуюсь, несколько раз врубаю...
8. Когда не за компом формулирую мысли в мозгах как можно примерно сднлать...
9. Иногда хожу по комнате...
10. Храню настройки в ini, через ресстр мудно...
11. пытаюсь делать что-то интерестное, и для себя, только вот потом у меня программы качают... И не могут разобратся)
12. Гуй делаю через коду...
вроде все =)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
OffTopic:
CreatoR [?]
а не через оператор присваивания (+).
небольшая поправка, "+" это оператор сложения, а не присвоения :whistle:



Добавлено:
Сообщение автоматически объединено:

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


Добавлено:
Сообщение автоматически объединено:

Ganibal95 [?]
1. Пытаюсь делать программы много функциональными
однофункциональные программы, как бы, не в особом почете ;D
если цель поставлю ток
а ток тем временем течет по проводам
9. Иногда хожу по комнате...
в остальное время, надо полагать, летаешь ;D
через ресстр мудно...
у нас не матерятся ;)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
AZJIO [?]
а есть ли случай когда сложение через оператор не работает?
Да.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$nStyles = IniRead(@ScriptDir & "\Config.cfg", "Main", "GUI Style", $GUI_SS_DEFAULT_GUI + $WS_MAXIMIZEBOX) ;Тут допустим мы сохранили стили при последнем запуске
$nStyles += $WS_MAXIMIZEBOX ;BitOR($nStyles, $WS_MAXIMIZEBOX)

$hGUI = GUICreate("Test Script", 300, 200, -1, -1, $nStyles)
GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Без BitOR мы получаем совершенно другой стиль, а с ним мы надёжно пытаемся добавить стиль, если он уже содержится, то повторно добавляться не будет. Кстати,
Код:
BitOR($nStyles, $WS_MAXIMIZEBOX)

эквивалентно проверке
Код:
If Not BitAND($nStyles, $WS_MAXIMIZEBOX) Then $nStyles += $WS_MAXIMIZEBOX


Если автор скрипта не добавил к Checkbox иные стили, то зачем лишний функции?
Это называется манерой хорошего (правильного) программирования, и чем эти функций лишние?

почему? например "Обзор" - иконка папки под номером 4 имеет тот же номер и в других версиях Windows.
Ну это только один пример. Я не раз сталкивался с ситуацией, когда используемые мной иконки в программе не отображались, или отображались неправильно в Win Vista/7.

Кстати отдельная тема
Поднимай, у меня есть что ответить ;).

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

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

SyDr

Сидра
Сообщения
651
Репутация
158
Ну, во-первых, я ленив.
Во-вторых... А впрочем... См. выше.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
AZJIO [?]
а есть ли случай когда сложение через оператор не работает?
Пример:

Есть три стиля:
Код:
$Style1 = 1
$Style2 = 2
$Style3 = 4


Если их представить в бинарной системе счисления, получится
Код:
$Style1 = 001
$Style2 = 010
$Style3 = 100


Для каждого стиля используется свой бит, последний бит для первого стиля, предпоследний для второго итд.

Например мы используем 1 и 3 стили. 1+4=5. 5 в бинарной системе - 101.
101 последний бит - единица, значит используется первый стиль.
101 предпоследний бит - 0, значит второй стиль не используется.
101 первый бит - 1, значит используется третий стиль.

Проще говоря, стоит единица - есть стиль, стоит 0 - нет стиля.

Проблемы начнутся, если один и тот же стиль будет "прибавлен" несколько раз.
Например нам снова нужны 1 и 3 стили, но первый мы прибавим два раза.
1+1+4=6. 6 в бинарной системе - 110.
Вместо желаемого первого стиля получился второй, который был как раз не нужен.


Функция BitOR проверяет каждый бит нескольких чисел. Если хотя бы в одном из чисел этот бит равен 1 (похоже на оператор Or), то тот же по счёту бит в числе, которое вернёт функция, тоже будет 1, иначе 0.

Тот же пример с двумя одинаковыми стилями BitOR(1, 1, 4), в бинарной системе BitOR(001, 001, 100):

Проверяем первый бит:
Первое число - 0
Второе число - 0
Третье число - 1
Есть единица, значит в первом бите результата тоже будет единица.

Проверяем второй бит:
Первое число - 0
Второе число - 0
Третье число - 0
Нет единицы, значит во втором бите результата будет ноль.

Проверяем третий бит:
Первое число - 1
Второе число - 1
Третье число - 0
Есть единица, значит в третьем бите результата тоже будет единица.

Итого: 101, в десятичной системе это 5, несмотря на то, что первый стиль был использован два раза.

AZJIO [?]
Если автор скрипта не добавил к Checkbox иные стили, то зачем лишний функции?
Например проверить наличие стиля $ES_READONLY у Edit. Кроме $ES_READONLY там могут быть например $ES_AUTOVSCROLL и $ES_AUTOHSCROLL, а могут и не быть. Заранее нужное число для оператора = не угадаешь. А BitAND проверит наличие именно нужного стиля.

Я в For-цикле всегда пишу Step, причём со знаком.
Код:
For $i = 0 To 10 Step +1

Красивее имхо :smile:

Вместо " пишу ', потому что " часто приходится писать внутри строк.
Код:
ShellExecute('"моя папка\мой файл"')
ShellExecute("""моя папка\мой файл""")
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Из полезного:
1. Для громоздких проектов делаю наброски на бумаге (жуткие схемы с таблицами и стрелочками под клавиатурой)
2. GUI делаю вручную
3. Стараюсь делать осмысленные названия переменных. Первая буква = тип переменной.
4. Если переделываю часть кода, то старый сохраняю в комментариях, чтобы можно было вернуться.
5. Код оформляю со всеми отступами - так его лучше просматривать, блоки кода разделяю пустыми строками.
6. Полезные функции, примеры и методы храню в отдельной папке.
Из вредного:
1. Терпеть не могу двойные кавычки (это какой-то бзик :wacko:smile:, поэтому везде где можно ставлю одинарные :smile:
2. Иногда забрасываю проекты, не допилив весь функционал.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Redline сказал(а):
Терпеть не могу двойные кавычки (это какой-то бзик :wacko:smile:, поэтому везде где можно ставлю одинарные
Это скорее "+", т.к. двойные кавычки можно легко принять за две одинарные.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Redline [?]
Терпеть не могу двойные кавычки
Аналогично. Единственный минус одинарных кавычек - #OnAutoItStartRegister их не воспринимает (у меня).
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
357
AZJIO
делаю после каждой фичи копию скрипта с добавлением индекса 1,2 и т.д. чтоб в любой момент вернутся к предыдущему варианту или вытащить из старой копии фичу
Аналогично, для каждого серьезного проекта своя папка, в ней - файлы с номерами.
 
Верх