Что нового

Эволюция кода. Оптимизация датчиков.

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Издревле перед нами, кастой ленивых ботоводов, стояла проблема оптимизации кода, чтобы было и попроще и по функциональнее. Всегда хотелось чтобы он был более гибким, более универсальным и занимал как можно меньше места. Я опущу самый банальный пример когда данные вписываются напрямую в какую-нибудь команду:
Код:
Pixelsearch(1,2,3,4,0x000000, 10)

И сразу перейду к следующему более актуальному примеру который думаю использует процентов 90 ботоводов. В этом примере для наглядности я заменю PixelSearch командой MsgBox, таким образом в всплывающем окне будет отображаться инфа которую содержат заданные выше переменные. Всё просто, в начале мы задаем или читаем из файла или еще откуда координаты, цвета и тд и тп, что угодно в зависимости от команды, а ниже идет универсальная функция которая при изменении координат внутри игры не требует вмешательств. Мы просто заменим координаты сверху и всё, функция снова работает.
Код:
Global $UndockButton[6] = [1,2,3,4,5,6]
Global $MainMenu[6] = [2,3,4,5,6,7]
Global $OverviewMenu[6] = [3,4,5,6,7,8]
Global $SelectedItem[6] = [4,5,6,7,8,9]

ConCheck("Кнопка Меню")

Func ConCheck($Check1)
   Select
	  Case $Check1 = "Кнопка Андока"
		 ;Local $var = PixelSearch($UndockButton[0], $UndockButton[1], $UndockButton[2], $UndockButton[3], $UndockButton[4], $UndockButton[5])
		 ;Тут и далее мы заменим PixelSearch банальным MsgBox, будет нагляднее
		 MsgBox(0,$Check1,$UndockButton[0]&@CR&$UndockButton[1]&@CR&$UndockButton[2]&@CR&$UndockButton[3]&@CR&$UndockButton[4]&@CR&$UndockButton[5])
	  Case $Check1 = "Кнопка Меню"
		 MsgBox(0,$Check1,$MainMenu[0]&@CR&$MainMenu[1]&@CR&$MainMenu[2]&@CR&$MainMenu[3]&@CR&$MainMenu[4]&@CR&$MainMenu[5])
	  Case $Check1 = "Кнопка Овервью"
		 MsgBox(0,$Check1,$OverviewMenu[0]&@CR&$OverviewMenu[1]&@CR&$OverviewMenu[2]&@CR&$OverviewMenu[3]&@CR&$OverviewMenu[4]&@CR&$OverviewMenu[5])
	  Case $Check1 = "Кнопка SI"
		 MsgBox(0,$Check1,$SelectedItem[0]&@CR&$SelectedItem[1]&@CR&$SelectedItem[2]&@CR&$SelectedItem[3]&@CR&$SelectedItem[4]&@CR&$SelectedItem[5])
   EndSelect
EndFunc


Следующим примером будет код функции ConCheck состоящий из меньшего количества строк но имеющий тот же функционал:

Код:
Global $UndockButton[6] = [1,2,3,4,5,6]
Global $MainMenu[6] = [2,3,4,5,6,7]
Global $OverviewMenu[6] = [3,4,5,6,7,8]
Global $SelectedItem[6] = [4,5,6,7,8,9]

ConCheck("Кнопка Овервью")

Func ConCheck($Check1)
   Local $var
   Select
	  Case $Check1 = "Кнопка Андока"
		 $var = $UndockButton
	  Case $Check1 = "Кнопка Меню"
		 $var = $MainMenu
	  Case $Check1 = "Кнопка Овервью"
		 $var = $OverviewMenu
	  Case $Check1 = "Кнопка SI"
		 $var = $SelectedItem
   EndSelect
	  MsgBox(0,$Check1,$var[0]&@CR&$var[1]&@CR&$var[2]&@CR&$var[3]&@CR&$var[4]&@CR&$var[5])
EndFunc


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


Если идти дальше, можно получить пример, круче которого только яйца:
Код:
Global $UndockButton[6] = [1,2,3,4,5,6]
Global $MainMenu[6] = [2,3,4,5,6,7]
Global $OverviewMenu[6] = [3,4,5,6,7,8]
Global $SelectedItem[6] = [4,5,6,7,8,9]

ConCheck("MainMenu")
ConCheck("UndockButton")
ConCheck("OverviewMenu")
ConCheck("SelectedItem")

Func ConCheck($Check1)
   Local $var = Eval($Check1)
   MsgBox(0,$Check1,$var[0]&@CR&$var[1]&@CR&$var[2]&@CR&$var[3]&@CR&$var[4]&@CR&$var[5])
EndFunc


В этом варианте функция ConCheck которая в данный момент эмулирует принцип работы примитивных датчиков, с 14 строк сократилась до 4-х.

Пользуйтесь на здоровье :smile:
 

yaodnako

Продвинутый
Сообщения
120
Репутация
78
Если просто пробежать глазами, то вроде ничо особенного, но Если перед кем-то хоть раз стоял вопрос оптимизации кода, то сразу становится ясно - пример Бельфа просто омгбдыщь строк кода срезает. По крайней мере в боте, что на форуме я выкладывал точно дофига срежет.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Belfigor
Объясните пожалуйста, чем такой вариант хуже?
Код:
Global $UndockButton[6] = [1,2,3,4,5,6]
Global $MainMenu[6] = [2,3,4,5,6,7]
Global $OverviewMenu[6] = [3,4,5,6,7,8]
Global $SelectedItem[6] = [4,5,6,7,8,9]

ConCheck($MainMenu)
ConCheck($UndockButton)
ConCheck($OverviewMenu)
ConCheck($SelectedItem)

Func ConCheck($var)
   MsgBox(0,'',$var[0]&@CR&$var[1]&@CR&$var[2]&@CR&$var[3]&@CR&$var[4]&@CR&$var[5])
EndFunc
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Тем, что не всегда известно какую проверку надо выполнить в ConCheck.


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

Грубо говоря такой пример:
Код:
Local $var = ConCheck("bla", "blablalba", "bla bla", "blabla")
If Not @error Then 
	Local $var2 = ConCheck($var)
	If Not @error Return $var2
        SetError(121212)
	Return 0
Else
	Return "#Global Error"
EndIf

В котором например первая проверка может вернуть несколько вариантов, например "UndockButton", "MainMenu" и что-нибудь еще. Тебе заранее не известно какой результат ты получишь и на каждый результат в таком случае, тебе придется описывать своё условие в котором будет жестко прописана переменная отправляемая в ConCheck.



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

То есть в твоем случае то что описал выше я, будет выглядеть так:
Код:
Local $var = ConCheck("bla", "blablalba", "bla bla", "blabla")
If Not @error Then 
	If $var = "UndockButton" Then
		Local $var2 = ConCheck($UndockButton)
		If Not @error Return $var2
	ElseIf $var = "MainMenu" Then
		ConCheck($MainMenu)
		If Not @error Return $var2
	ElseIf $var = "anythingelse"
		ConCheck($anythingelse)
		If Not @error Return $var2
	EndIf
	SetError(121212)
	Return 0
Else
	Return "#Global Error"
EndIf


А если вариантов возврата 1-й функции не 3 например а 10-15 то пропорционально вырастает и код. В варианте же Eval по прежнему будет 9 строк.
 
Верх