• Как читаются переменные в скобках на разных уровнях, и что такое выражение означает?

    @D3lphi
    Этой записью в англоязычной литературе обозначают число сочетаний. Читается, как "число сочетаний из n по l". В русскоязычной литературе чаще встречается обозначение через C:
    a73cf8428fc85510cade14325f0d8a3f460ed0c6
    Ответ написан
    3 комментария
  • Зачем нужны методы возвращающие значение поля класса?

    @D3lphi
    Прочитайте про то, что такое сокрытие.
    Ответ написан
    Комментировать
  • Не могу получить обратную матрицу с помощью эл. преобразований?

    @D3lphi
    Вы что-то вообще не то делаете.
    Для того, чтобы найти обратную матрицу методом эквивалентных преобразований, вам нужно записать саму матрицу, а рядом единичную матрицу той же размерности. Далее, производя эквивалентные преобразования, нужно "обменять" эти матрицы местами. В результате, слева у вас будет находиться единичная матрица, а справа - обратная.
    Сначала методом Гаусса приводим матрицу к ступенчатому виду.
    / X X X  | 1 0 0 \
    | 0 X X  | 0 1 0 |
    \ 0 0 X  | 0 0 1 /

    Затем домножаем каждую строку матрицы на такое число, чтобы диагональ левой матрицы состояла только из единиц.
    / 1 X X  | X X X \
    | 0 1 X  | X X X |
    \ 0 0 1  | X X X /

    Приводим левую матрицу к ступенчатому виду только уже "снизу вверх".
    / 1 0 0  | X X X \
    | 0 1 0  | X X X |
    \ 0 0 1  | X X X /

    Правая матрица теперь является обратной.

    А вообще советую использовать другой метод нахождения обратной матрицы (тот, что с алгебраическими дополнениями), в нем вероятность сделать ошибку меньше.
    Ответ написан
  • В чем разница между JRE и обычной Java?

    @D3lphi
    "Java", которую вы загружаете с главной страницы - это и есть JRE.
    Ответ написан
    Комментировать
  • Приведение типов в Java?

    @D3lphi
    getClass() возвращает объект типа Class<T>, по сути, этот объект представляет тип, который имеет какая либо сущность. Выполняется этот метод в рантайме.
    Проверка типов же осуществляется на этапе компиляции.
    Переменная a имеет тип A, поэтому для того, чтобы работать с этой переменной, как с объектом типа B вам нужно его явно привести к этому типу. Вы не сможете просто так без каста выполнить вызов a.testB() так как для компилятора этот объект имеет тип A (а в нем не существует метода с сигнатурой testB()).

    Тем не менее, с помощью рефлексии вы можете вызвать метод динамически:
    java.lang.reflect.Method method = a.getClass().getMethod("testB");
    method.invoke(a);

    Но в таком случае, вы лишаетесь проверки типов на этапе компиляции.
    Ответ написан
    1 комментарий
  • Чем отличается "--$x" от "$x - 1" в данном контексте?

    @D3lphi
    Как это ничем?
    --$x производит декремент переменной, а затем передает её в качестве аргумента функции.
    $x - 1 передает функции значение, полученное при декременте переменной $x.
    Таким образом, в первом случае изменяется значение самой переменной, во втором - нет. А так как значения выражения вычисляются справа налево (для получения результата выражения необходимо сначала выполнить функцию), то в вашем примере, выделенный жирным $x, $x * fac(--$x) будет иметь значение, уже уменьшенное на единицу.
    Ответ написан
    2 комментария
  • Как правильно организовать разработку с пакетами?

    @D3lphi
    Есть такой плагин для composer'а - wikimedia/composer-merge-plugin. Он позволяет подключать к проекту локальные пакеты.

    Composer.json при этом принимает примерно такой вид:

    {
        "require": {
            "wikimedia/composer-merge-plugin": "dev-master"
        },
        "extra": {
            "merge-plugin": {
                "require": [
                    "submodule/composer.json" // Путь до файла composer.json вашей библиотеки.
                ]
            }
        }
    }


    Теперь вы можете изменять исходный код вашей библиотеки и сразу довольствоваться результатом.
    Ответ написан
    Комментировать
  • Разработка игр, как выбрать язык и движок?

    @D3lphi
    В университете нам давалось много фундаментальных знаний про алгоритмы, операционные системы, машину Тьюринга, алгоритмы Маркова, дискретную математику, ООП, ИИ и много еще чего, что я с успехом пропустил мимо ушей.

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

    сейчас я начал изучать C# и мне пока очень нравится.

    Вам 24, вы закончили университет по специальности ПМИ и теперь приходите в восторг от языка программирования, как школьник. Смешно со стороны.

    Также интересно мнение, насколько важно будет перелопатить университетский курс? В том числе и высшую математику.

    Если вы собираетесь не тупо писать код под движок, а ещё и разбираться в каком-либо графическом API (direct3d, opengl, vulcan и ТД), то тут, как минимум, понадобятся хорошие знания линейной и векторной алгебры. Ибо на низком уровне очень активно используются вектора и матрицы для проведения пространственных преобразований.
    Для написания ИИ так же требуется такой раздел дискретной математики, как конечные автоматы.

    Если вы хотите серьезно углубиться в геймдев, то тут без зная плюсов, увы, никуда.
    Ответ написан
  • Использовать ли наследование?

    @D3lphi
    Наследование применяется, если можно сказать, что что-то является чем-то. Например, разработчик является работником; компьютер является устройством и тд.

    Задайте себе вопрос: "Является ли девайс сокетом?" и сразу все поймете.
    Ответ написан
    Комментировать
  • Система оплаты на сайте?

    @D3lphi
    Дабы пользователь не использовал какой-либо url в корыстных целях, все параметры запроса хэшируются с использованием секретного ключа, который есть только у сервиса оплаты (mysite1.com) и у сервиса-клиента (mysite.com). Когда происходит запрос, хэш вычисляется повторно и сверяется с тем, который пришел в запросе. При попытке всячески изменить значения параметров контрольные сумма будут не совпадать.
    Ответ написан
  • Как определить, принадлежат ли координаты одному из графиков?

    @D3lphi
    Что-то я не пойму, в чем проблема? Подставляете в функцию x,y и проверяете, выполняется ли уравнение, если да - эта координата принадлежит графику функции.

    y = x^2+2x-4
    Точка (3, 11)
    11 = 3^2+2*3-4
    11 = 11
    Точка (3, 11) принадлежит графику функции y = x^2+2x-4.
    Ответ написан
    7 комментариев
  • Хранение аватарок в БД, что скажете?

    @D3lphi
    Никогда так не делайте. Файлы нужно хранить в файловой системе, она с этим справляется лучше, так как предназначена для этого. Файлы в БД не хранят. Складывайте в базу путь к файлу, но не сам файл. Это будет гораздо эффективнее.
    Ответ написан
    Комментировать
  • Как сделать такие шикарные ЧПУ для фильтров в каталоге?

    @D3lphi
    Стесняюсь спросить, чего тут шикарного? То что находится после poe.trade/search/ это просто идентификатор поискового запроса, который где-то у них хранится. При изменений параметров поиска, создается запись, например, в БД в которой и хранятся все эти параметры. Передавать это все в виде GET-запроса не очень, так как очень много разных параметров для фильтрации. При переходе по ссылке из хранилища достается запись с полученным идентификатором из url'а и производится фильтрация.
    Ответ написан
  • Где разместить запросы к стороннему REST?

    @D3lphi
    Есть подозрение что этот подход не верный

    Абсолютно. Не понятно, чем вы руководствовались, когда писали статику, да ещё и в контроллере. Читаем, чтобы впредь не делать такого.

    Выносите логику взаимодействия в классы-сервисы, в чем проблема-то? Разделяем саму логику взаимодействия - это инфраструктурный слой и обработку данных - это бизнес-логика.
    Ответ написан
    2 комментария
  • Есть ли какие-либо недостатки у статических методов?

    @D3lphi
    Значит так, берем толстую тетрадь, ручку и пишем фразу "Статические методы не имеют отношения к ООП" до тех пор, пока не запомним это на всю жизнь.
    Суть объектно ориентированного программирование, как понятно из названия, заключается в том, что должен существовать объект. Статика существует не в контексте объекта, а в контексте класса! Из этого вытекает то, что на протяжении всего жизненного цикла вашего кода будет существовать лишь одно глобальное состояние статических членов класса.

    Использовать статику нужно в случае, если то, что вы ей описываете принадлежит всей группе объектов, а не одному. Например, у класса Human может быть статический метод numberOfLegs(), который возвращает количество ног у людей. Количество ног - это общее свойство для всех людей (Речь идет о здоровых людях). В данном случае можно было использовать константу класса, но это не так важно, ведь, по сути, константа - это тоже статический контекст. А вот имя - это уже свойство каждого отдельного человека. И очень важно чтобы статические методы не изменяли состояние системы в целом, не содержали побочных эффектов.
    В статические методы можно выносить какую либо служебную логику. Например, метод перевода числа из арабской в римскую запись следует сделать статическим.

    Есть ли у статического варианта какие-то подводные камни

    Большое количество. При чем, не таких уж и подводных. Из-за того, что статика глобальна, она плохо поддается тестированию, ее нельзя замокать. Глобальное состояние плохо поддается отладке. Отсутствует возможность подменить реализацию, так как это позволяют сделать объекты.
    Ответ написан
    4 комментария
  • Куда выносить логику выборки?

    @D3lphi
    Вся работа с БД должна производиться в репозиториях.
    Репозиторий работает с сущностями, так что, в случае использования active record ORM, из ar модели нужно будет создавать сущность и возвращать ее из репозитория. Не даем подключению к БД "гулять" по проекту. Entity это обычный popo в котором нет какой-либо логики, а есть лишь набор полей, геттеры, ну и методы для обновления состояния.

    Например:
    class EloquentUserRepository implements UserRepository
    {
        public function findBySomething(string $something): ?UserEntity
        {
              $user = User::where('something', $something)->first();
    
              if ($user !== null) {
                  return new UserEntity($user->id, $user->something);
              }
    
              return null;
        }
    }


    Может в строну доктрина копать?

    Верное решение. Лучше откажитесь от eloquent и возьмите doctrine, если проект требует серьезной ORM.
    Ответ написан
    4 комментария
  • В поле какого типа (mysql) хранить пароль после password_hash?

    @D3lphi
    Измениться может не длина хэша bcrypt, а алгоритм хэширования по-умолчанию (то есть, под PASSWORD_DEFAULT в новых версиях PHP могут подразумеваться алгоритмы, отличный от bcrypt).
    Хэши нужно хранить в blob поле только, если сгенерированный хэш находится в бинарном представление (добиться этого можно, передав в функцию hash() последним параметром значение true). Bcrypt же представлен в символьном виде.

    Итог: для хранения хэшей bcrypt используем поле VARCHAR(60), а лучше - CHAR(60) - так как строка имеет фиксированную длину.
    Ответ написан
    6 комментариев
  • Чем отличаются понятия функции, процедуры и метода в программировании?

    @D3lphi
    Функция - подпрограмма, выполняющая какие-либо операции и возвращающая значение.
    Процедура - подпрограмма, которая только выполняет операции, без возврата значения.
    Метод - это функция или процедура, которая принадлежит классу или экземпляру класса.
    Ответ написан
    5 комментариев
  • Как правильно реализовать систему смены паролей?

    @D3lphi
    1. Генерируемых случайную строку - код восстановления пароля.
    2. Пишем ее в базу вместе с временем генерации.
    3. Высылаем пользователю письмо с ссылкой на специальную страницу, через url передаём код.
    4. При переходе пользователя по ссылке проверяем код на существование, а так же на то, не истёк ли он.
    5. На этой странице пользователь может изменить пароль.
    6. После того, как пользователь изменил пароль, удаляем код.
    Ответ написан