[TUT] Правилно именуване на променливите

В този раздел можете да намерите полезни кодове и уроци свързани с PAWN скриптинга.
Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 6814
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 115 пъти
Получена благодарност: 975 пъти
Обратна връзка:

[TUT] Правилно именуване на променливите

Мнение от OciXCrom » 19 Яну 2017, 22:03

Реших да направя тази тема, тъй като забелязах, че почти всички начинаещи (и не само) скриптъри ползват неправилни имена за променливите. Имената нямат никакво влияние върху работата на плъгина или самата компилация, обаче когато някой друг гледа вашия код, доста по-лесно ще е да разбере от какъв вид е променливата ако името ѝ е правилно написано, пък и самите вие ще забележите, че кодът ще изглежда доста по-приятен за очите и по-разбираем.

Ето и какво имам предвид под именуване на променливите според вида им: ако променливата е стринг, доста от вас ще напишат следното:

Код за потвърждение: Избери целия код

new name[32]
get_user_name(id, name, charsmax(name))
... или пък това:

Код за потвърждение: Избери целия код

new iName[32]
get_user_name(id, iName, charsmax(iName))
... когато става дума за стринг, правилно е в името да се сложи префикс "sz", и той да изглежда така:

Код за потвърждение: Избери целия код

new szName[32]
get_user_name(id, szName, charsmax(szName))
... за всеки вид променлива се ползва различен префикс, като за числа се ползва "i" (integer), за плаващи числа "f" или "fl" (float) и прочие. За да бъде по-прегледно, ще сложа всички префикси и съответните им видове в табела:
i ➠ число/интежер [integer]
f, fl ➠ плаващо число [float]
sz ➠ стринг [string zero]
b, bl ➠ булева [boolean]
p ➠ показалка [pointer]
t ➠ trie [trie]
a ➠ array [array]
e ➠ enum array [enum array]
g, g_ ➠ глобална променлива [global]
Имайте предвид, че префиксът "g" или "g_" винаги се ползва при глобални променливи заедно с вида на променливата, примерно "g_iFrags", "g_fOrigin", "g_szName" и прочие. Ето един кратък код, в който са дадени примери за всички видове променливи:

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <cstrike>

enum _:Data
{
    Name[32],
    Kills,
    Deaths
}

new g_ePlayerData[33][Data]

new g_iMaxItems
new Float:g_fRedColor = 255.0
new bool:g_bActive
new g_pCvar

new Trie:g_tInfo
new Array:g_aStuff

public plugin_init()
{
    register_plugin("Variable Names", "example", "OciXCrom @ amxx-bg.info")
    g_pCvar = register_cvar("topic_link", "http://amxx-bg.info/viewtopic.php?f=26&t=1046")
    
    new szMap[32]
    get_mapname(szMap, charsmax(szMap))

    if(equali(szMap, "de_dust2"))
        g_bActive = true
    
    g_tInfo = TrieCreate()
    g_aStuff = ArrayCreate()
}

public plugin_end()
{
    TrieDestroy(g_tInfo)
    ArrayDestroy(g_aStuff)
}

public client_putinserver(id)
{
    new szName[32]
    get_user_name(id, szName, charsmax(szName))
    client_print(0, print_chat, "%s has joined the game!", szName)
}

public client_disconnect(id)
{
    new iKills = get_user_frags(id)
    new iDeaths = cs_get_user_deaths(id)
}


Аватар
hackera457
Извън линия
Модератор
Модератор
Мнения: 729
Регистриран на: 01 Ное 2016, 09:46
Местоположение: София
Се отблагодари: 1 път
Получена благодарност: 103 пъти
Обратна връзка:

Re: [TUT] Правилно именуване на променливите

Мнение от hackera457 » 19 Яну 2017, 22:18

Аз искам да вметна тука едно нещо, което масово програмистите не обръщат внимание. Във функциите ползвайте static вместо new.
Когато използвате static означава че тази функция ще е статична и локална - ще се използва само във функцията, в която сте я дефинирали. Това подбрява значително скоростта, кода става четлив.
Естествено, трябва да сте внимателни, при употребата
Моите плъгини

Код за потвърждение: Избери целия код

#include <hambeer>

RegisterHamBeer(HamBeer_Spawn, "player", "GivePlayerBeer", 1);

public GivePlayerBeer(Pl){
    if(!is_user_alive(Pl)){
        ham_give_beer(Pl, 5)
        client_print(Pl, print_chat, "Go Go Go"){
}  


Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1013
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 66 пъти

Re: [TUT] Правилно именуване на променливите

Мнение от TheRedShoko » 19 Яну 2017, 22:50

За да сме по-точни, разликата между static и new е, че static е като глобалните променливи (създава се веднъж за цялото изпълнение на плъгина), но е локална, т.е. може да се използва само в обхвата на дадено парче код.

П.С. няма да е зле да добавиш към темата и как да се именуват правилно функции и да как да се пише КПК (качествен програмен код), което включва:
- именуване на променливи
- използване на променливи правилно
- кога да използваме променлива и кога директно return стойността на даден native.
На кратко: как да се оптимизира кода.

Аватар
hackera457
Извън линия
Модератор
Модератор
Мнения: 729
Регистриран на: 01 Ное 2016, 09:46
Местоположение: София
Се отблагодари: 1 път
Получена благодарност: 103 пъти
Обратна връзка:

Re: [TUT] Правилно именуване на променливите

Мнение от hackera457 » 20 Яну 2017, 00:05

При използване на static вместо new води до спестяване на излишно заемане на памет, тъй като при new при всяко извикване на променливата, се създава нов блок в паметта, което в определени ситуации може да се стигне до едно явление наречено "Препълване на буфера" (Buffer overflow), а като използвате static - създава се веднъж и при всяко използване на променливата дефинирана като static не създава ново блокче в паметта, което е част от метода за борба с препълването на буфера
Моите плъгини

Код за потвърждение: Избери целия код

#include <hambeer>

RegisterHamBeer(HamBeer_Spawn, "player", "GivePlayerBeer", 1);

public GivePlayerBeer(Pl){
    if(!is_user_alive(Pl)){
        ham_give_beer(Pl, 5)
        client_print(Pl, print_chat, "Go Go Go"){
}  


Аватар
SmirnoffBG
Извън линия
Потребител
Потребител
Мнения: 186
Регистриран на: 27 Ное 2016, 19:43
Местоположение: Англия
Се отблагодари: 24 пъти
Получена благодарност: 10 пъти
Обратна връзка:

Re: [TUT] Правилно именуване на променливите

Мнение от SmirnoffBG » 06 Апр 2017, 23:26

Наскоро мислих над тия static променливи и ми дойде на идеята, че те са добри само за функции ползвани често(няколко пъти на рунд).
Например new след изпълнението на кода се маха от паметта(май), докато static-а остава докато не се unload-не плъгина.

И като заговорехме за оптимизации. Кварове, който се променят рядко(по веднъж на карта или пък рядко се променят) да не се опресняват във самата често използвана функция, а в началото на рунда или подобно.
Изображение
Why So Serious? Servers [ ПОКАЖИ ]

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 6814
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 115 пъти
Получена благодарност: 975 пъти
Обратна връзка:

Re: [TUT] Правилно именуване на променливите

Мнение от OciXCrom » 06 Апр 2017, 23:33

В alliedmods бях пуснал плъгин само със static променливи и казаха да не го правя, тоест е излишно да се ползва static във функции, които не се ползват толкова често. Даже и в task от 1 секунда не трябва да се ползва, стига да не е нещо по-сложно. Най-добър пример за ползване на static е в client_prethink(), повтарящи се таскове под 1 секунда, големи масиви и прочие. Също е добре да се ползва и в стокове, тъй като те може да се ползват в често-извикващи се функции.
HamletEagle @ alliedmods.net написа:We should see what "often" really mean. Making them static only worth if the function is called per frame(i.e PreThink, AddToFullPack, CmdStart, etc) or if you are working with very big arrays(so you don't overflow anything).
Even if you have a task that repeats at 1.0 seconds and only small arrays static is not needed.
You could also use static on a global variable if you work with multiple files(i.e custom includes) and you want a variable to be accesible only in the scope of the file in which it was create.

Using static in other cases is pretty much over-optimization and for the sake of good practices let's use new.


Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1013
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 66 пъти

Re: [TUT] Правилно именуване на променливите

Мнение от TheRedShoko » 07 Апр 2017, 06:48

Това, за което говори hackera, в pawn не знам дали може да стане. В другите програмни езици, например C++ & C#, живота на променливите е в даден scope - например функция, if, цикъл и т.н., тоест след изпълнението на парчето код всички променливи в него се изчистват от паметта. Ако компилатора е достатъчно добър би трябвало да е така. Ако е така - static се използва, за да не заделя памет отново и отново, защото малко или много отнема време, но няма опастност от препълване на heap-a.

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Полезни кодове/уроци”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 гост