XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
eunikitin

offline
Опыт: 715
Активность:
Длинные имена идентификаторов и их замена
Привет комрады! Пишу на Jass (с использованием vJass и cJass) достаточно недолго. Написал пару библиотек для карты, и поскольку я в основное время пишу код для каких нибудь громоздких enterprise приложений, которые разрабатываются большим количеством людей, я привык давать идентификаторам длинные и информативные имена. Сейчас такая практика себя хорошо зарекомендовала, так как позволяет быстро разобраться в чужом, да и своем коде, вот только беда в том, что:
  1. С поддержкой автодополнения у редакторов, поддерживающих Jass, все туго, поэтому имена не нативных идентификаторов приходится писать ручками полностью, что как бы не доставляет
  2. Нет аналогов (ну или я не нашел, на что я кстати очень надеюсь) таких операторов как using в С++ или C# и import как в Java, что еще более не доставляет, так как имя библиотеки/области + имя идентификатора понижает не только скорость написания кода, но еще и легкость его восприятия.
Я хочу поделиться способом, который может частично решить эти проблемы. Его я придумал недавно (возможно не первый и не последний), и еще не успел прощупать всех его плюсов и минусов. Он основан на использовании текстовым макросов, так что для него необходим vJass. Идея такая: мы оборачиваем какой-либо кусок кода, чаще всего содержание всего файла текстовым макросом, аргументами которого будут наши заменяемые значения, используем их в коде, а затем сразу после описания макроса вызываем его, передавая реальные имена переменных в качестве значений аргументов.
Пример:
((код jass
Filename - SampleFile.j
! textmacro SampleFileUsing takes Controller, Model, View
scope SampleScope {
private $Controller$ controller;
private $Model$ model;
private $View$ view;
}
scope OtherSampleScope {
private $Model$ model;
private $View$ view;
}
! endtextmacro
! runtextmacro SampleFileUsing("SomeSampleLib_Controller", "SomeSampleLib_Model", "SomeSampleLib_View");
))
Внимание вопрос знатокам: Возможно у вас есть более оптимальные пути решения?

Отредактировано eunikitin, 10.03.2015 в 07:05.
Старый 10.03.2015, 06:37
DioD

offline
Опыт: 45,184
Активность:
define
Старый 10.03.2015, 11:29
adic3x

offline
Опыт: 107,539
Активность:
#define
#include
Старая версия манула, но думаю там есть база. Я еще много чего писал в комментариях и на вики:
ADOLF добавил:
так как имя библиотеки/области + имя идентификатора понижает не только скорость написания кода, но еще и легкость его восприятия.
Если я правильно понял суть проблемы, вы используете префикс public в библиотеках. Мое мнение - он не нужен. То, что private - пусть будет private, а объекты без ограничения области видимости могут использоваться как есть, без префикса.
Старый 10.03.2015, 11:51
eunikitin

offline
Опыт: 715
Активность:
DioD, Cпасибо! TESH про него не знает, а доки по cJass я нашел только 10 минут назад.
eunikitin добавил:
ADOLF, Спасибо за материалы, очень пригодятся!
ADOLF:
Если я правильно понял суть проблемы, вы используете префикс public в библиотеках. Мое мнение - он не нужен. То, что private - пусть будет private, а объекты без ограничения области видимости могут использоваться как есть, без префикса.
Может я не совсем понял вас, но:
((код jass
library Lib {
struct StructOne {}
public struct StructTwo {}
}
library OtherLib initializer Init {
void Init() {
Без явного указания того, что структура публичная, у меня сыпется ошибка о несуществующем типе
Lib_StructOne one = Lib_Test.create();
А с указанием работает отлично
Lib_StructTwo two = Lib_StructTwo.create();
}
}
))
Или вы про другое?
P.S. Сейчас почитаю доки, возможно пойму что вы имели ввиду:)
Старый 10.03.2015, 12:16
ScorpioT1000
Работаем
online
Опыт: отключен
поставьте сижассовый tesh - HORUS cjass.xgm.guru/files/?Horus-latest.zip
ScorpioT1000 добавил:
И зря вы пишете длинные имена в варкрафте, скорость исполнения кода напрямую зависит от длины имени, а с кучей скоупов прайватов вам некоторой задержки не миновать (а ядро то одно всегда).
Старый 10.03.2015, 13:06
eunikitin

offline
Опыт: 715
Активность:
ScorpioT1000, Спасибо! Кстати про длину имен - можно использовать обфускатор, если есть готовый, ну или написать самому. Когда карта идет в продакшн мы прогоняем код на обфускаторе, он заменяет имена на более короткие и мы не только не теряем, но и выигрываем в производительности.
сейчас поискал, xgm.guru/p/wc3/wc3mapopt-rus это вроде умеет

Отредактировано eunikitin, 10.03.2015 в 15:31.
Старый 10.03.2015, 14:09
adic3x

offline
Опыт: 107,539
Активность:
И зря вы пишете длинные имена в варкрафте, скорость исполнения кода напрямую зависит от длины имени, а с кучей скоупов прайватов вам некоторой задержки не миновать (а ядро то одно всегда).
Вот скорость исполнения это явно последнее дело в данном случае, тем более, что в релизах можно пройтись и оптимизатором.
сейчас поискал, xgm.guru/p/wc3/wc3mapopt-rus это вроде умеет
Он и есть. И умеет.
library Lib {
	struct StructOne {} // Эта структура и так может быть использована в любом месте
	public struct StructTwo {} // Я против. Это просто добавит префикс
        private struct StructThree {} // Вот это использовать нужно, думаю без объяснений
}

library OtherLib initializer Init {
	void Init() {
		// Вот так, просто давайте понятные имена
		StructOne one = Test.create();

		// Можно и так, но как по мне - префикс тут лишний
		Lib_StructTwo two  = Lib_StructTwo.create();
	}
}
а доки по cJass я нашел только 10 минут назад.
Эх, к сожалению я не могу советовать использовать его таки с чистой совестью - там есть некоторые баги. Нет, не критичные, просто при определенных ошибках в коде он может молча, по английски падать. Хотя, если знать, как его курить - то можно иметь очень неиллюзорный profit. Также, многие вещи из последних, достаточно вкусных нигде не описаны (будь то callback или цикл for для юнитов). В любом случае, если будут проблемы с cJass - пишите мне в личку, я их если не исправлю, то смогу подсказать, в чем дело и как это обойти.
Удачи в проекте.
ADOLF добавил:
Кстати вот прикольная демка cJass.
Старый 10.03.2015, 16:25
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 20:26.