Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 2 ПерваяПервая 1 2
Показано с 11 по 18 из 18
  1. #11
    Аватар для Scander
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.05.2021
    Сообщений
    24
    Репутация:
    2 ±
    А как тогда избавиться от повторяющегося кода?
    Сейчас работаю над системой инвентарей и пока пишу код думаю "блин, я же буду писать тоже самое для системы шкафа/багажника/склада и т. д.", т. к. они все будут однотипны: у них есть окно, слоты, айтемы внутри, меню для взаимодействия с айтемом.
    Соответственно, можно было бы написать какой-нибудь базовый класс Container с методами addItem, removeItem и со свойствами например weight, capacity и т. д. И от него наследовались бы Inventory, Trunk, Storage и т. п.
    Но гавн вынуждает меня создавать однотипные функции и enum'ы.

  2. #12
    Аватар для Scander
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.05.2021
    Сообщений
    24
    Репутация:
    2 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Не только диагностики. Из самого значимого, что будет в следующем релизе:
    Однако, я намеренно не добавляю этот функционал в свои "неофициальные" релизы, чтобы избежать случаев, когда пользователи преждевременно подстраивают свои скрипты к новым возможностям компилятора.
    Например, если нужно использовать в макросе новый функционал __pragma, но при этом сохранить совместимость со старыми версиями компилятора, то в следующей версии (3.10.11) это можно будет сделать так:
    1. #if __Pawn >= 0x030A && defined __PawnBuild
    2. #if __PawnBuild >= 11
    3. #define _MAYBE_UNUSED_ __pragma("unused")
    4. #endif
    5. #endif
    6. #if !defined _MAYBE_UNUSED_
    7. #define _MAYBE_UNUSED_
    8. #endif
    9. // ...
    10. new _MAYBE_UNUSED_ x; // компилятор не будет жаловаться, что переменная не используется

    Однако мои билды распознаются как текущая версия (3.10.10), поэтому если я добавлю туда что-то из нового функционала, пользователи начнут адаптировать под него скрипты так, как будто он появился в текущей версии, а не в следующей:
    1. #if __Pawn >= 0x030A && defined __PawnBuild
    2. #if __PawnBuild >= 10
    3. #define _MAYBE_UNUSED_ __pragma("unused")
    4. #endif
    5. #endif

    Такая фрагментация среди сообщества недопустима и я не хотел бы вносить в неё вклад. Именно поэтому я специально не включаю новый функционал в свои билды, а добавляю только самое необходимое: багфиксы и новые диагностики.
    В принципе про диагностики тоже можно заявить, что они нарушают совместимость, но на самом деле с ними всё проще: для их отключения не обязательно полагаться на конкретную версию компилятора, достаточно лишь проверить объявление __PawnBuild (появилось в релизе 3.10.1, вышедшем 4 года назад), чтобы убедиться, что это не слишком старая версия компилятора и мы можем использовать #pragma warning:
    1. #if __Pawn >= 0x30A && defined __PawnBuild
    2. #pragma warning disable 249
    3. #endif

    Если в компиляторе есть 249-я диагностика, она будет отключена, если нет - строка с #pragma будет проигнорирована.


    По-моему, я уже как-то говорил на этом форуме, что это не просто баг, а недоработка в коде чтения/препроцессирования исходных файлов. Изменения в столь фундаментальном механизме могут отразиться на совместимости с некоторыми скриптами/инклудами, или же замедлить компиляцию.


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


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


    Проблемы, перечисленные выше, я оставляю на потом не из вредности. То, что я исправляю баги и делаю какие-то новые фичи для компилятора, не значит, что я всемогущий. Бывают проблемы, в правильном решении которых я не уверен, или какие-то вещи, в которых не разбираюсь - к таким вещам я привык возвращаться позже, когда лучше разберусь в вопросе, дабы не терять время на бесполезные поиски решения, а с гораздо большей эффективностью потратить его на устранение других проблем.
    А почему не используется компилятор 4-й версии? Это проблемно перейти на него?
    Хотел использовать такую вот штуку

    Но разочаровался( Не робит

  3. #13
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, если ты, при виде Pawn, так удивляешься тому, что не все языки - это C/C++, то что же с тобой будет когда ты до какого-нибудь Lua/Python доберёшься или вообще какой-нибудь Brainfuck увидишь? Да, Pawn не так гибок в функционале, но странно этой гибкости ждать от языка, основная задача которого - облегчить жизнь новичкам в программировании, дабы те не страдали от проблем при работе с памятью. Впрочем. не суть.

    Цитата Сообщение от Scander Посмотреть сообщение
    А как тогда избавиться от повторяющегося кода?
    Никак. Тебе в любом случае придётся явно прописывать, как минимум, часть кода для новых систем. А функции, при желании, можно сделать универсальными. Правда, ты этим только усложнишь последующую поддержку кода, но если очень хочется - дерзай.

    Цитата Сообщение от Scander Посмотреть сообщение
    Сейчас работаю над системой инвентарей и пока пишу код думаю "блин, я же буду писать тоже самое для системы шкафа/багажника/склада и т. д.", т. к. они все будут однотипны: у них есть окно, слоты, айтемы внутри, меню для взаимодействия с айтемом.
    Соответственно, можно было бы написать какой-нибудь базовый класс Container с методами addItem, removeItem и со свойствами например weight, capacity и т. д. И от него наследовались бы Inventory, Trunk, Storage и т. п.
    Но гавн вынуждает меня создавать однотипные функции и enum'ы.
    Тебе никто не запрещает написать мод в виде плагина, использовав так любимый тобой C++ или что тебе там нравится. Правда, сомневаюсь, что от этого твоя эффективность повысится, но, в любом случае, такая возможность у тебя есть.


    Цитата Сообщение от Scander Посмотреть сообщение
    А почему не используется компилятор 4-й версии? Это проблемно перейти на него?
    Хотел использовать такую вот штуку

    Но разочаровался( Не робит
    https://pro-pawn.ru/showthread.php?14174
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. #14
    Аватар для Scander
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.05.2021
    Сообщений
    24
    Репутация:
    2 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, если ты, при виде Pawn, так удивляешься тому, что не все языки - это C/C++, то что же с тобой будет когда ты до какого-нибудь Lua/Python доберёшься или вообще какой-нибудь Brainfuck увидишь? Да, Pawn не так гибок в функционале, но странно этой гибкости ждать от языка, основная задача которого - облегчить жизнь новичкам в программировании, дабы те не страдали от проблем при работе с памятью. Впрочем. не суть.
    А что не так с Python? Думаю, на нем бы мод писался лучше.
    Python тоже зарекомендовал себя как язык для новичков и в этом плане даже лучше гавна, тоже нет никакой работы с памятью.

    Просто я хотел красиво оформить исходники мода, а не писать новую функцию только потому, что она обращается к массиву с другим именем. На гавне приходится мириться с многими недостатками, что убивает у меня удовольствие от написания мода.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Никак. Тебе в любом случае придётся явно прописывать, как минимум, часть кода для новых систем. А функции, при желании, можно сделать универсальными. Правда, ты этим только усложнишь последующую поддержку кода, но если очень хочется - дерзай.
    Да, я думал создать универсальные функции, но это не очень. Ну может, подумаю над этим еще.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Тебе никто не запрещает написать мод в виде плагина, использовав так любимый тобой C++ или что тебе там нравится. Правда, сомневаюсь, что от этого твоя эффективность повысится, но, в любом случае, такая возможность у тебя есть.
    Как это делается? sampgdk как раз для этого? Или я путаю?

    Цитата Сообщение от DeimoS Посмотреть сообщение
    О, спасибо, надо попробовать.
    UPD: Проект мертв(


    Ну и вопросик еще один. В том же С++, например, когда ООП код с наследованием компилируется в output - в нем наследуемые методы (функции) также в единственном экземпляре существуют как в прописано в исходном файле?
    Последний раз редактировалось Scander; 25.05.2021 в 11:57.

  5. #15
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Scander Посмотреть сообщение
    А что не так с Python? Думаю, на нем бы мод писался лучше.
    Python тоже зарекомендовал себя как язык для новичков и в этом плане даже лучше гавна, тоже нет никакой работы с памятью.
    С Python всё так. Просто это ещё один язык, который отличается от того же С++ и не повторяет его возможностей.
    Повторюсь, у каждого языка есть свои сильные и слабые стороны. А ты сейчас пытаешься натянуть какие-то свои предпочтения на язык, задачи которого заключаются совершенно в другом, да ещё и так кринжово зачем-то название коверкаешь. И особенно кринжово всё это выглядит с учётом того, что для SAMP есть плагины-интерпритаторы для многих языков: тот же SAMPHP, например. Да и, при большом желании, можно даже самому реализовать нечто подобное. Но ты, видимо, предпочитаешь просто критиковать язык и, при этом, продолжать им пользоваться, что странно. Как говорится: "мыши плакали, кололись, но продолжали жрать кактус" =)

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

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

    Цитата Сообщение от Scander Посмотреть сообщение
    Как это делается? sampgdk как раз для этого? Или я путаю?
    Да хоть sampgdk, хоть собственную библиотеку реализуй. Было бы желание.
    На эту тему и статьи видел, и даже мод готовый кто-то в паблик сливал.
    Последний раз редактировалось DeimoS; 27.05.2021 в 19:55.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #16
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Ок. Банальная диагностика и ошибка (?), чтобы люди не тратили много времени, которые не знают об этом.
    Даже если и реализовать такую ошибку, компилятор банально не успеет вывести её перед крашем. Проблема в том, что падение происходит на этапе препроцессирования, когда варнинги и сообщения об ошибках отключены (так сделано специально, т.к. изначально возникает много ложных ошибок и предупреждений, которые разрешаются только при последнем проходе компилятора).

    Цитата Сообщение от tnc Посмотреть сообщение
    Из последних моих систем, которые требовали бы больше измерений то это казино. Если нужно, то могу более подробней рассказать, но это не первый случай, когда не хватает 4 измерении.
    Если это и в самом деле очень нужно, то да, лучше расскажи. Просить об этом сопровождающих компилятора от своего имени я не хотел бы, но если есть свой аккаунт на GitHub - готов помочь с переводом/подготовкой обращения. Самое главное - это показать сопровождающим реальный пример, где нужно более 4 измерений в массивах.

    Цитата Сообщение от Scander Посмотреть сообщение
    А почему не используется компилятор 4-й версии? Это проблемно перейти на него?
    На момент внедрения в SA-MP, последней версией языка была 3.2. В 4.0 сильно изменился синтаксис, сломана совместимость со скриптами для 3-й версии. Мало кто захочет переписывать свои скрипты под новый язык.

    Цитата Сообщение от Scander Посмотреть сообщение
    Python тоже зарекомендовал себя как язык для новичков
    Учить новичков на языке с нулевым контролем над ошибками? Отличная идея!

    UPD: Тем временем, удалось согласовать первый этап по внедрению подобия ООП в виде методов, привязанных к тегам:
    https://github.com/pawn-lang/compile...ment-850971040
    На следующей неделе, как будет время, попробую поэкспериментировать с реализацией.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. #17
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    UPD: Тем временем, удалось согласовать первый этап по внедрению подобия ООП в виде методов, привязанных к тегам:
    https://github.com/pawn-lang/compile...ment-850971040
    На следующей неделе, как будет время, попробую поэкспериментировать с реализацией.
    Интересный синтаксис:

    1. native Tag_Function(Tag:this, a, b);
    2. stock Tag_Function(Tag:this, a, b)
    3. {
    4. }


    Если я правильно понял, то this, "указатель/ссылка" на класс в чей области находится метод? С чем связанно такое решение? В других языках this на свой же класс передается не явно и мне кажется это best practice.

  8. #18
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Если я правильно понял, то this, "указатель/ссылка" на класс в чей области находится метод?
    Цитата Сообщение от tnc Посмотреть сообщение
    В других языках this на свой же класс передается не явно и мне кажется это best practice.
    Не совсем правильно. По сути Y_Less предлагал что-то вроде автозамены "Tag.Function(a, b)" на "Tag_Function(Tag:this, a, b)", как в макросах, объясняя это простотой реализации. В посте по ссылке выше я раскритиковал такую идею, ибо лепить "Tag.Function" в одно имя "Tag_Function" - заведомо провальная идея из-за лимита в 31 символ.
    Касаемо конкретно this, по задумке этот аргумент должен указываться неявно, и в этом плане у меня претензий нет.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 2 из 2 ПерваяПервая 1 2

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •