• Пожалуйста оцените мое убогое ООП?

    Stasgar
    @Stasgar
    Обученная макака
    Во-первых: начните изучать архитектурную часть программирования, изучите паттерны проектирования, изучите SOLID, DRY, KISS и остальные модные словечки, постарайтесь всё это осознать, или, на крайняк - зазубрить. Всё придет с опытом, изначально все не понимали зачем всё так сложно, но эта сложность обусловлена неисчислимыми литрами слёз и потраченных нервов, всё не просто так.

    Судя по всему это тестовое или учебное задание. От вас требовалось отоверинжинирить простую задачу. Давайте попробуем:

    Суть задачи - есть файл с определенной структурой хранения данных, структура строковая. Требуется этот файл преобразовать в другую структуру данных и вывести эту структуру в json формате. Задача ясна.

    Разобъем задачу на отдельные независимые этапы:
    1) Преобразование одной структуры данных (текстового файла) в другую (объект, понятный PHP, к примеру)
    2) Преобразование этой структуры данных в Json формат.
    Первый вопрос, который может возникнуть - почему сразу не преобразовать в json? Ответ - при расширении системы в будущем - нам понадобится вывести данные в виде массива, или в виде XML, или даже в виде готового файла Excel. Нам будет сложно дополнять логику изначального класса, ничего при этом не сломав и не затронув уже существующий функционал. Также ответом на этот вопрос может являться каждая буква из SOLID принципов, подробнее отвечу дальше, когда буду пояснять за реализацию, см. ниже

    Теперь рассмотрим эту задачу с точки зрения ООП, начнем думать не от конкретной реализации, а от интерфейса и абстракции (мы не парсим конкретный файл, мы парсим просто файл, мы не переводим его в конкретное представление json, мы переводим его просто в представление):
    Нам понадобится 2 класса - непосредственно класс, читающий файл и преобразующий его в простейший тип данных (например PHP array). Второй класс - преобразователь простейшего типа данных парсера в какой-то определенный тип:
    1. LogFileReaded implements/extends FileReaderContract(интерфейс, возможно абстрактный класс, если понадобится предустановленная логика)

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

    2. JsonPresenter implements/extends DataTypePresenterContract

      Абстракция содержит контракт на метод output(), а в конструкторе принимются исходные данные. В конкретной реализации JsonPresenter в output() будет банальный json_encode() (да, это нормально, нет, класс не лишний и нет, json_encode() нельзя пихать в сам парсер) А теперь к вопросу - почему не следует просто запихать это всё в парсер и вместо массива отдать json: в будущем, когда система будет расширяться - нам понадобится представить данные в виде XML - что тогда будем делать - переписывать весь код парсера ради добавления switch case "json" и т.д.? А если что-то сломается во всей системе? А если вариантов представления станет настолько много, что файл будет просто не читаем? А при данном подходе достаточно будет просто написать новый класс XMLPresenter, или даже ExcelPresenter, который на выводе не строку будет выдавать, а целый файл (опустим типизацию output пока)). Также этот класс можно реализовать в виде декоратора (паттерн), да и много еще как.



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

    К примеру: в итоге, если вас уже повысили, и вы вместо парсинга стали заниматься более высшими материями - новому программисту, чтобы дописать логику преобразования данных в Excel не нужно знать как конкретно вы преобразовывали когда-то эти данные в json, ему не нужно дебажить ваш код, ему достаточно посмотреть на интерфейс - отнаследоваться от него и написать свой собственный метод преобразования и дальше использовать его в нужном месте.

    P.S. В данной реализации опускаются и упрощаются некоторые моменты для понятности
    Ответ написан
    21 комментарий
  • Как построить инфраструктуру большого проекта?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вопрос из серии пальцем в небо.
    Не меряется нагрузка в посетителях. Она меряется в rps и *bit/s. Также нужно знать прожорливость вашего ПО к io+ram+cpu иногда еще и gpu.
    Количество серверов, способы распределения нагрузки, всякие репликации бд, распределения между ДЦ подбираются по конкретный проект.
    Не бывает в природе такого, что вот так хренак и у вас откуда не возьмись 1кк активных юзеров, ну разве что событийные проекты типа прямых трансляций. Именно по этому рекомендую начать с малого, а дальше оптимизировать и распределять нагрузку между серверами там, где это необходимо. Например, у вас фото сток: cdn - это то, что вам потребуется. У вас месенджер - стоит выделить кучку серверов на поддержание сокетов с пользователями + хорошо прработать историю сообщений.
    Ответ написан
    1 комментарий
  • Огромная таблица wp_postmeta как очистить?

    idShura
    @idShura
    Бекап незабудь сделать!

    -- Cleaning wp_commentmeta
    SELECT *
      FROM wp_commentmeta
     WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments);
    
    DELETE FROM wp_commentmeta
     WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments);
    
    SELECT *
      FROM wp_commentmeta
     WHERE meta_key LIKE '%akismet%';
    
    DELETE FROM wp_commentmeta
     WHERE meta_key LIKE '%akismet%';
    
    -- Cleaning wp_postmeta table
    SELECT *
      FROM wp_postmeta pm 
           LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
     WHERE wp.ID IS NULL;
    
    DELETE pm
      FROM wp_postmeta pm 
           LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
     WHERE wp.ID IS NULL;
    Ответ написан
    5 комментариев
  • Откуда разработчики знают как именно что то реализовать?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Разработчики черпают информацию из нескольких основных принципов
    • декомпозиция - разбиение больших частей на составные части. Например: нужно сделать гостевую книгу. В гостевой книге есть страница, которая отображает записи и есть та, через которую они добавляются. Т.е. первый уровень декомпозиции - страница отобразить записи и страница добавить запись. Далее каждая страница бьется дальше. Например отображение - где-то надо записи хранить, значит у нас будет база данных, как-то отображать, значит будет какой-то шаблон для страницы. Раз записи повторяются, то у всех записей будет одинаковый шаблон отображения. Данный принцип применятся до тех пор, пока не достигается конечная глубина, после которой становится очевидна тривиальность реализации. Если представить все эти шаги разбиений в виде дерева - мы получим дерево декомпозиции.
    • системный подход - когда будущее приложение разбивается на подсистемы (это как декомпозиция, но с другой стороны), например подстема отображения записей, подсистема хранения записей и т.д.

    Приведенные выше принципы результат последовательного изучения информатики, программирования и проектирования систем. Каждый разработчик проходит через стадии, на которых он не знает, как реализовать или решить ту или иную проблему, поэтому он всегда находится в непрерывном изучении, как технологий, языков программирования, так и подходов к разработке, и, помимо этого, он изучает предметную область.
    Имея разносторонний набор знаний человек прибегает к синтезу, в результате которого появляется некоторое обобщенное представление решения той или иной задачи. Как правило этот синтез является неопосредованным актом интеллектуальной деятельности (тупо человек не думает особо, а решение всплывает как бы само собой). Хотя на самом деле это результат высшей интеллектуальной деятельности.
    Чтобы перейти от "я не могу это сделать" к "я справился" необходимо изучить опыт других людей, решавших подобные проблемы в прошлом и ознакомиться с тем, что они изучали - какие книги читали, какие науки постигали, курсы или обучение в университете (колледже). Не следует пренебрегать формальным обучением, оно закладывает базу, с котором можно развиваться впоследствии.
    Обучение помогает приобрести некоторый опыт в решении задач и сформировать подходы к их решению.
    После обучения следуют начинать работать по специальности, не перебирать места, а идти в любое место и набираться опыта. Опыт поможет сформировать представление о реальном положении вещей и том, как правильно применять полученные знания на практике. В общем, чем больше вы работаете, тем больше решений прийдется создать и тем более сложные задачи вы сможете решать.
    Не стремитесь сразу браться за сложные задачи, начните с простых, тех, которые как вам кажется, вы сможете решить. И работайте.
    Все приходит постепенно. Просто нужно движение. Учитесь, пробуйте применять изученное. И так по кругу. А потом сами не заметите, как спрогрессируете.
    Ответ написан
    Комментировать
  • Откуда разработчики знают как именно что то реализовать?

    Ваша проблема в том, что вы слишком сильно задаетесь сложными вопросами. Примерно как пытаться понять, почему машина двигается "влоб".

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

    Когда вам нужно сверстать страницу, вы что-то там себе пишете. Вот все, страница готова. Далее вам говорят. А сделайте регистрацию. Первое что вы делаете - лезете в гугл с запросом "как написать регистрацию на php". Вы видите кучу каши о каких-то запросах, базах, каких-то защитах, шифрованиях и тд. Все вместе прямо сейчас вам не понятно. Но разобравшись поэтапно в каждом из них вы уже можете написать простую регистрацию. Потом ваш сайт поломали к чертям, потому что при написании регистрации вы вообще не думали о безопасности. Вам дали по шапке и вот теперь новый опыт, в след раз все вещи вы будете стараться защитить.

    Уже имея опыт работы с базой (так как вы писали модуль регистрации), вы, формально, можете поковыряться и сделать возможность добавлять в базу новости на сайт, а потом их выводить на этом же сайте. И внезапно, вы уже понимаете как реализовать кривой-косой блог.

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

    P.S. Как говорилось людьми выше, есть такой инструмент как "поиск гугл", на худой конец "товаращи по цеху" помогут.
    Ответ написан
    Комментировать
  • Как сделать, чтобы для отдельной категории пользователя сайта отображалась своя главная страница?

    @id_baton4eg
    думаю никаким, но у вп есть хук который позволяет изменить адрес страницы template_include
    https://wp-kama.ru/id_5177/3-sposoba-sozdat-shablo...
    add_filter('template_include', 'my_template');
    function my_template( $template ) {
    	if( is_page('portfolio') && current_user_can('member') ){
    		if ( $new_template = locate_template( array( 'page-portfolio.php' ) ) )
    			return $new_template ;
    	}
    	return $template;
    }
    Ответ написан
    2 комментария
  • Как себя ведёт Wordpress при большом количестве людей?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Как себя ведёт Wordpress при большом количестве людей?

    Увеличивает нагрузку на сервер пропорционально кол-ву людей

    Говорят, что при одновременном присутствии от 6000 человек начинаются проблемы.

    зависит от сервера, от проекта, от кривых рук разработчика, могут начаться на 12
    Любая cms - прожорлива. Это плата за простоту разработки и универсальность.

    Если это так, то куда переезжать?

    В зависимости от ситуации или на более мощный сервер. Или в руки более адекватного разработчика. Или на framework.

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

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Как уже правильно было сказано должно быть:
    • таблица с постами
    • таблица с оценками
    • таблица с рейтингом

    Прим. Не обязательно таблица, не обязательно база реляционная - для задачи это не играет никакой роли

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

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

    Для того чтобы сделать все красиво существуют Message Brokers (RabbitMQ, Kafka, ... да какой угодно в принципе - выбор зависит от требований к системе).
    Архитектура такая:
    1. пользователь оставляет оценку к посту
    2. оценка сохраняется в базе оценок
    3. после сохранения в брокера падает сообщение "у поста 12345 новая оценка" (сама оценка для этого кейса не важна, но ее можно тоже указать)
    4. клиент счастливо идет дальше серфить интернеты, не ожидая обработки всякой логики, которую задумал программист
    5. на той стороне брокера сидит маленький демон и слушает эти события
    6. при появлении события демон моментально пересчитывает рейтинг поста и обновляет его в отдельной таблице
    7. при росте нагрузки на демона ничего страшного не происходит - все сообщения встают в очередь и ждут обработки
    8. ну, если хочется совсем все быстро обрабатывать - запускаем ХХХ этих демонов чтобы пережевывали за раз больше информации


    Вот так. Надеюсь вам поможет такой маленький пример их мира энтерпрайз-разработки
    Ответ написан
    4 комментария
  • Как правильно хранить оценки для постов, но быстро сортировать посты по средней оценке?

    x67
    @x67
    Когда речь идет о рейтинге фильма, а не об необходимом уровне погружения графитовых стержней в ядро реактора, можно пренебречь точность и актуальностью. Средний рейтинг хранить вместе с фильмом и пересчитывать его время от времени. Это будет самым быстрым решением аак с точки зрения записи, так и чтения.
    Ответ написан
  • Что должен из HTML (4 + 5) знать профессионал Front-End-а?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Хахаха! Если вы хотите связать свою жизнь с ИТ, то готовьтесь к тому, что нужно будет в месяц по 500-1000 страниц техдокументации осваивать.
    Ответ написан
    7 комментариев
  • Чем бесплатные движки (PhpBB) хуже платных?

    Moskus
    @Moskus
    Разница в том, что при использовании коммерческих продуктов вы верите в поддержку разработчиков, а при использовании opensource - в самостоятельную поддержку, своими силами, или в поддержку какой-то сторонней компании, которая специализируется на коммерческих услугах пользователям opensource. Это - фундаментальная разница.
    При этом, в общем случае, нет оснований считать, что коммерческая поддержка автоматически означает качество - криворукие программисты и админы есть и на зарплате у крупных фирм.
    Остальное вообще никак прямо не связано с тем, является ли продукт коммерческим.
    Ответ написан
    3 комментария
  • Где именно в MySQL в wordpress вордпресс можно редактировать путь к медиофайлам?

    maksym1991
    @maksym1991
    WordPress adept
    У меня на чистой установке WordPress нету раздела с путями загрузки файлов
    5b7421f6e713d195331781.jpeg
    В базе данных храниться только часть пути, опция upload_path(по умолчанию пуста). А полный путь формирует php, файл \wp-includes\functions.php
    Также если задана константа UPLOADS, путь будет браться из определенного в этой константе значения
    Вот вырезка из описания функции wp_upload_dir()
    /**
     * Get an array containing the current upload directory's path and url.
     *
     * Checks the 'upload_path' option, which should be from the web root folder,
     * and if it isn't empty it will be used. If it is empty, then the path will be
     * 'WP_CONTENT_DIR/uploads'. If the 'UPLOADS' constant is defined, then it will
     * override the 'upload_path' option and 'WP_CONTENT_DIR/uploads' path.
     *
    */
    Ответ написан
    1 комментарий
  • Bullshit Web - чрезмерное загромождение сайтов десятками скриптов и модулей. Можно ли решить эту проблему?

    snap44
    @snap44
    Фыр!
    5b66f6989b4fa204912050.png
    И так работает большинство "верстальщиков". Зато заказчик 2-3тыщи сэкономил на вёрстке.
    Ответ написан
    Комментировать
  • Что нужно уметь, чтобы я справедливо мог вписать git в резюме?

    rebase, в какой момент его лучше делать при мерже в мастер?
    можно ли в мастер делать push --force ?
    Интерактивный rebase зачем он нужен?
    Reset когда и какой?
    https://git-scm.com/book/ru/v2
    Ответ написан
    12 комментариев
  • Почему наши топ веб-студии не считают Wordpress серьезной CMS, а американские топовые студии делают на нем 50% сайтов?

    lukoie
    @lukoie
    Потому что "ваши" топ студии ориентируются на зарабатывание денег. А при этом намного удобней каждый проект с нуля пилить, объясняя это тем что якобы готовые решения это не торт.
    Многие задачи в ВП можно решить в два тыка, тогда как то же самое рисовать на Ларавеле можно часик-другой. Потому естественно "топовой веб студии" чтобы кормить сотрудников, содержать офис и платить налоги(угу), надо делать то, что делается дольше. Вордпресс тут не подходит.
    В американии просто решают задачи, их вот эта возня с рейтами и "зарплатой айтишника" не торкает. И если они знают что задачу можно решить уже готовым фунционалом вордпресса, то им как бы перпендикулярно что кому-то из программистов(обслуживающего персонала, на секундочку!) оно не нравится.
    Ответ написан
    Комментировать
  • Chmod -R 777 / или как я убил систему одной командой?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Убей пингвина, не мучай жывотне. Многие программы просто не запустятся, увидев разрешение по записи для всех. Многие - даже для группы. Sudo точно не запустится, если sudoers будет иметь права, отличные от 0400 (максимум 0600).
    Только бэкап спасет отца русской демократии. И практика в установке новой системы. Не нужно ничего отключать. Нужно читать маны, пробовать, пробовать и пробовать.

    Если долго мучиться - кто-нибудь получится (C) :DD
    Ответ написан
    3 комментария
  • Chmod -R 777 / или как я убил систему одной командой?

    Olek1
    @Olek1
    Наймите сдельно девопса, срочно, чтобы не потерять данные
    Ответ написан
    7 комментариев
  • Актуальна ли ниша PHP на Upwork?

    @Stalinko
    PHP'шник и фрилансер до мозга костей
    Актуальна более чем. Заказов тьма на любой уровень и кошелек. Отклики зависят только от ваших способностей и раскрученности профиля. Если с этим всё в порядке, то работы больше чем вы сможете сделать )
    Индусов много, но они не конкуренты, когда заказчик ищет профессионала.
    Ответ написан
    Комментировать
  • Актуальна ли ниша PHP на Upwork?

    opium
    @opium
    Просто люблю качественно работать
    Что вам мешает просто зайти и посмотреть, там же все открыто
    Ответ написан
    Комментировать