- Повинні існувати кілька видів собак = сіба-іну, мопс, такса, плюшевий лабрадор, гумова такса з пищалкою.
- Собаки повинні вміти видавати звуки (гавкати, пищати) і полювати. При цьому варто пам'ятати, що мопсу полюватиме лінь, деякі іграшки не видають звуків і точно не зможуть полювати.
- Ми можемо написати команду виду "mops sound" та отримати у відповідь "woof! woof!", далі за аналогією. Як реалізується консольний інтерфейс, значення не має.
- Написати тести за допомогою phpunit.
Индексы нужны для ускорения операций поиска, фильтрации и сортировки данных в таблицах. Они позволяют базе данных быстро находить нужные записи, минимизируя количество записей, которые нужно просматривать при выполнении запросов. Индексы аналогичны индексам в книге: они обеспечивают быстрый доступ к нужной информации.
- Структура индекса: Индекс создает отдельную структуру данных, которая содержит упорядоченные значения столбца(ов) из таблицы и ссылки на соответствующие записи. Это позволяет БД быстро определить, где находится нужное значение в индексе, и перейти к соответствующей записи в таблице.
- Ускорение поиска: Когда вы выполняете запросы, включающие условия WHERE, индекс позволяет БД избежать полного сканирования таблицы. Вместо этого она использует индекс, чтобы найти нужные записи быстро и эффективно.
- Ускорение сортировки: Индексы также помогают ускорить операции сортировки. Вместо того чтобы сортировать все записи в таблице, БД может использовать индекс для получения уже отсортированных значений.
- Улучшение уникальности: Индексы могут быть уникальными, что означает, что значения в индексе должны быть уникальными в пределах таблицы. Это обеспечивает целостность данных и предотвращает дублирование записей с определенными значениями.
- Кластерные и некластерные индексы: В зависимости от типа индекса, он может влиять на организацию данных в самой таблице. Кластерные индексы определяют физический порядок строк данных в таблице, а некластерные индексы - это отдельные структуры, которые содержат ссылки на строки.
- Стоимость обновлений: Индексы ускоряют операции чтения данных, но могут замедлить операции добавления, обновления и удаления записей, так как при изменении данных индексы также требуется обновлять.
- Выбор правильных столбцов для индексации: Выбор столбцов для индексации важен. Оптимально индексировать часто используемые в запросах столбцы, а также те, по которым происходит поиск, сортировка и объединение данных.
- Ограничения индексов: Индексы потребляют дополнительное место на диске, поэтому их следует использовать осторожно и с учетом потребностей приложения.
Важно понимать, что неправильное использование индексов может привести к избыточности или плохой производительности запросов. При проектировании и оптимизации баз данных рекомендуется тщательно выбирать, какие столбцы индексировать, и следить за общей структурой данных.
INNER JOIN: Возвращает только те строки, для которых существуют совпадающие значения в обеих таблицах.
SELECT orders.order_id, customers.customer_name FROM orders INNER JOIN customers ON orders.customer_id = customers.customer_id;
LEFT JOIN (или LEFT OUTER JOIN): Возвращает все строки из левой (первой) таблицы и соответствующие строки из правой (второй) таблицы. Если соответствия нет, то для правой таблицы будут возвращены NULL-значения.
SELECT customers.customer_name, orders.order_id FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id;
RIGHT JOIN (или RIGHT OUTER JOIN): Похож на LEFT JOIN, но возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если соответствия нет, то для левой таблицы будут возвращены NULL-значения.
SELECT orders.order_id, customers.customer_name FROM orders RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
FULL JOIN (или FULL OUTER JOIN): Возвращает все строки из обеих таблиц, соответствующие строки объединяются, а несоответствующие заполняются NULL-значениями.
SELECT customers.customer_name, orders.order_id FROM customers FULL JOIN orders ON customers.customer_id = orders.customer_id;
CROSS JOIN: Выполняет декартово произведение всех строк из первой таблицы со всеми строками из второй таблицы. Этот тип JOIN создает комбинаторный результат, и его следует использовать осторожно.
SELECT * FROM customers CROSS JOIN orders;
Dependency Inversion (Инверсия зависимостей) - это один из принципов SOLID, который описывает подход к организации кода и зависимостей между компонентами в программе. Принцип Dependency Inversion обращает внимание на то, как зависимости между классами могут быть организованы для улучшения гибкости, переиспользуемости и тестируемости кода.
Принцип состоит из двух ключевых аспектов:
- Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
В контексте практического программирования это означает, что вместо того чтобы выстраивать зависимости напрямую от низкоуровневых компонентов к высокоуровневым, мы создаем абстракции, через которые эти компоненты взаимодействуют. Это может уменьшить связанность между различными частями системы, делая ее более гибкой и менее подверженной изменениям.
GET-запрос:
- Используется для получения данных с сервера.
- Параметры запроса (например, данные для поиска или фильтрации) обычно передаются через URL в виде строки запроса.
- Ограничение на длину URL в разных браузерах может повлиять на возможность передачи больших объемов данных.
- GET-запросы могут быть закешированы браузером.
- Они могут быть сохранены в истории браузера.
- Они могут быть подвержены атакам CSRF (межсайтовая подделка запроса).
POST-запрос:
- Используется для отправки данных на сервер.
- Параметры запроса передаются в теле запроса, что позволяет передавать большие объемы данных.
- POST-запросы не кэшируются браузером.
- Они не сохраняются в истории браузера.
- POST-запросы более безопасны в контексте атак CSRF, так как они могут быть защищены механизмами вроде токенов.
Когда использовать GET:
- Получение данных с сервера (например, отображение статей на веб-странице).
- Запросы, которые не изменяют состояние сервера.
- Когда параметры запроса можно легко передать через URL.
Когда использовать POST:
- Отправка данных на сервер (например, отправка формы).
- Запросы, которые изменяют состояние сервера (создание, обновление или удаление данных).
- Отправка больших объемов данных.
- Когда безопасность и защита от CSRF атак важны.
В PHP, как и в некоторых других языках программирования, self и static - это два ключевых слова, используемых в контексте классов для работы с методами и свойствами классов. Они имеют некоторые различия в поведении, особенно касающиеся наследования и контекста вызова. Давайте рассмотрим их отличия:
self:
- self используется для обращения к статическим методам и свойствам внутри самого класса, в котором оно определено.
- self ссылается на текущий класс, в котором это ключевое слово используется.
- self не учитывает переопределения методов и свойств в подклассах. Всегда будет обращаться к методам и свойствам, определенным в текущем классе.
class ParentClass { public static $var = 10; public static function printVar() { echo self::$var; } }class ChildClass extends ParentClass { public static $var = 20; }
ChildClass::printVar(); // Выведет: 10
static:
- static также используется для обращения к статическим методам и свойствам, но оно учитывает контекст вызова.
- Если метод или свойство переопределены в подклассе, то static будет ссылаться на класс, в контексте которого был вызван метод, а не на класс, где оно определено.
class ParentClass { public static $var = 10; public static function printVar() { echo static::$var; } }class ChildClass extends ParentClass { public static $var = 20; }
ChildClass::printVar(); // Выведет: 20
В этом примере static учитывает переопределение переменной $var в подклассе ChildClass и ссылается на переменную, определенную в контексте вызова, то есть в подклассе.
В целом, self и static - это ключевые слова, позволяющие работать со статическими методами и свойствами классов. Однако использование static позволяет учитывать контекст вызова и переопределение, делая код более гибким в ситуациях с наследованием.
MVP (Model-View-Presenter) и MVC (Model-View-Controller) - это две различные архитектурные парадигмы, используемые в разработке программного обеспечения для структурирования пользовательского интерфейса и управления данными. Они имеют общие концепции, но с некоторыми отличиями в организации и взаимодействии компонентов.
MVC (Model-View-Controller):
Модель (Model): Это представление данных и бизнес-логики. Модель обрабатывает данные, валидацию и выполнение бизнес-операций. Представление (View): Отображает данные пользователю и обрабатывает пользовательский ввод. Оно отвечает за визуальное представление данных. Контроллер (Controller): Обрабатывает пользовательский ввод, решает, какой функциональности следует вызвать на основе этого ввода, и обновляет модель и представление.
MVP (Model-View-Presenter):
Модель (Model): Аналогично MVC, это слой данных и бизнес-логики. Представление (View): Отвечает за отображение данных и обработку пользовательского ввода, но оно пассивнее по сравнению с представлением в MVC. В MVP представление знает о презентере, но не наоборот. Презентер (Presenter): Презентер обрабатывает пользовательский ввод, обновляет модель и обновляет представление. Он играет активную роль и содержит логику, которая в MVC была разнесена между контроллером и представлением.
Сравнение:
В MVC контроллер обычно отвечает за более широкий спектр обработки пользовательского ввода и бизнес-логики, в то время как в MVP логика больше сосредоточена в презентере. В MVP у представления более ограниченная роль в обработке событий. Оно передает события и запросы на обновление данных презентеру. MVP обычно считается более тестируемой архитектурой, так как логика сосредоточена в презентере, который может быть легко оттестирован в изоляции. Выбор между MVC и MVP зависит от требований проекта, структуры команды и личных предпочтений разработчиков. Оба шаблона позволяют достичь высокой степени разделения забот и поддерживаемости в коде.
В случае === сравнение значений идёт с учётом типа данных.
В языках программирования, которые поддерживают объектно-ориентированную парадигму (такие как Java, PHP, C#), ключевое слово final используется для указания, что определенный элемент (класс, метод или свойство) не может быть изменен или наследован.
Final class (финальный класс):
Когда класс объявлен с ключевым словом final, это означает, что этот класс не может быть расширен (подклассом). Другими словами, нельзя создать подкласс (наследник) от класса, который объявлен как final.
final class MyFinalClass { // Код класса } // Ошибка! Нельзя создать подкласс от MyFinalClass class Subclass extends MyFinalClass { }
Final method (финальный метод):
Когда метод объявлен с ключевым словом final, это означает, что этот метод не может быть переопределен в подклассе. Метод, объявленный как final, должен иметь тот же доступ (public, protected, private), что и метод в родительском классе.
class ParentClass { final public function myFinalMethod() { // Код метода } }class ChildClass extends ParentClass { // Ошибка! Нельзя переопределить метод myFinalMethod public function myFinalMethod() { // Код метода в подклассе } }
Использование ключевого слова final может быть полезным, когда вы хотите зафиксировать определенный класс или метод и предотвратить его изменение или переопределение. Такой подход может помочь обеспечить безопасность и предсказуемость поведения в коде.
LARAVEL. Очень хорошо разбираюсь в UIKIT.
- Умение анализировать сложные задачи и разрабатывать эффективные алгоритмы для их решения.
- Знание HTML, CSS и JavaScript, а также фреймворков и различных библиотек.
- Навыки в создании скриптов и автоматизации задач.
- Знание SQL и опыт работы с различными базами данных (MySQL, MSSQL, Oracle), опыт работы с Eloquent ORM.
- Опыт работы с big data (таблицы с более 1 млн записей).
- Опыт командной работы, использование систем контроля версий (Git).
- Опыт работы c Opencart и Joomla(+Joomshopping) CMS различных версий.
- Опыт работы c заказчиком и исполнителем (полное сопровождение АСУ финансово-экономической деятельности предприятия), высшее образование по специальности "управление проектами".