Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   GCC - трюки/вопросы (https://javascript.ru/forum/node-js-io-js/46594-gcc-tryuki-voprosy.html)

kobezzza 16.04.2014 12:06

GCC - трюки/вопросы
 
Давайте в этом треде писать вопросы/трюки и т.д. при работе с GCC.

Вопрос:

Как декларировать перегрузку параметров метода при переопределении метода в дочернем объекте.

Решение:

Это конечно хак, но работает:

/** @constructor */
function Foo() {}

/**
 * @param {string} a
 * @param {...?} args
 * @return {string}
 */
Foo.prototype.get = function (a, args) { return ''; }

/**
 * @constructor
 * @extends {Foo}
 */
function Foo2() {}

/**
 * @override
 * @param {number} b
 */
Foo2.prototype.get = function (a, b, e) { return ''; }


Т.е. в родительском классе мы закладываем декларацию о возможном расширении

@param {...?} args


Мб есть более правильный способ?

melky 17.04.2014 20:44

kobezzza, по-моему, всё верно. или я не понял :)

хм. я вижу, что там обновилась статья о JSDOC внутри GCC.

Что думаете насчёт того, чтобы дополнить статьи на сайте?

kobezzza 17.04.2014 20:53

Цитата:

kobezzza, по-моему, всё верно. или я не понял
Ну это скорее хак, чем нормальное решение :)

Цитата:

Что думаете насчёт того, чтобы дополнить статьи на сайте?
Имеешь ввиду здесь на javascript.ru?

melky 17.04.2014 21:04

Цитата:

Сообщение от kobezzza
Имеешь ввиду здесь на javascript.ru?

в учебнике.

там какие-то шаблоны типов; структуры - походу из C принесли в GCC. нипанятна

kobezzza 17.04.2014 22:26

Цитата:

Сообщение от melky (Сообщение 308136)
в учебнике.

Почему бы и нет:)

Цитата:

Сообщение от melky (Сообщение 308136)
там какие-то шаблоны типов; структуры - походу из C принесли в GCC. нипанятна

Скорее из Java - это реализация генериков, но я на практике эти конструкции тоже не юзал.

kobezzza 23.04.2014 21:40

Задал вопрос на трекере GCC:

Overloading parent method

Support of parameter objects

kobezzza 11.12.2014 10:46

Недавно придумал очень классный трюк, который позволяет декларировать конвертацию типов для GCC.

Заведём функцию ковертор:

/**
 * Вернуть заданный объект с указанием произвольного типа
 * (для приведения типа в GCC)
 *
 * @param {?} val - исходное значение
 * @return {?}
 */
function Any(val) {
	return val;
}


Теперь допустим у нас есть функция:

/**
 * @param {(string|!Array)} idOrParams
 */
function get(idOrParams) {
    if (Array.isArray(idOrParams)) {
        return idOrParams.map(...); // Тут GCC начнёт варнить, мол тип может быть строкой и данный код не безопасен
    }
}


Решение номер 1

Сделаем явную конвертацию данных:

/**
 * @param {(string|!Array)} idOrParams
 */
function get(idOrParams) {
    if (Array.isArray(idOrParams)) {
        return [].concat(idOrParams).map(...);
    }
}


Работает, но выглядит как кривой хак (а вот для конвертаций в примитивы можно спокойно юзать Boolean, String и Number).

Решение номер 2

Использование конвертора Any

/**
 * @param {(string|!Array)} idOrParams
 */
function get(idOrParams) {
    if (Array.isArray(idOrParams)) {
        /** @type {!Array} */
        var myArray = Any(idOrParams);
        return myArray .map(...);
    }
}


Функцию Any GCC грохнет при компиляции и никаких оверхедов не будет, данный трюк можно использовать для любой кновертации данных, также можно наплодить на основе Any ряд функций, навроде: isArray и т.д.

__он_самый__ 11.12.2014 22:09

есть ли веские прчины использовать экстримальное сжатие gcc изрщряясь с jsdoc и кодом? сжатие на дополнительных 30 киллобайт вполне компенсируется gzip. или я что то не так говорю? ДАЖЕ СРАНУЮ КАРТИНКУ сожми чуть сильнее, и вот тебе окупилось отсутсивие gcc

melky 11.12.2014 23:16

Цитата:

Сообщение от __он_самый__
есть ли веские прчины использовать экстримальное сжатие gcc изрщряясь с jsdoc и кодом? сжатие на дополнительных 30 киллобайт вполне компенсируется gzip. или я что то не так говорю? ДАЖЕ СРАНУЮ КАРТИНКУ сожми чуть сильнее, и вот тебе окупилось отсутсивие gcc

он вкупе ещё и неплохо меняет форму кода (не просто инлайн функций)

ну а юзать - имхо, UglifyJS2 в руки и нормас. он (углифи) и работает быстрее

kobezzza 12.12.2014 00:47

Цитата:

Сообщение от __он_самый__ (Сообщение 346130)
есть ли веские прчины использовать экстримальное сжатие gcc изрщряясь с jsdoc и кодом? сжатие на дополнительных 30 киллобайт вполне компенсируется gzip. или я что то не так говорю? ДАЖЕ СРАНУЮ КАРТИНКУ сожми чуть сильнее, и вот тебе окупилось отсутсивие gcc

Ну для мне меня это в первую очередь валидатор и оптимизатор (сжатый код в среднем работает на 20% быстрее). В целом GCC дисциплинирует и пропагандирует написание понятного и быстрого кода.


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