• Как в git вывести ВСЕ упоминания файлов?

    halogen
    @halogen
    Java developer
    Не уверен, что git-rev-list может справиться с этой задачей, но можно попытаться скомбинировать его с git-ls-tree:

    git rev-list --all | xargs -I % git ls-tree -r %

    Пример вывода:

    100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391	GOOD
    100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391	BAD
    Ответ написан
    Комментировать
  • Где в JavaFX грамотнее писать метод main?

    halogen
    @halogen
    Java developer
    Плохо использовать пренебрежительные названия, особенно когда дядька даёт дельный совет, ю ноу. Автор на S.O. имеет в виду, что нужно разделять понятия entry point и application. Т.е., должна быть входная точка, а должно быть и приложение. Отдельно. Плюс такого подхода в том, что лучше соблюдается SRP, а также приложение можно использовать в других входных точках "более чисто": будь то Android или GWT (но это зависит от крутости понимания и реализации ООП), или обычные юнит-тесты. Класс Application можно считать фасадом с точки зрения шаблонов проектирования. JavaFx здесь ни при чём.

    ----

    Заметки на полях

    В учебниках стараются писать максимально простой код, чтобы упростить понимание и закрепление материала. Поэтому main(String... args) в таких случаях встречается почти везде.
    Ответ написан
    Комментировать
  • Чем агрегация отличается от композиции?

    halogen
    @halogen
    Java developer
    Не имеет значения, на каком языке сравнивать агрегацию и композицию. Две концепции являются отношением has-a, то есть технически реализуются одинаково: например, класс или отдельный экземпляр класса (если у прототипа объекта нет такого свойства) ссылаются с помощью полей на экземпляры другого класса (хотя и не обязательно другого). Отличие состоит в том, что в случае композиции один класс сильнее зависит от другого явно заданного класса и, по большому счёту, не может без него существовать.

    Вот пара ссылок:

    * sergeyteplyakov.blogspot.com/2012/12/vs-vs.html
    * programmers.stackexchange.com/questions/61376/aggr...

    Также обратите внимание на то, что в случае композиции, класс/объект сам определяет связи и время жизни этих связей -- то есть, полностью владеет им.
    Ответ написан
    Комментировать
  • Множественное наследование не нарушает ООП?

    halogen
    @halogen
    Java developer
    Не нарушает, так как не является составляющей, которая определяет "правила" ООП. Под множественным наследованием, привносящим проблемы, скорее следует понимать наследование классов, то есть, готового поведения и состояния. С наследованием интерфейсов проблемы как таковой на уровне реализации интерфейсов нет, но может в некоторых случаях быть неприятной в JVM-языках, когда реализуемые интерфейсы декларируют методы с одинаковыми именами, но методы семантически разные. Это чисто техническая проблема. В то же время, в среде .NET, насколько я помню, этой проблемы нет. Класс, реализующий несколько интерфейсов -- вполне обычная и хорошо зарекомендовавшая себя практика (например, стандартная библиотека виджетов GWT; "наблюдаемые" коллекции в .NET и пр.)
    Ответ написан
    Комментировать
  • Куда положить общие сорцы для двух модулей в Maven?

    halogen
    @halogen
    Java developer
    Просто создайте третий дочерний модуль, которому укажите groupId и artifactId. Потом просто ссылайтесь с GameServer и GameClient на этот третий модуль через обычный механизм указания зависимостей, как-будто это любая-другая библиотека. Насколько я помню, в родительском модуле My_Game обычного mvn install достаточно.
    Ответ написан
    Комментировать
  • Паттерн MVP используется только в.NET?

    halogen
    @halogen
    Java developer
    Вполне возможно. Используется, например, в Swing (Java) или GWT (Java). События не обязательно должны быть встроены в язык и быть в нём first-class citizen. Например, в GWT обработчик события описывается следующим образом:

    public interface ILoginView {
        String getUsername();
        String getPassword();
    }
    
    public interface ILoginPresenter() {
       void onLogin();
    }
    
    public final class LoginView extends Composite implements ILoginView {
    // ...
        @UiField TextBox username;
        @UiField PasswordTextBox password;
        private final ILoginPresenter loginPresenter = ...;
    // ...
        @Override public String getUsername() { return username.getText(); }
        @Override public String getPassword() { return password.getText(); }
        @UiHandler("login") public void onLoginClick(ClickEvent e) { presenter.onLogin(); }
    // ...
    }


    Аннотация @UiHandler обрабатывается фреймворком. Можно, конечно, и обойтись менее декларативным подходом и регистрировать обработчики вручную через какой-нибудь addXXXListener(), как это делается в Swing.

    View без событий тоже может существовать, когда от пользователя не требуется никакой обратной реакции: например, обычный какой-нибудь ISummaryView, который просто отображает несколько строк текста.
    Ответ написан
    Комментировать