Перейти к публикации
  • Сейчас на странице   Всего пользователей: 2   (0 пользователей, 2 гостя)

Rooster

Программирование, т. 7

  

536 пользователей проголосовало

У вас нет прав на голосование в этом опросе, или на просмотр результатов опроса. Пожалуйста, войдите или зарегистрируйтесь для голосования в опросе.

Рекомендованные сообщения

продота обучающая


:buba:

ни мало ни много, а много и мало

Поделиться сообщением


Ссылка на сообщение

продота обучающая

ну а где-бы ты еще узнал, что лиону нужно кирасу с тараской собирать

Публикация отключена

Поделиться сообщением


Ссылка на сообщение

Леон это который с Натали Портман?


Shaman.png.0cdd33d48561cd068bb3c5ee78289381.png Anna.jpeg.03c9b49363298ceec256500a5d522f7d.jpeg Nigga.jpg.f807f2556bdbf68452292a9301494591.jpg

 

Поделиться сообщением


Ссылка на сообщение

 

продота обучающая

ну а где-бы ты еще узнал, что лиону нужно кирасу с тараской собирать

 

я обычно дагон 5 аганим и этериал тарил  :fffuuu:


:buba:

ни мало ни много, а много и мало

Поделиться сообщением


Ссылка на сообщение
(изменено)

В php framework Laravel, есть метод cache(), работает он так

 

 

Есть метод cache()

1. cache() - если вызвать его без аргументов, вернется экземпляр CacheManager

2. cache(‘test’) - если вызывать со одним аргументом и это строка, то получим элемент из кеша у которого ключ test, если его нет то вернется null.

3. cache([‘test’ => ‘prodota_naxuy]) - если передать первым аргументом массив, то создаться элемент кеша test, со значением prodota_naxuy

 

JJ0od8XTRHml3hKeeDn9-A.png

 

 

 

 

 

Как это будет выглядеть на языке с статической типизацией?

https://en.wikibooks.org/wiki/Computer_Programming/Function_overloading

 

это раз

 

два, говорить "но ведь разные функции вместо одной" и при этом ифать кол-во и типы аргументов внутри той одной - быть дауном


Изменено пользователем TheDeadSkin

Поделиться сообщением


Ссылка на сообщение

И никого не возмутило поведение функции  :avtorklif:


Shaman.png.0cdd33d48561cd068bb3c5ee78289381.png Anna.jpeg.03c9b49363298ceec256500a5d522f7d.jpeg Nigga.jpg.f807f2556bdbf68452292a9301494591.jpg

 

Поделиться сообщением


Ссылка на сообщение

И никого не возмутило поведение функции  :avtorklif:

ну три разных функционала в одной функции которые ещё и определяются типом/кол-вом аргументов это просто эталон говнокода и застрелите_меня когда ты его читаешь

 

а, ну и название тоже норм, мне нравилось

особенно та часть где ты в функцию cache передаёшь строку и она Get-ит тебе что-то из кеша

только обсуждали названия функций называется

Поделиться сообщением


Ссылка на сообщение
(изменено)

 

 

 

нихуя не понял, нихуя не знаю нормальных яп  :trollface: 

То есть вместо одной функции придется делать 3?

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

 

Я юзаю один метод, под капотом он юзает несколько. Вообще как по мне это ахуенная вещь в динамических языках, иметь возможность в один метод передать разного типа аргументы

 

частично поэтому динамические языки такие медленные, зато погромисту охуенно чо

 

 

найс сказки

 

 

https://en.wikibooks...ion_overloading

 

это раз

 

два, говорить "но ведь разные функции вместо одной" и при этом ифать кол-во и типы аргументов внутри той одной - быть дауном

 

Нахуй мне эти ссылки? Я спросил про реализацию, все написали какую-то хуйню, и только один нормальный чувак Диман показал пример 

 

 

ну три разных функционала в одной функции которые ещё и определяются типом/кол-вом аргументов это просто эталон говнокода и застрелите_меня когда ты его читаешь

 

 

Ничто не мешает юзать Cache::get(), Cache::put и тд , но есть хелпер cache который можно юзать

 

 

а, ну и название тоже норм, мне нравилось

особенно та часть где ты в функцию cache передаёшь строку и она Get-ит тебе что-то из кеша

только обсуждали названия функций называется

 

:lol:  :lol:  :lol: 

ой бля,  и как бы ты назвал такую функцию? Только давай без хуйни типа "Да это вообще говнокод и так не кто не пишит" и бла бла бла, просто как бы ты назвал?


Изменено пользователем fessnik

Поделиться сообщением


Ссылка на сообщение
(изменено)

CacheManager cache()
{
    return app(abstract:'cache');
}

TValue cache<TValue, T???>(string key)
{
    return cache<TValue, T???>(key, null);
}

TValue cache<TValue, T???>(string key, T??? val)
{
    return (TValue)cache()->get(key, val);
}

???? cache<TValue>(KeyValuePair<string, TValue> pair)
{
    return cache()->put(pair.key, reset(pair.key), pair.value);
}
единственное что не знаю это какой тип возврата функции put из кешменеджера

зачем $arguments[1] ?? null и какого типа второй аргумент в такой случае, он не документирован в том что ты написал, поэтому T???

 

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

если он содержит только строки например то убери все TValue внутри <> и замени оставшиеся TValue на string

KeyValuePair по желанию может быть Tuple<string, string> или любой форматом который на этапе проверки синтаксиса не даст тебе отправить меньше 2 элементов, что убирает нужду в выбросе исключений

 

другой вопрос что конкретно эта реализация не соберётся в с++/джаве/сшарпе потому что оверлоады заперщают иметь разные возвращаемые типы, и вполне справедлибо ибо это бред

 

нужно вместо этого getCacheManager(), getCacheValue(string), putCacheValue(string key, TValue val)

ой бля,  и как бы ты назвал такую функцию? Только давай без хуйни типа "Да это вообще говнокод и так не кто не пишит" и бла бла бла, просто как бы ты назвал?

три разный функционала = три разных функции

 

да, это говнокод и так никто не пишет

это вырвиглаз реализация и адово читать потом


Изменено пользователем TheDeadSkin
Drakonian понравилось это

Поделиться сообщением


Ссылка на сообщение

 

осторожно шок контент

я предупредил, особенно фронт эндеров

сами напросились

 public BigDecimal(char[] in, int offset, int len, MathContext mc) {
        // protect against huge length.
        if (offset + len > in.length || offset < 0)
            throw new NumberFormatException("Bad offset or len arguments for char[] input.");
        // This is the primary string to BigDecimal constructor; all
        // incoming strings end up here; it uses explicit (inline)
        // parsing for speed and generates at most one intermediate
        // (temporary) object (a char[] array) for non-compact case.

        // Use locals for all fields values until completion
        int prec = 0;                 // record precision value
        int scl = 0;                  // record scale value
        long rs = 0;                  // the compact value in long
        BigInteger rb = null;         // the inflated value in BigInteger
        // use array bounds checking to handle too-long, len == 0,
        // bad offset, etc.
        try {
            // handle the sign
            boolean isneg = false;          // assume positive
            if (in[offset] == '-') {
                isneg = true;               // leading minus means negative
                offset++;
                len--;
            } else if (in[offset] == '+') { // leading + allowed
                offset++;
                len--;
            }

            // should now be at numeric part of the significand
            boolean dot = false;             // true when there is a '.'
            long exp = 0;                    // exponent
            char c;                          // current character
            boolean isCompact = (len <= MAX_COMPACT_DIGITS);
            // integer significand array & idx is the index to it. The array
            // is ONLY used when we can't use a compact representation.
            int idx = 0;
            if (isCompact) {
                // First compact case, we need not to preserve the character
                // and we can just compute the value in place.
                for (; len > 0; offset++, len--) {
                    c = in[offset];
                    if ((c == '0')) { // have zero
                        if (prec == 0)
                            prec = 1;
                        else if (rs != 0) {
                            rs *= 10;
                            ++prec;
                        } // else digit is a redundant leading zero
                        if (dot)
                            ++scl;
                    } else if ((c >= '1' && c <= '9')) { // have digit
                        int digit = c - '0';
                        if (prec != 1 || rs != 0)
                            ++prec; // prec unchanged if preceded by 0s
                        rs = rs * 10 + digit;
                        if (dot)
                            ++scl;
                    } else if (c == '.') {   // have dot
                        // have dot
                        if (dot) // two dots
                            throw new NumberFormatException();
                        dot = true;
                    } else if (Character.isDigit(c)) { // slow path
                        int digit = Character.digit(c, 10);
                        if (digit == 0) {
                            if (prec == 0)
                                prec = 1;
                            else if (rs != 0) {
                                rs *= 10;
                                ++prec;
                            } // else digit is a redundant leading zero
                        } else {
                            if (prec != 1 || rs != 0)
                                ++prec; // prec unchanged if preceded by 0s
                            rs = rs * 10 + digit;
                        }
                        if (dot)
                            ++scl;
                    } else if ((c == 'e') || (c == 'E')) {
                        exp = parseExp(in, offset, len);
                        // Next test is required for backwards compatibility
                        if ((int) exp != exp) // overflow
                            throw new NumberFormatException();
                        break; // [saves a test]
                    } else {
                        throw new NumberFormatException();
                    }
                }
                if (prec == 0) // no digits found
                    throw new NumberFormatException();
                // Adjust scale if exp is not zero.
                if (exp != 0) { // had significant exponent
                    scl = adjustScale(scl, exp);
                }
                rs = isneg ? -rs : rs;
                int mcp = mc.precision;
                int drop = prec - mcp; // prec has range [1, MAX_INT], mcp has range [0, MAX_INT];
                                       // therefore, this subtract cannot overflow
                if (mcp > 0 && drop > 0) {  // do rounding
                    while (drop > 0) {
                        scl = checkScaleNonZero((long) scl - drop);
                        rs = divideAndRound(rs, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
                        prec = longDigitLength(rs);
                        drop = prec - mcp;
                    }
                }
            } else {
                char coeff[] = new char[len];
                for (; len > 0; offset++, len--) {
                    c = in[offset];
                    // have digit
                    if ((c >= '0' && c <= '9') || Character.isDigit(c)) {
                        // First compact case, we need not to preserve the character
                        // and we can just compute the value in place.
                        if (c == '0' || Character.digit(c, 10) == 0) {
                            if (prec == 0) {
                                coeff[idx] = c;
                                prec = 1;
                            } else if (idx != 0) {
                                coeff[idx++] = c;
                                ++prec;
                            } // else c must be a redundant leading zero
                        } else {
                            if (prec != 1 || idx != 0)
                                ++prec; // prec unchanged if preceded by 0s
                            coeff[idx++] = c;
                        }
                        if (dot)
                            ++scl;
                        continue;
                    }
                    // have dot
                    if (c == '.') {
                        // have dot
                        if (dot) // two dots
                            throw new NumberFormatException();
                        dot = true;
                        continue;
                    }
                    // exponent expected
                    if ((c != 'e') && (c != 'E'))
                        throw new NumberFormatException();
                    exp = parseExp(in, offset, len);
                    // Next test is required for backwards compatibility
                    if ((int) exp != exp) // overflow
                        throw new NumberFormatException();
                    break; // [saves a test]
                }
                // here when no characters left
                if (prec == 0) // no digits found
                    throw new NumberFormatException();
                // Adjust scale if exp is not zero.
                if (exp != 0) { // had significant exponent
                    scl = adjustScale(scl, exp);
                }
                // Remove leading zeros from precision (digits count)
                rb = new BigInteger(coeff, isneg ? -1 : 1, prec);
                rs = compactValFor(rb);
                int mcp = mc.precision;
                if (mcp > 0 && (prec > mcp)) {
                    if (rs == INFLATED) {
                        int drop = prec - mcp;
                        while (drop > 0) {
                            scl = checkScaleNonZero((long) scl - drop);
                            rb = divideAndRoundByTenPow(rb, drop, mc.roundingMode.oldMode);
                            rs = compactValFor(rb);
                            if (rs != INFLATED) {
                                prec = longDigitLength(rs);
                                break;
                            }
                            prec = bigDigitLength(rb);
                            drop = prec - mcp;
                        }
                    }
                    if (rs != INFLATED) {
                        int drop = prec - mcp;
                        while (drop > 0) {
                            scl = checkScaleNonZero((long) scl - drop);
                            rs = divideAndRound(rs, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
                            prec = longDigitLength(rs);
                            drop = prec - mcp;
                        }
                        rb = null;
                    }
                }
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            throw new NumberFormatException();
        } catch (NegativeArraySizeException e) {
            throw new NumberFormatException();
        }
        this.scale = scl;
        this.precision = prec;
        this.intCompact = rs;
        this.intVal = rb;
    } 

 

 


 

TheDeadSkin и .felix понравилось это

:buba:

ни мало ни много, а много и мало

Поделиться сообщением


Ссылка на сообщение

 

 

зачем $arguments[1] ?? null и какого типа второй аргумент в такой случае, он не документирован в том что ты написал, поэтому T???
 

Если ты пытаешся получить значение несуществующего элемента, то тебе приезжает null, если тебе нужно дефолтное значение, для несуществующего элемента, ты передаешь во втором аргументе дефолтное значение.   Что за блять "T???", что это ?)

Поделиться сообщением


Ссылка на сообщение

жоска

 

банковский код?

 

p.s. ещё добавить к тому что выше

последняя строка функции в твой реализации не проверяет действительно ли key типа стринг (мб это делается внутри)

Поделиться сообщением


Ссылка на сообщение

// protect against huge length.

Kant и TheDeadSkin понравилось это

Shaman.png.0cdd33d48561cd068bb3c5ee78289381.png Anna.jpeg.03c9b49363298ceec256500a5d522f7d.jpeg Nigga.jpg.f807f2556bdbf68452292a9301494591.jpg

 

Поделиться сообщением


Ссылка на сообщение

 

зачем $arguments[1] ?? null и какого типа второй аргумент в такой случае, он не документирован в том что ты написал, поэтому T???

 

 

Если ты пытаешся получить значение несуществующего элемента, то тебе приезжает null, если тебе нужно дефолтное значение, для несуществующего элемента, ты передаешь во втором аргументе дефолтное значение.   Что за блять "T???", что это ?)

 

T??? - неизвестный мне (не коду, а именно мне) тип

 

в таком случае всё куда проще и те две функции стают

 

TValue cache<TValue>(string key)
{
    return cache<TValue>(key, null);
}

TValue cache<TValue>(string key, TValue defaultVal)
{
    return (TValue)cache()->get(key, defaultVal);
}

Поделиться сообщением


Ссылка на сообщение

 

 

три разный функционала = три разных функции

да, это говнокод и так никто не пишет
это вырвиглаз реализация и адово читать потом


Ну ясно, ты доебался до названия, я попросил "напиши свое название и давай без всех эти блаблабла". :lol:

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

Поделиться сообщением


Ссылка на сообщение

у этой функции _нет_ нормального названия потому что она делает 3 разных действия и как итог требует 3 разных названия

 

GetCacheOrGetValueOrAddValue() пожалуй будет ближе всего к адекватному названию

Kant, Ares., Drakonian и 1 другому понравилось это

Поделиться сообщением


Ссылка на сообщение

 

 

банковский код?

конструктор BigDecimal в джавке  :trollface:  


:buba:

ни мало ни много, а много и мало

Поделиться сообщением


Ссылка на сообщение

 

банковский код?

конструктор BigDecimal в джавке  :trollface:

 

тоесть по сути да

 

хотел глянуть на код decimal в сшарпе

но в итоге

 

        // Constructs a Decimal from a double value.
        //
        [System.Security.SecuritySafeCritical]  // auto-generated
        [ResourceExposure(ResourceScope.None)]
        [MethodImplAttribute(MethodImplOptions.InternalCall)]
        public extern Decimal(double value);
рип

Поделиться сообщением


Ссылка на сообщение

 

банковский код?

конструктор BigDecimal в джавке  :trollface:  

 

:lol:  :lol:  :lol:  :pray:  :shitpalm:  :like:


Shaman.png.0cdd33d48561cd068bb3c5ee78289381.png Anna.jpeg.03c9b49363298ceec256500a5d522f7d.jpeg Nigga.jpg.f807f2556bdbf68452292a9301494591.jpg

 

Поделиться сообщением


Ссылка на сообщение
(изменено)

у этой функции _нет_ нормального названия потому что она делает 3 разных действия и как итог требует 3 разных названия

 

GetCacheOrGetValueOrAddValue() пожалуй будет ближе всего к адекватному названию

Поэтому название cache адекватное для данного хелпера. То что ты предложил полная ж хуйня рили)

 

Кстати хелпер так не умеет, а нативный метод Cache->get()  умеет, если передать строку  вернуть одно значение, а если массив Cache::get(['prodota','google']), то вернет значение всех указаных в массиве элементов и это ахуенно


Изменено пользователем fessnik

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...