Задать вопрос
  • Как лучше сделать экспорт класса, чтобы вызывать его как функцию?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Вам лень писать new? Имхо, это перебор. Не отвалятся у вас руки три лишних символа написать, и это будет куда нагляднее чем непонятные излишние функции.

    Но рас так хочется, то тип для твоей функции таков:
    function exportConstruct<P extends any[], T>(classFromExport: { new (...args: P): T; }): 
    (...args: P) => T {
      return (...args) => new classFromExport(...args);
    }

    Но так ты теряешь например возможность использовать статические методы класса.

    Если можешь использовать Proxy то можно просто сделать класс вызываемым:
    function exportCallable<T extends { new (...args: any[]): any; }>(classFromExport: T) {
      return new Proxy(classFromExport, {
        apply(ctor, _, args) {
          return new ctor(...args);
        }
      }) as T & ((...args: ConstructorParameters<T>) => InstanceType<T>);
    }
    
    const Lol = exportCallable(class Lol extends BaseLol {
      constructor(public name: string) {
        super();
        this.name = name.toUpperCase();
      }
    });
    
    Lol('qwe');


    Либо ты можешь просто добавть статический метод, который будет делать то же самое:
    abstract class Newable {
      static new<P extends any[], T>(this: { new (...args: P): T; }, ...args: P): T { 
        return (new this(...args)) as T
      }
    }
    
    class BaseLol extends Newable {  /* ... */ }
    
    class Lol extends BaseLol {
      constructor(public name: string) {
        super();
        this.name = name.toUpperCase();
      }
    }
    
    Lol.new('qwe');
    Ответ написан
  • Нормально ли вызывать из Сервлета DAO и Service одновременно?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Расскажу из личного опыта:
    Мне всегда хочется, чтобы модель, которая используется в БД, и модель, которая используется в контроллере, были одной и той же моделью.
    Все просто же: пришёл запрос в контроллер - сохрани в бд; нужно что-то из бд - сделай селект и отправь в контроллер.
    Но никогда, ни разу это не было хорошей идеей.

    Начнём с того, что как только появляется хоть какая-то вложенность объектов, никто в здравом уме не будет в контроллере передавать эти объекты, ограничиваясь ссылками на них, в лучшем случае (используя их id); закончим вопросами безопасности и консистентности данных, которые сразу, мимо валидации и какого-то сервиса отправляются в бд.

    Отвечаю на ваш вопрос:
    1. Всегда используйте сервис. Умение сохранять объекты в бд у контроллера противоречит принципу solid
    2. Используйте луковую архитектуру. Доменная модель не должна ничего знать о внешних интеграциях.
    Ответ написан
    1 комментарий
  • Как правильно логировать базу данных?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Определитесь что вы хотите логгировать.
    1. уровень события БД это уже скидывается в системный лог
    2. Изменения схемы, зависит от СУБД и в некоторых настраивается
    3. Изменение данных, просто добавляете пользователя в отдельное поле
    4. Версионность, то же что и в пп3 но версия и измененные столбцы (крайне не советую)
    5. Blame триггер на какие то действия, пишется в отдельную таблицу, тут все зависит от бизнеса

    Что то еще. Опишите что хотите в разрезе бизнеса, только обьясните как тупому. Откуда, кто, зачем и что
    Ответ написан
    4 комментария
  • Как правильно логировать базу данных?

    @Akela_wolf
    Extreme Programmer
    Логировать в БД (в отдельную таблицу) спринг вполне может. Но это, обычно, не очень хорошее решение. В промышленном использовании все-таки лучше логировать в файл, затем logstash -> elastic -> grafana/kibana или аналогичный стек. Можно graylog - решений в общем-то много и смысла нагружать именно реляционную БД логами обычно мало.
    Ответ написан
    1 комментарий
  • Как языки, исполняемые на ВМ, пишут в консоль?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    stdout это просто дескриптор, который открывает консоль.

    Для каждой консольной программы открывается три дескриптора с номерами 0, 1, 2 (stdin, stdout, stderr), куда они могут писать.

    /dev/fd/1
    Нет, fd это просто файловый дескриптор/1
    правильный путь будет /proc/ID_процесса/fd/1
    то есть у каждого процесса stdout свой.

    Ну и еще. Неважно какой язык. Это про архитектуру операционки, а не язык.
    Ответ написан
    5 комментариев
  • Аннотация @Autowired выводит null, хотя написал правильно. Почему?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Spring
    Седой и строгий
    Внедрение происходит только в те компоненты, жизненным циклом которых управляет контейнер. А вы EventsBotApp создали сами оператором new.
    Ответ написан
    1 комментарий
  • Может ли Service иметь репозитории других классов?

    @Akela_wolf
    Extreme Programmer
    Технически вам никто не мешает так делать

    Архитектурно - нужно смотреть по конкретному проекту.
    Ответ написан
    1 комментарий
  • Нормально ли кидать эксепшены в Spring boot web app?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Нормально.
    Ответ написан
    Комментировать
  • Как обратиться в enam по числовому порядку?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Я бы сделал ещё одно поле с геттером:
    public enum DayOfWeek {
        MONDAY(1),
        TUESDAY(2),
        WEDNESDAY(3),
        THURSDAY(4),
        FRIDAY(5),
        SATURDAY(6),
        SUNDAY(7);
    
         @Getter
         private final int number;
    
        DayOfWeek(int number) {
            this.number = number;
        }
    }
    Ответ написан
    Комментировать
  • Глуповатый вопрос - как IntelliJ IDEA будучи написаной на Java может запускаться без JVM?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    У Идеи есть своя джава.
    Она лежит в папке <идея>/jbr
    Ответ написан
    Комментировать
  • Почему не загружается JavaFX controller?

    @MicroKlizma Автор вопроса
    В общем все-таки понял в чем проблема, нужно было добавить этот пакет в файл module-info.java
    А именно, добавить строку
    opens com.app.view to javafx.fxml;
    Ответ написан
    Комментировать
  • Как инвертировать строки в массиве, имплементировав интерфейс Function?

    @Akela_wolf
    Extreme Programmer
    Функциональное программирование - это про применение последовательности функций к аргументам (и про функции высшего порядка). Вообще, если коснулись функционального программирования и списков-массивов, то начинайте смотреть StreamAPI, это вот что ни на есть самая функциональщина в джаве. Вообще в джаве функциональное программирование не так чтобы очень хорошее, если эта тема интересна - идите в Котлин (или Скала, но Скала практически не применяется в промышленном программировании).

    Вашу задачу можно решить, например, вот так:
    import java.util.Arrays;
    
    public class Main {
    
        public static void main(String[] args) {
            Arrays.stream(args).map(Main::reverse).forEach(System.out::println);
        }
    
        private static String reverse(String s) {
            final StringBuilder result = new StringBuilder();
            for (char c : s.toCharArray()) {
                result.insert(0, c);
            }
    
            return result.toString();
        }
    }


    Тут интерфейс используется неявно (в функции map), туда подставлена другая функция - reverse. Если хочется - можно обернуть её в интерфейс.
    Ответ написан
    Комментировать
  • Как исправить hostname для postgres в docker-compose?

    @q2digger
    никого не трогаю, починяю примус
    Ваше приложение должно стучать в postgresqldb , это имя контейнера с базой
    Ответ написан
    6 комментариев
  • Как с консоли считывать поисковый запрос, и выводить результат поиска по Википедии?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Срочно читайте про try-with-resources!

    Ваша задача должна состоять из таких вот методов:
    // Считать запрос
    String request = getRequest();
    
    // Сделать запрос к серверу
    String response = getResponseFromWiki(request);
    
    // Распарсить ответ
    (?) result = parseResponse(response);
    
    // Вывести результат
    showResult(result);

    С запросом к серверу вы, видимо, справились.
    Нужно это все сделать отдельным методом (типа getResponseFromWiki), который будет возвращать полученную строку (или что там у вас вернется)
    Ну и дальше по схеме.
    Ответ написан
  • Как правильно импортировать сторонние классы?

    @Akela_wolf
    Extreme Programmer
    Откройте для себя системы сборки, такие как Maven и Gradle (рекомендую последний). Они позаботятся обо всех зависимостях и правильном размещении их в classpath. Работа над любым более-менее сложным проектом на Java без подобных систем - это одна сплошная непрекращающаяся боль.
    Ответ написан
    4 комментария
  • Зачем нужны интерфейсы для слоев DAO и Service в Java?

    @Akela_wolf
    Extreme Programmer
    Интерфейсы нужны для возможности замены реализации не затрагивая основной код. При использовании интерфейсов основной код ничего не знает об деталях реализации (слабая связанность). Соответственно, реализацию можно вынести в отдельный модуль (изолировать сложность). Если основной код ссылается непосредственно на класс, содержащий реализацию (сильная связанность), то сложность программы возрастает и сопровождение программы усложняется. Поэтому интерфейсы особенно нужны на границах подсистем.

    Если реализация отделена от основного кода, то становится легко подменить её в тестах, например, подсунуть in memory реализацию, вместо БД. См. fake object (не путать с mock). Это еще один важный плюс интерфейсов.

    Возможно, в простых программах интерфейсы не слишком нужны. Но, поскольку вы говорите об учебном примере, то использовать их (приучая сразу к хорошему, правильному стилю) - это правильно.
    Ответ написан
    Комментировать
  • Как убрать стандартные классы li в wp_menu_nav?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Вы не добавляйте, а заменяйте тогда.
    И третий параметр пропишите, чтобы гарантировано ваш фильтр отрабатывал последним
    add_filter("nav_menu_css_class", fn() => ["nav_list"], PHP_INT_MAX);


    PS А вообще с меню можно сотворить всё что угодно с помощью Walker'а (https://awhitepixel.com/blog/wordpress-menu-walker...)
    Ответ написан
    Комментировать
  • Можно ли стать Java Senior разработчиком, если учится полгода-год по 2-3 часа в день?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Чтобы стать сеньором надо лет 8-10 коммерческого опыта.
    Ответ написан
    Комментировать
  • Что писать в резюме чтобы были шансы куда-то попасть без опыта?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Нормально что с первого захода вас нигде не взяли. Таких как вы тысячи, рекруту реально сложно понять - вы вайтишник или реально хотите посвятить этому жизнь и будете перспективным работником, а не свинтите после первой недели в конторе, потому что "тут оказывается работать надо!". Давайте резюме чаще и не стесняйтесь подавать на более "серьезные" позиции по описанию, часто в требованиях много скилов завышают, просто "на всякий случай, чтобы было", указывайте в письме что "это и это пока не умею, но готов учиться". Чаще всего "мелькающих" рано или поздно пристраивают в конторы.
    Ответ написан
    Комментировать
  • Что писать в резюме чтобы были шансы куда-то попасть без опыта?

    @FedorWK
    1) Нужно больше откликаться (еще больше)
    2) Проекты, которые есть - описать повкуснее. Добавить строчку опыта "частная практика", в которой проекты описать подробнее.
    3) Сесть за более сложный проект, довести хотябы до MVP, задеплоить, чтобы рекрутер смог сам "потыкаться". Как вариант - бот для Телеграма чтобы не писать фронтенд. Также описать в опыте работы.
    4) Участвовать в хайринг ивентах для джунов от конкретных компаний.

    Это все не гарантирует трудоустройство, но шансы должно повысить
    Ответ написан
    1 комментарий