Skocz do zawartości
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
Zaloguj się, aby obserwować  
MAGNET

[SM] Najczęściej popełniane błędy

Polecane posty

jak dobrze wiemy każdy, kto nauczył się dobrze wykonywać jakąś czynność (czy to gra na gitarze, żonglowanie, czy gotowanie) musiał przejść przez długą drogę w celu osiągnięcia wysokiego poziomu. Nie inaczej sprawa ma się z programowaniem - każdy musi popełniać masę błędów, aby się na nich uczyć i wyciągać odpowiednie wnioski.

Okazuje się jednak, że są pewne rzeczy, które wydaje nam się, że robimy poprawnie, jednak rzeczywistość potrafi być zgoła inna - mowa tutaj o błędach, które popełniamy, mimo iż myślimy, że wszystko tworzone jest zgodnie ze sztuką.

 

W tym temacie chciałbym, abyśmy podzielili się swoimi spostrzeżeniami - jakie są najczęstsze błędy, które popełniamy, pisząc programy ?(oczywiście mowa o SourcePawnie 🙂 ). Będzie to doskonałe źródło wiedzy i zarazem miejsce, do którego będzie można wracać za każdym razem, gdy napotkamy problem, lub będziemy chcieli eliminować po kolei popełniane błędy.

Wypadałoby, żebym od czegoś zaczął, więc oto błąd, który moim zdaniem pojawia się dość często:

Kiedy tworzymy operacje, które mają się wykonać za jakiś czas w przyszłości (np. Timer, naciśnięcie przycisku w menu przez gracza, callback z zapytania SQL), które wymagają przekazania identyfikatora gracza (dobrze nam znane "client"), zazwyczaj popełniamy w tym miejscu błąd, ponieważ podczas tego interwału player może wyjść z serwera, a na jego miejsce wskoczyć nowy... więcej o tym zjawisku (i jak z nim walczyć), mówię tutaj:

 

 

A jakie są Wasze spostrzeżenia? Sprawmy, aby to forum było wszystkim, czego potrzebuje osoba, która chce zacząć przygodę z SM!

 

Pozdrowionka!

  • Lubię to! 3
  • Kocham to! 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Najważniejszym błędem jest brak analizy swojego kodu tylko robienie na pośpiech, kopiowanie podobnego kodu ze swoich innych pluginów, lub z neta oraz jak napisałeś

3 godziny temu, MAGNET napisał:

(np. Timer, naciśnięcie przycisku w menu przez gracza, callback z zapytania SQL), które wymagają przekazania identyfikatora gracza (dobrze nam znane "client"), zazwyczaj popełniamy w tym miejscu błąd, ponieważ podczas tego interwału player może wyjść z serwera, a na jego miejsce wskoczyć nowy...

 

Wszystko to powoduje coś takiego jak:

  • Niepoprawne działanie pluginu.
  • Większość czasu spędzimy nad naprawą błędu a mogliśmy to napisać sami bez problemów z umysłem.
  • Możliwość SQL_Injection poprzez kopiowanie tej samej metody bazy danych do każdego pluginu.

 

Taka rada na przyszłość, nie liczy się szybkość zlecenia ale jego jakość, nigdy nie róbcie wszystkiego na szybko, analizujcie kod i spędźcie nad nim tyle czasu ile on wymaga.

  • Lubię to! 4

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jednym z częstszych popełnianych błędów jest łączenie starej i nowej składni. Nie spotkałem się jeszcze z polskim objaśnieniem różnić pomiędzy starą, a nową składnią.

  • Lubię to! 2

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Indeksy. Za duży bufor, za mały bufor. Bufory powinny być odpowiednie, czyli minimum ile dana zmienna powinna być zmieścić, ani bita więcej bo w drastycznych przypadkach to i skutkuje skokami varu, a za mały bufor spowoduje błąd i niepoprawne działanie pluginu. 

  • Lubię to! 3

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
1 godzinę temu, supertimor napisał:

Indeksy. Za duży bufor, za mały bufor. Bufory powinny być odpowiednie, czyli minimum ile dana zmienna powinna być zmieścić, ani bita więcej bo w drastycznych przypadkach to i skutkuje skokami varu, a za mały bufor spowoduje błąd i niepoprawne działanie pluginu. 

Umiejętność poprawnego doboru rozmiaru buffera wymaga lekkiej wprawy, ale nie jest to aż takie trudne. O ile konsekwencje zastosowanie zbyt małego "schowka" jest dość oczywiste, o tyle nie wiem co masz na myśli mówiąc o "skokach varu". Mógłbyś doprecyzować?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Napisano (edytowany)

Przy dużej ilości pluginów np w codmodzie, gdy pluginy używają dużo więcej pamięci niż potrzeba - wiadomo, pamięć ucieka, czego skutkiem mogą być skoki varu, o czym przekonałem się kiedyś na początku mojej przygody z kodowaniem, tj. gdy powstawał surf+klasy

/ Ofc dzisiaj problemu z tym nie mam, jednak wspominam o przeszłości dla potomnych 😄 

Edytowano przez supertimor

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

1. Jak trzeba podać rozmiar tablicy, podają o jeden punkcik mniej, przykład:

char name[64];

Format(name, 63, "mójNick");

Gdzie prawidłowa forma to:

char name[64];

Format(name, 64, "mójNick");

A najlepszym nawykiem jest:

char name[64];

Format(name, sizeof(name), "mójNick");

2. Plugin niedostosowany do załadowania/wyładowania w trakcie gry. Warto w OnPluginStart wywoływać takie wydarzenia jak OnClientAuthorized, OnClientPutInServer itd., a w OnPluginEnd wywoływać OnClientDisconnect. Mega mało ludzi tak robi, bo nauczeni są restartować serwer przy wgraniu pluginu, źleeee. Co za tym idzie drugi błąd, ale pozwolę sobię go opisać, czyli pośrednie zapytanie SQL (threaded query) w OnPluginEnd. Niestety ale wtedy do zapisu może nie dojść.

3. Na siłę używanie bezpośrednich zapytań SQL (non-threaded query) bądź korzystanie ze SQLite, bo działają natychmiastowo. Niestety ale zapytania bezpośrednie potrafią nieźle zamulić serwer. Dopuszcza się używanie ich wtedy, kiedy np. dane zapisywane są przy wyładowaniu pluginu o czym napisałem wyżej, jednak kiedy jest okazja warto zawsze korzystać z "SQL_TQuery". SQLite jest dobre o ile jest tam dość mało danych, nie opłaca się używać SQLite kiedy dane są przypisane do np. graczy, wtedy przepełnienie bazy następuje dosyć szybko, a co za tym idzie serwer doznaje pojedynczych ścinek które trwają nawet po 0.5s, czyli jest to bardzo dokuczliwe.

 

  • Lubię to! 2
  • Dobry pomysł! 1
  • Kocham to! 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się
Zaloguj się, aby obserwować  

  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.

×