• Сложная бизнес-логика. Как всё учесть?

    @nirvimel
    GLeBaTi: Если делать с расчет на расширяемость, то в объекте Player (в котором собрано все состояние игрока) должно быть поле класса Tech, который отвечает за состояние прогресса науки. У него должен быть метод типа isTechAvailable, который принимает id (возможно, строковое или enum) технологии и возвращает булево значение (доступна или нет). Только сам корабль "знает" технологию (ее id), необходимую для его создания, поэтому проверка идет в конструкторе конкретного класса корабля. Можно унаследовать все корабли от базового класса и реализовать проверку технологии (в определенном поле) в его конструкторе, тогда в производных классах останется только менять значение этого поля, но это оставляет возможность создания каких-то особенных кораблей, которые будут проверять технологии каким-то нестандартным способом, если переопределять не поле а сам метод проверки.
    СreateNewShipRequest вынимает из клиентского запроса id (или имя) класса корабля и ищет его в специальной таблице (map), где ему сопоставлена ссылка класс, который можно инстанциировать (вызвать для него new). Все классы кораблей реализуют интерфейс Ship, поэтому для СreateNewShipRequest любой корабль выглядит как просто Ship (в реальности же конструкторы у всех разные). Если при вызове конструктора он не нашел соответствующую технологию, то из него выбрасывается исключение, которое пролетает насквозь все уровни, пока не ловится на самом верху и отправляется клиенту в виде строки. Таблицу, в которой именам/id кораблей соответствуют внутренние классы, можно сделать статической и добавлять туда новые корабли вручную, а можно пойти еще дальше и сделать еще более гибкую архитектуру, чтобы при загрузке модулей, каждый класс кораблей сам прописывал себя в таблицу (изначально пустую), тогда новые корабли можно будет добавлять в новых модулях, не меняя ни одной строчки в существующей кодовой базе.
  • Сложная бизнес-логика. Как всё учесть?

    @nirvimel
    GLeBaTi: Не надо переносить в класс Fleet запросы, исполнение, которых затрагивает много разных подсистем. Флот должен заниматься только флотом, он не должен ничего знать об особенностях обработки клиентских запросов, о логгировании, об уровне науки (этими проверками должен занимается тоже отдельный класс); о кораблях флот должен знать самый минимум (остальное спрятать в методы самого корабля, то есть интерфейса Ship, который реализуют разные типы кораблей).

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

    @nirvimel
    GLeBaTi:
    Создать корабль (нельзя если флот телепортируется сейчас)

    Это должно проверяться НЕ в самом запросе (который не должен ничего знать о возможности телепортации и других свойствах флота), а в методе addShip в классе Fleet (который неизбежно вызываться в ходе обработки запроса на создание корабля).
    Если флот не может в этот момент принять корабль (в телепортации), то addShip выбрасывает исключение с текстом, который красноречиво говорит об этом.
    Но сам обработчик запроса СreateNewShipRequest (или как он у вас называется) НЕ ловит это исключение (не нужно перегружать код по мелочам), оно пролетает насквозь к самому центральному роутеру, который разруливает все запросы клиентов и отправляет их на обработку. Тут В ОДНОМ МЕСТЕ перехватываются все исключения (определенного класса, или его наследников), всплывающие сюда со всех нижних уровней, из них достается текст сообщения и заворачивается в response для отправки клиенту (этот текст потом будет отображаться где-то на клиенте).

    Вот залог правильной архитектуры: Добавили телепортацию для флота - это никого не должно волновать, кроме одного единственного класса Fleet, в котором инкапсулирована вся соответствующая логика.
  • CSV в Excel как сделать правильное отображение?

    @nirvimel
    В Excel есть "Формат ячейки" (в контекстном меню). Попробуйте "целочисленный".
  • Сложная бизнес-логика. Как всё учесть?

    @nirvimel
    У вас там вообще ООП используется? 20 типов сущностный хотя бы унаследованы от базового класса?
  • Какой алгоритм применить, что бы передавать что одно лучше другого и в итоге получить таблицу?

    @nirvimel
    То есть дана таблица попарных различий, запись в которой указывает, что первый объект должен располагаться выше второго. Требуется построить общую таблицу, в которой все объекты будут расположены в таком порядке, чтобы правила, заданные в исходной таблице не нарушались.

    Я правильно понял вопрос?
  • Как называется такой метод собирания страницы?

    @nirvimel
    Макс Васильев: Я не говорил, что эта архитектура непригодна для каких-то задач, я только сказал, что у нее довольно мало общего с тем, что называют MVC. Стремление к модульности - это не что-то MVC-специфичное, это вообще аксиома для проектов крупнее hello_world. MVC - это не просто модульность, это - разнесение всей логики по трем четко определенным этажам. Каждый этаж максимально горизонтален, то есть не опирается на другие блоки своего же этажа (кроме наследования классов), промежуточные этажи отсутствуют... (в двух словах все не объяснить, об этом целы книги пишут).

    Свет не сошелся на этом MVC. Разные архитектуры существуют под разные задачи.
    Но если вашу архитектуру рассматривать как MVC, тогда все что угодно можно рассматривать как MVC.
  • Хочу перейти на Linux, какой дистрибутив выбрать?

    @nirvimel
    CorelDraw, Incskape, Photoshop.

    Нет гарантий, что этих тяжеловесов удастся запустить под wine, возможно придется использовать VirtualBox.
  • Как сделать дешёвые прокси?

    @nirvimel
    Cosmos: Навскидку ничего назвать не смогу, последние годы я не занимался активно этой темой.
    Я дал главные вектора для поиска: lowendtalk, lowendstock, дальше смотрите сами. Тут как на aliexpress/ebay можно выхватить вполне годный товар по безумно низкой цене (промо акция, например), но для этого надо читать кучи отзывов (уметь отличать фейковые от реальных), искать, изучать, анализировать, в общем, вариться во всей этой теме, и сформировать у себя чутье на годные варианты, иначе можно обжечься на бесплатном сыре.

    Что касается ramnode, о них читал хорошие отзывы еще много лет назад, тогда они были первыми (из относительно бюджетных), кто полностью перешел на SSD (у большинства до сих пор - гибрид), в те времена они располагались в Голландии, и цены, соответственно, были выше. Взял их 128Мб для себя, когда они (частично) переехали в США и резко снизили цены на бюджетные тарифные планы. Сейчас сижу на них почти год (теперь уже не по работе, а в личных целях). За это время было только две перезагрузки (с их стороны), в остальном, 100% аптайм. Например, обновление debian на сервере пролетает мгновенно, то есть гораздо быстрее, чем на локалхосте, который формально по конфигурации мощнее на порядок (с чем это связано точно не знаю).
  • Как сделать дешёвые прокси?

    @nirvimel
    Cosmos: Я сейчас не занимаюсь активным поиском дешевых VPSок. Но когда занимался этим в 2013-2014 (по работе надо было), то сначала плотно засел на lowendtalk, вычитал все, что было написано до меня и мониторил пару месяцев свежие оферты и скидочные купоны. У меня были удачные закупки, например, 128Mb+1IPv4 за 7.5$ от одного ресейлера Crissic (через год он поднял цены в разы).
    По опыту:
    от 10$-15$ - всегда можно найти хороший, качественный продукт, даже с некоторой поддержкой (хотя официально сервис заявлен ка unmanaged).
    7.5$-10$ - изредка по купонам проскакивают реально хорошие предложения, в остальных случаях 50/50 либо останетесь довольны, либо поймете, что попусту потратили деньги.
    <7.5$ - с вероятностью 90% это будет полный треш, даже если формально что-то как-то работает, то на клиента им наплевать абсолютно, они даже могут не отвечать на тикеты, когда сервер повис наглухо (так и будет висеть до окончания предоплаченного периода).
  • Как называется такой метод собирания страницы?

    @nirvimel
    От этого велосипеда до MVC как пешком до луны. Только V (View) выделен как самостоятельный элемент архитектуры. Все остальное всмятку, никаких отдельных C и M не прослеживается.
  • Как можно оптимизировать изображения без потерь в Java?

    @nirvimel
    Лучше назвать это не "без потерь", а, например, "с автоматическим уровнем качества" (как-то так).
    Объективно JPEG сжатие в принципе не может происходить без потерь. Но некоторый уровень потерь не заметен для 99.9% зрителей, поэтому субъективно такое сжатие происходит как бы "без потерь".
  • Как сделать дешёвые прокси?

    @nirvimel
    Cosmos: Я сейчас пишу через VPN на VPS -> 128MB SVZ -> $15 в год (с купоном refugee15 мне вышло 13.5$), там у меня еще Jabber, почта и мои парсеры крутятся. Но я не гонюсь за рекордными ценами, для мня важны также скорость, широкий канал, удобные условия оплаты (биткоин).
    Но если хочется ценовых рекордов, то вот вам 4.5$ в год (без IPv4).
  • Расскажите пожалуйста, как устроен кэшбек?

    @nirvimel
    Человек настолько любит халяву, что готов платить за нее любые деньги. (С)
  • Какая уголовная ответственность программисту хайпа?

    @nirvimel
    HYIP? А какой там софт используется? Или речь про разработку их сайта?
  • Как объяснить рядовому клиенту, что сайт, сделанный руками, а не на шаблоне, для него будет лучшим выбором?

    @nirvimel
    Только не на велосипеде, а в кузове скотовозки вместе с сотней других пассажиров единиц груза.

    А противоположный вариант предполагает такси, которое доставит вас и ваш багаж точно туда, куда вы назовете, а потом еще и в другие точки, если вам того захочется.
  • Зашел на сайт - пришло письмо как так?

    @nirvimel
    dkrylov: Когда очевидно, без что какого-то конкретного js сайт не взлетает, то этот конкретный js подключается двумя кликами (первый клик на открытие меню) + F5.
  • Зашел на сайт - пришло письмо как так?

    @nirvimel
    dkrylov: Если пользоваться uBlock_Origin или NoScript, то можно не встретиться с этим никогда.