Задать вопрос
  • В чем разница между 'фабричным методом' и 'простой фабрикой'?

    @rundle
    Привет.

    Пример с сайта неудачный. Он не показывает выразительность фабричного метода в отличие от фабрики. Я изменил пример ниже.

    Простая фабрика не является паттерном проектирования, это скорее идиома программирования. Простая фабрика предоставляет интерфейс для создания одного продукта. Отличие фабричного метода в создании набора классов, создающих экземпляры - конкретные классы расширяют класс с фабричным методом.

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

    Например, мы открыли в Москве и Питере магазин по продаже телефонов и в классе BeelineStore есть общие методы для всех телефонов (код на java схематичный). Samsung стал поддерживать 5G интернет, поэтому сделаем тариф для этих телефонов дороже.

    spoiler
    abstract class IMobile {
    	void prepare() {
    		System.out.println("Подготовим документы по продаже от ООО Билайн");
    	}
    	void setInternetTariff() {
    		System.out.println("Установим стандартный тариф Билайна для интернета");
    	}
    	void box() {
    		System.out.println("Упакуем в желтый пакетик");
    	}
    }
    
    class BeelineSamsung extends IMobile {
    	void setInternetTariff() {
    		System.out.println("Установим отдельный тариф для 5G интернета");
    	}
    }
    
    class BeelineIPhone extends IMobile {}
    
    class BeelineStore {
    	public IMobile orderPhone(String type) {
    		IMobile phone = null;
    
    		if (type.equals("samsung")) {
    			phone = new BeelineSamsung();
    		} else if (type.equals("iphone")) {
    			phone = new BeelineIPhone();
    		}
    
    		phone.prepare();
    		phone.setInternetTariff(); 
    		phone.box();
    
    		return phone;
    	}
    }
    
    // использование
    // var mobileStore = new BeelineStore();
    // mobileStore.orderPhone("samsung"); <- клиентский код

    Однако при изменении, удалении или добавлении новых видов телефонов мы бы открывали наш класс BeelineStore и расширяли новыми конкретными типами. А если мы добавим модели телефонов, то дерево условий станет сложнее. Если одни аспекты системы изменяются, а другие остаются неизменными — пора заняться инкапсуляцией.

    spoiler
    class MobileFactory {
    	public IMobile getMobile(String type) {
    		if (type.equals("samsung")) {
    			return new BeelineSamsung();
    		} else if (type.equals("iphone")) {
    			return new BeelineIPhone();
    		}
    
    		return null;
    	}
    }
    
    class BeelineStore {
    	MobileFactory factory;
    
    	public BeelineStore(MobileFactory factory) {
    		this.factory = factory;
    	}
    
    	public IMobile orderPhone(String type) {
    		IMobile phone;
    
    		phone = factory.getMobile(type);
    
    		phone.prepare(); 
    		phone.setInternetTariff();
    		phone.box();
    
    		return phone;
    	}
    }
    // использование 
    // var mobileFactory = new MobileFactory();
    // mobileStore = new BeelineStore(mobileFactory);
    // mobileStore.orderPhone("samsung"); <- замечу, клиентский код не изменился

    Окей - мы вынесли процесс создания телефонов - это и есть фабрика. И тут мы расширяемся, дела в нашей компании пошли хорошо и мы открываем филиалы на Урале. Тарифы на Урале будут дешевле, как стандартные, так и для 5G интернета. А также в Москве и Питере запускается программа по обмену старых телефонов на новые. И тут нам помогает фабричный метод.

    spoiler
    abstract class BeelineStore { // класс становится абстрактным
    	protected abstract IMobile getMobile(String type); // возвращается метод getMobile
    
    	public IMobile orderPhone(String type) {
    		IMobile phone = getMobile(type);
    
    		phone.prepare(); 
    		phone.setInternetTariff();
    		phone.box(); 
    
    		return phone;
    	}
    }
    
    class CenterBeelineSamsung extends IMobile {
    	void setInternetTariff() {
    		System.out.println("Отдельный тариф для 5G интернета в центре России");
    	}
    }
    
    class CenterBeelineIPhone extends IMobile {}
    
    class СenterBeelineStore extends BeelineStore {
    	public IMobile getMobile(String type) {
    		if (type.equals("samsung")) {
    			return new CenterBeelineSamsung();
    		} else if (type.equals("iphone")) {
    			return new CenterBeelineIPhone();
    		}
    
    		return null;
    	}
    	
    	public void tradeIn(String phone) {
    		System.out.println("Вы обменяли старый телефон на новый с доплатой");
    	}
    }
    
    class UralBeelineSamsung extends IMobile {
    	void setInternetTariff() {
    		System.out.println("Отдельный тариф для 5G интернета на Урале");
    	}
    }
    
    class UralBeelineIPhone extends IMobile {
    	void setInternetTariff() {
    		System.out.println("Отдельный тариф для стандартного интернета на Урале");
    	}
    }
    
    class UralBeelineStore extends BeelineStore {
    	public IMobile getMobile(String type) {
    		if (type.equals("samsung")) {
    			return new UralBeelineSamsung();
    		} else if (type.equals("iphone")) {
    			return new UralBeelineIPhone();
    		}
    
    		return null;
    	}
    }
    // использование
    // var centerBeelineStore = new СenterBeelineStore();
    // centerBeelineStore.orderPhone("samsung");
    // var uralBeelineStore = new UralBeelineStore();
    // uralBeelineStore.orderPhone("samsung");

    Мы смогли сохранить единые для всех магазинов стандарты оформления заказа, а также добавили региональные отличия.
    То есть фабричный метод гораздо гибче. Простая Фабрика обладает узкой специализацией, а фабричный метод ведет к созданию инфраструктуры, в которой реализация выбирается субклассами.
    Простая Фабрика инкапсулирует создание объектов, но она лишена гибкости фабричного метода в изменении создаваемых продуктов.
    Ответ написан
    Комментировать
  • Как изучать node js в 2019м?

    Начните сначала с клиентского JS и пускай learn.javascript.ru будет вашей библией на это время.

    Изучать нужно также, как и любое другое ремесло — практика и теория, при этом практика в случае с программированием должна преобладать.

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

    Не пытайтесь найти универсальный ответ в данном вопросе.
    Ответ написан
    Комментировать
  • Как хранятся числа в памяти?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    struct Data {
      short id;
      double val;
    };


    я понимаю что 32 00 11 49 - это интовское значение

    в этой структуре short int, 2 байта. 0x32 0x00 -- это оно (0x32 + 256 * 0x00 = 50), little endian.
    0x11 0x49 -- это мусор. 0x02 0x56 0x00 0x00 идущие дальше -- это тоже мусор.
    0x33 0x33 0x33 0x33 0x33 0x33 0xf3 0x3f -- это double (0x3ff -- порядок, 0x3333333333333 -- мантисса, значение = 0x1.3333333333333 * 2 ^ (0x3ff - 1023) = 1.19999999999999995559), little endian, ieee754.

    Как в данном выводе понять где выравнивание происходит?

    Можно воспользоваться макросом offsetof.
    Ответ написан
    5 комментариев
  • Фотошоп в ubuntu?

    Каким боком фотошоп к фронт разработке? И каким образом авокод сравнивают с фотошопом если они выполняют разные задачи?
    Вы рисовать хотите и называете это фронт разработкой?
    Дизайнер может в Adobe XD выслать вам ссылку на макет, которая открывается в браузере, и вы получите кликабельный макет и все ассеты (картинки, стили, размеры) и воровать его не нужно, просто качай
    https://zeplin.io/ https://avocode.com/ отвязывают вас от инструментов дизайнера, они рисуют в чем удобно, а вам высылают ассеты
    В https://www.figma.com/ и рисовать можно и делиться ассетами, но лучше експортировать их в зеплин
    Ответ написан
    4 комментария
  • Как быстро засыпать чтобы было больше времени на изучение программирования?

    Zoominger
    @Zoominger
    System Integrator
    Б-же, до чего же у вас много свободного времени.

    Покупаете две гантели киллограмм по 10 и размахиваете ими часа за два до сна. Потом отжимаетесь. Потом приседаете. Потом повторяете всё сначала, пока сердце из ушей не полезет. "Хватит" - это когда насквозь промокли труханы, футболка, а на трениках разлилось большое потное пятно.

    После этого будете засыпать за 5 минут. Повторять через день. Проверено, работает. Проблемы с засыпанием возникают из-за малоподвижного образа жизни. Спорим, у вас жирок?

    Альтернатива - литр пива за 1,5 часа до сна или две плюшки [ЗАБЛОКИРОВАНО РКН] за час до сна.

    И кста, "больше времени на изучение" никогда не равно "будет эффективнее".
    Ответ написан
    4 комментария
  • Как управлять серверами linux с одного сервера?

    planc
    @planc
    ansible
    Ответ написан
    Комментировать
  • Как правильно (!) примонтировать папку «www» в FTP-папку пользователя?

    @harabudjasim
    Самый простой способ это добавить mount /var/www /home/gavrila/ftp/sites в автостарт системы. Но это небезопасно и подходит только для поиграться.
    Насколько я помню, для администрирования сайта делают отдельного пользователя для каждого сайта и этому пользователю выставляют папку с сайтом как home каталог. тогда при логине по FTP система автоматически перейдет в папку с сайтом. vsFTPd умеет брать конфиги пользователей не из системы, значит можно не засорять систему лишними пользователями. Почитай про добавление пользователей в vsFTPd. Основной посыл это заставить ftp сервер chroot`нуть тебя в папку с сайтом при логине.
    Ответ написан
    Комментировать
  • Как вставить php код в json?

    @Kostik_1993
    Web Developer
    Вопрос тупее некуда. Зачем вам php в json? Чего вы хотите этим добиться? Вы хотите вывести сам код? Или его результат? Причём тут Laravel? Вы делаете это в шаблоне?
    Ответ написан
    Комментировать
  • Какую литературу посоветуете по тестированию?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    TDD Кента Бека - помогает понять, откуда взялась популярная архитектура фреймворков тестирования (ссылка) - читала, мне частично помогла.
    xUnit test patterns - не читала, но все советуют - тоже объясняет принципы написания тестов без четкой привязки к технологии (ссылка).
    По разнице в подходах тестирования - существует пирамида тестирования, но на практике мне не всегда понятно, где границы - приемочные и UI тесты ориентированы на use cases - т.е. на путь - в какой последовательности юзер проходит фичу и какой результат ожидает на каждом шаге (заходит на страницу, заполняет данные, ждет ответа; программа-клиент получает токен, шлет запрос, ждет респонс), а модульные тесты ориентированы на проверку кода как изолированных элементов - т.е. тестирование происходит отдельно от общего процесса, в котором этот код используется, чтобы можно было локализовать проблему с максимальной точностью.
    PHPUnit я изучала только по документации, просто прошлась по всем примерам, считаю приемлемым вариантом изучения. Лучше сначала хорошо понять PHPUnit, а потом учить Codeception. Учиться, как мокать и стабать, можно уже на конкретных задачах, по мере надобности.
    Ответ написан
    1 комментарий
  • Проблемы с челкой на Android?

    RomReed
    @RomReed
    JavaScript, Flutter, ReactNative, Redux, Firebase
    Если бы это был iphone то я бы посоветовал вам но это какой то китай скорее всего. По это вам придется его определить и для него написать самому стили которые вас устроят.
    Ответ написан
    8 комментариев
  • Как правильно выстроить разработку и деплой сайта?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Разработка и контроль версий

    Читаем про git flow, восхищаемся и интегрируем.
    Читаем PSR-ы, восхищаемся и интегрируем. Не помешает: Попросили проверить код, на что смотреть нужно?
    Читаем про vagrant. На базе вот этого вот строим dev окружение. Можете поиграть с https://puphpet.com/. До docker все же стоит дорасти.
    Постигаем Phpstorm, и радуемся жизни.
    Можете посмотреть так же: https://github.com/index0h/php-conventions

    Тестирование

    Читаем про phpunit, восхищаемся и интегрируем.

    Документирование

    Рекомендую взять за правило: документирование алгоритмов нужно только в крайнем случае, когда используются некие хаки. Говнокод лучше переписать на что-то очевидное, чем объяснять, какая муха вас укусила и где.
    Что касается docblock-ов для помощи ide - это отличная идея.

    Деплой

    Самый простой и надежный способ: root у вашего nginx/apache указывать как ссылку на каталог текущей прод версии. При релизе - заливать код с помощью rsync в новый каталог, а далее менять ссылку на новый релиз.
    Например у вас каталог с версиями кода:
    production -> v1.0.2 - текущая версия
    v1.0.1 - старый релиз
    v1.0.2 - текущая версия
    v1.0.3 - новый релиз
    Когда подготовка завершена - вы только меняете симлинк production на v1.0.3. Если что не так - можно быстро откатиться на предыдущую версию.
    Ответ написан
    11 комментариев
  • Сущесвует ли переводчик текста/Статьей/новостей с помощью ИИ?

    sim3x
    @sim3x
    Нет
    Ответ написан
    Комментировать
  • Работает код на чистом js быстрее чем jquery?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    Вопрос сам по себе глупый. Jquery - это и есть js. По сути, это набор функций, упрощающий разработку и сокращающий код. То что будет быстрее зависит от твоего ур-я. jq писали не глупые люди, сможешь ли ты написать лучше? Не думаю. Другое дело, что функции в jq более универсальны, для этого приходится жертвовать скоростью, но разница в скорости выполнения скрипта будет в пару десятков миллисекунд, а вот что касается скорости загрузки, ты можешь сократить код с jquery на 20-30% минимум.
    Ответ написан
    2 комментария
  • На чём писать он лайн билеты?

    @Kirill-Gorelov
    С ума с IT
    Выбери то, что ты хорошо знаешь. Или на крайний случай то в чем ты сможешь легко разобраться.

    Знаешь юи? Делай на нем и не парься.
    Я знаю django, я бы на нем стал делать. Но это не значит, что ты должен все бросить и делать на django или еще на чем.
    Ответ написан
    Комментировать
  • Как вы учились или как вы считаете чему нужно учить Web-разработчика в ВУЗе?

    @oldzas
    1) в вузе мне не хватило gita
    2) обучение меняется каждый год, я учился - а после меня ввели предмет программирование в 1С))
    3) вышка нужна, часто общаюсь с програмерами, которые не могут реализовать ту или иную задачу, хотя теория в вузе давалась. Чего не знают самоучки: теория графов + сети петри + конечные автоматы + трансляторы. В итоге когда они реализовывают те или иные задачи = получается каша ((

    Уровень самоучек - нахвататься всего понемногу, глубины не хватает. Обычно это знание фреймворка, они считают что знание функций и классов - это и есть все программирвоание. Не учитывая что существует теория.
    Ответ написан
    Комментировать
  • Локальный сервер - GIT - удаленный сервер - Платежные системы. Как подружить?

    Fragster
    @Fragster
    помогло? отметь решением!
    https://kassa.yandex.ru/developers/using-api/testing
    ну а настройки хранить в .env файле, который в гитигноре
    Ответ написан
    Комментировать
  • Каковы минимальные требования к "железу" для приложения Tomcat/Pure Servlets/MySQL?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Кот Том отжирает около 20-60 мегов памяти. Мускул - примерно также. (но конечно же есть варианты). Вместо tomcat можно взять Jetty - ест гораздо меньше - мега 2 в минимуме. В принципе, если не делать мемориликов и утечек памяти, то любой хостинг начального уровня на 1 CPU и 512Mb - за глаза, даже с кешированием, гусарами и куртизанками.
    А все остальное: производительность, rps и все остальное - зависит только от вашего приложения, кеширования, архитектуры, работы с базой и данными. Как пример linux.org.ru , сайт с гигантской аудиторией. Вот что они о себе пишут - https://www.linux.org.ru/about (см. Софт и Сервер).
    Ответ написан
    Комментировать
  • Как сделать резервное копирование?

    Zoominger
    @Zoominger
    System Integrator
    tar + cron, классика всех классик.

    Можно rcync + cron.

    Манов полон Гугл.
    Ответ написан
    Комментировать
  • Как перестать говнокодить и принимать неверные архитектурные решения?

    miraage
    @miraage
    Старый прогер
    как писать поддерживаемый код?

    Если уж очень коротко, то соблюдать SOLID/GRASP. Мне понравился твит одного из авторов React Router:
    https://twitter.com/mjackson/status/1171524189850701825

    Most common mistake software developers make: putting stuff in the wrong place. Coupling responsibilities and concepts that should be kept separate.
    For me, this is 95% of software development. Just figuring out *where* things belong.


    Что гуглить, что учить?

    Фундаментальные знания, вроде вышеупомянутых SOLID/GRASP, паттерны (не только классические паттерны, но и вообще, общеизвестные решения определённых задач), базовые структуры данных. Фреймворки/библиотеки всегда будут приходить/уходить, что-то будет забываться. А фундаментальные знания всегда актуальны.

    Может литературу какую почитать посоветуете?

    Скажу за себя. Ни одной из этих известных книжек за свою жизнь не прочитал. Писал много говнокода дома, очень много. Удалял, переписывал. Смотрел код других людей, анализировал, пытался перенять то, что считал правильным.

    Можно ли себя называть миддлом, если твой код говно?

    Не пытайтесь себя оценить. В каждой компании свои понятия миддла. А если кто-то 35 лет на лиспе кодил, а потом прыгнет на Angular - кто он, джун или сеньор?
    И, да, все мы в какой-то степени пишем говнокод. Если кто-то Вам доказывает, что он пишет супер чистый код - не слушайте.

    И ответ на главный вопрос.
    Как перестать говнокодить и принимать неверные архитектурные решения?

    Это невозможно. Все проекты, которые чуток сложнее CRUD-ов, рано или поздно обрастают говнокодом. Никто не пишет идеальный код. Код должен работать и решать проблемы бизнеса.
    Ответ написан
    6 комментариев
  • Есть ли сервисы/программы для прогнозирования следующего числа/диапазона чисел?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    В нейросетях не разбираюсь, на фриланс денег нет.
    Прям как я! :)

    Ничего не поможет узнать следующее число (или спрогнозировать, хотя бы, диапазон).
    Всё зависит от количества генераторов ряда. А их - никак не узнать.

    Смотрите на капли дождя.

    UPD: по-скольку это функция RAND в PHP, то код - открыт.
    Смотрите на типы и общее кол-во всех генераторов и формируйте граф "бинарное дерево", содержащий верхний и нижний диапазоны.
    При попадании в нужный диапазон - "погружайтесь вглубь" по иерархии графа (увеличивайте разрешение точности) и т.д. пока не найдёте точное значение.
    Ответ написан
    4 комментария