Задать вопрос
  • Зачем задавать приватный модификатор доступа для свойств класса?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    У вас очень логичный вопрос на счет сеттера: сеттер полностью уничтожает задумку с инкапсуляцией. Правильно это называется "семантическое нарушение инкапсуляции" — то есть как-бы мы инкапсулировали, но по факту назад открыли прямую запись в свойство напрямую. Все доводы "ну мы можем в сеттере валидировать" не корректны

    Правильным способом будет не использовать сеттеры. Вот моя статья на эту тему:
    https://habr.com/ru/post/469323/

    Более подробно: каждый класс нужно проектирвовать так, чтобы данные внутри были максимально связаны. Например каждый метод работать должен в хорошем случае с максимальным числом полей класса, тогда у него высокий cohesion... В тоже время снаружи наужно работать с максимальн омалым числом метода, тогда будет низкая связанность (coupling). Это пара принципов из GRASP.
    Когда вы делаете сеттеры и геттеры, то у вас данные внутри между собой почти никак не взаимодействут: с геттером работают снаружи, с сеттером работаю снаружи — весь класс нараспашку, а в нем в 100% случаев появляются данные, которые вместе не должны находиться и никак не связаны — анрушена и абстракция и инвариант и много чего еще...

    Про инвариант отдельно: например есть платеж, у него есть значение, с которым платеж инициирвоан (initValue), есть значение холда (holdAmount) и есть значение чарджа на списание (chargeAmount)
    Когда вы работаете с платежом, контролируя ивнариант в самом классе, то ваш каждый метод првоеряет др значения и позволяет перейти к др состоянию... методов будет 2-3, все инкапсулировано и безопасно.

    Например:
    class Payment {
         pub func charge(amount int) void {
              if (this.holdAmount < amount && this.initAmount < amount) {
                   throw new PaymentException('Unavailable charge amount')
              }
    
               if (this.status === PaymentStatus:finish) {
                   throw new PaymentException('Payment already fisnished')
              }
    
              this.chargeAmount = amount
              this.holdAmount -= amount
              this.status = PaymentStatus:finish
         }
    }


    Тут в одном методе полные проверки и класс сам контролирует все состояние внутри, также соблюдается закон Деметры. У даннго кода высокий cohesion (из GRASP), тк внутри идет плотная работа с внутр данными (значит они корректно тут закроекны) и низкий coupling ( с теми данными для данного кейса только один метод работы, все внутри)

    Когда вы раскроете сеттерами и геттерами, то ваше состояние становится непредсказуемо и полагается только на то, что снаружи точно подумали об инварианте (нет)
    Ответ написан
    18 комментариев
  • Зачем задавать приватный модификатор доступа для свойств класса?

    Adamos
    @Adamos
    class VeryOpenOne
    {
    public $property;
    }
    $voo = new VeryOpenOne();
    $name = 'pro' . 'perty';
    $voo->$name = 'Пытаясь отрефакторить тот класс, ' .
      'ты хрен найдешь, что в этой строчке меняется эта переменная. ' .
      'Никакое самое умное IDE не поможет';
    Ответ написан
    1 комментарий
  • Как передать IP адрес сервера в Docker контейнер?

    2ord
    @2ord
    TCP-сервер должен слушать на 0.0.0.0:9002.
    Ответ написан
    Комментировать
  • Как избавиться от ddos на конкретный домен?

    mikes
    @mikes
    самое простое закрыть админку .htaccess и разрешить с конкретного ip который ваш
    Ответ написан
    Комментировать
  • Почему не работает код в firefox?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Потому, что в хроме авторизованы, есть все куки. А в Фоксе – нет.
    И бэк возвращает вместо валидного JSON'а, какое-нибудь «вам надо зарегистрироваться».

    (дичайшее предположение моего хрустального шара, я не при чём)
    Ответ написан
    Комментировать
  • В чем вообще соль задания nullable полей в БД, вместо пустых значений по умолчанию, есть ли в этом какой-то сакральный смысл?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    вместо пустых значений по умолчанию

    Есть у вас поле id с типом int. Что должно быть в качестве пустого значения?
    Есть у вас поле name с типом varchar. Что должно быть в качестве пустого значения?
    NULL как универсальное значение, указывающее что в поле ничего не записано.
    При проектировании БД мы можем поле сделать nullable, а можем просто назначить ему по умолчанию '', 0, '[]', и т.д., по контексту.

    Представим ситуацию, что у нас есть в бд поле-флаг, который указывает что мы хотим получать рассылку новостей с сайта. Если по-умолчанию будет 0, то пользователь отказался. Если 1, то согласился.
    А если NULL, то пользователь ещё не определился с выбором и мы при каждом посещении сайта будем его спрашивать не хочет ли он подписаться на рассылку, пока он не выберет 0 или 1.
    Ответ написан
  • В чем вообще соль задания nullable полей в БД, вместо пустых значений по умолчанию, есть ли в этом какой-то сакральный смысл?

    Adamos
    @Adamos
    NULL - это не пустое поле. Это "поле не заполнено".
    Используется в тех случаях, когда разница между этими состояниями - есть.
    Кроме того, у числовых полей или дат просто нет "пустого" варианта.
    0 и '1970-01-01 0:00:00' - это значения, которые вполне могут иметь смысл.
    Например, при подсчете средних значений или интервалов NULL позволяет исключить ненужные строки.

    Если вам без разницы, заполнил юзер свои поля или нет - значение по умолчанию подходит, использовать NULL просто незачем.
    Ответ написан
    Комментировать
  • Как предусмотреть ошибки в запросах пользователей для поискового продвижения?

    сделайте страницу на сайте с тегами title + description = gymbalnce.ru
    внутри произвольный текст, содержащий gymbalnce.ru пару раз.
    и проверьте, через какое-то время должна страница появиться в поиске

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

    также понятно, что таких страниц можно нашлепать сколько угодно, под разные ошибки.
    если вариантов ошибок мало, то можно попробовать просто в главную страницу добавить в текст (не в теги) слова с ошибкой "gymbalnce.ru" под каким-то соусом, небольшим шрифтом внизу и поисковик вполне может схавать и выдавать вас по таким запросам в топе, так как уровень конкуренции по ним ниже плинтуса.
    Ответ написан
    5 комментариев
  • Как предусмотреть ошибки в запросах пользователей для поискового продвижения?

    gluck59
    @gluck59
    Виртуальный глюк
    Во-1 за вас это сделает поисковик.
    Во-2 отставьте манию величия и проверяйте индексацию по содержимому своего сайта а не по его названию/домену. Примите, что вы никто и зовут вас никак, и специально искать вас не будут.
    Ответ написан
    Комментировать
  • Как предусмотреть ошибки в запросах пользователей для поискового продвижения?

    Sanes
    @Sanes
    За вас это сделает поисковая система.
    Ответ написан
    Комментировать
  • Как спарсить курс доллара сбербанка?

    Ichi
    @Ichi
    Увлекаюсь программированием
    У них даже получение json подзащитой. Тут только через selenium

    Кстати, пока смотрел нашел несколько запросов, которые выдают курс json:
    https://www.sberbank.ru/proxy/services/rates/public/actual?rateType=ERNP-41&isoCodes[]=USD&isoCodes[]=EUR&regionId=038
    https://www.sberbank.ru/proxy/services/rates/public/actual?rateType=ERNP-2&isoCodes[]=USD&isoCodes[]=EUR&regionId=038


    Ещё есть варианты:
    1. Через офф api. Раньше там было через получение токена, но сейчас походу он платный.
    2. Через сторонние сайты, но тут могут быть задержки или неверная информация.
    Ответ написан
    Комментировать
  • Как сохранять и сокращать ОЧЕНЬ большие числа типа int?

    Варианта три:
    1. Использовать double - тогда максимум у тебя будет примерно 1e308 (1 с 308 нулями)
    2. Хранить число в виде двух чисел - значение и степень десятки Точность на больших числах будет низкая, но предела по сути нет - можно будет хранить числа вплоть 2^64*10^(2^64) (если использовать два long). Эту же методику можно и с double реализовать - получится ~10^308*10^(10^308), что ещё больше
    3. Можно попробовать BigInteger - по памяти не эффективно, медленно, но зато точность идеальная.

    Чтобы прямо весь код не переписывать - свое "особое" число ты можешь реализовать как структуру со всеми нужными операторами и операторами приведения типов.

    Вот пример, без реализации операторов

    struct ExponentialInteger
    {   
        private readonly int value;
        private readonly int exp;
        
        //.ctor
        // operator +
        // operator -
        // operator *
        // operator /
        // operator implicit
        // operator explicit
        // IEquatable, IComparable, IFormattable
        // итд
        private static string[] suffix = new[]
        {
            "", "K", "M", "t", "q", "Q", "s", "S", "o", "n", "d", "U", "D", "T", "Qt", "Qd", "Sd", "St", "O", "N", "v", "c"
        };
    
        public override string ToString()
        {
            if (exp >= suffix.Length || exp < 0)
            {
                return $"{value}*10^{exp}";
            }
            else
            {
                return $"{value}{suffix[exp]}";
            }
        }
    }

    Ответ написан
    3 комментария
  • Как снизить нагрузку на API?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Включите логгирование. Выясните - какие запросы чаще всего поступают, какие запросы дольше всего выполняются. Оптимизируйте.
    Следующий этап - создание очереди запросов (возможно потребуется пересмотр имеющейся архитектуры) приложения.
    Ответ написан
    Комментировать
  • Куда сохраняются пакеты go get?

    От переменной GOPATH в Go Modules проекте ничего не зависит, все зависимости сохраняются в так называемый кэш модулей (go envGOMODCACHE). По умолчанию после установки эта переменная смотрит на /Users/user.name/go/pkg/mod.

    Для использования зависимостей вместе проектом рассмотрите vendoring (go mod vendor).
    Ответ написан
    Комментировать
  • Как написать или найти скрипт для мониторинга серверов?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Zabbix.
    Бесплатен. Может мониторить вообще всё, и извещать о проблемах. Может выполнять нужные команды/скрипты на серверах. Слегка монструозен для 1-2-3-х серверов, но тут уж ничего не поделать. Активно разрабатывается и улучшается.
    Ответ написан
    Комментировать
  • Зачем нужны роутеры если можно обходиться без них в express.js?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Просто один из уровней абстракции. Точно так же можно сказать о любой функции/методе и так дойти вниз до машинного кода и транзисторов. Кроме того, роутер может иметь более сложную логику, чем просто отработка запроса по ссылке - например использовать параметры из ссылки.
    Ответ написан
    Комментировать
  • Как работает grpc?

    @deliro
    А что тут понимать-то? Представь, что у тебя есть два сервиса, которые общаются по JSON-RPC over HTTP. Приходит сервис1 к сервису2 и говорит, ну-ка бахни мне метод getSomethingOfSomething с аргументами вот такими. И всё это в виде JSON внутри HTTP body. Сервис2 идёт, смотрит у себя в реестре метод getSomethingOfSomething, вызывает его с аргументами и отдаёт результат. Легко? Легко. Теперь тоже самое, только вместо HTTP там HTTP/2, а вместо JSON — protobuf. То есть, два сервиса договорились, что в первых четырёх байтиках будет лежать, например, int32, в следующих восьми будет лежать float64 ну а там дальше ещё что-то будет лежать.
    Ответ написан
    3 комментария
  • Как правильно определить какой JSON вернулся?

    Успешность обычно проверяют по http-коду ответа.

    Если же сервис сделан так, что код ответа всегда 200, то единственный верный способ будет пытаться анмаршалить оба и смотреть на поля, всё верно.
    Ответ написан
    1 комментарий