Тест на ООП на платформе HH
Возможно это я не верно понимаю понятие объектно ориентированного программирования, но мне кажется правильный ответ был бы примерно таким:
Класс: Маг.
Возможно это я не верно понимаю понятие объектно ориентированного программирования, но мне кажется правильный ответ был бы примерно таким:
Класс: Маг.
кратко объясняю суть программы:
перед циклом объявляю Regex pattern;
далее в цикле есть несколько кейсов, в каждом кейсе и при каждой новой итерации цикла хочу переназначать сам шаблон регулярки и ставить разные модификаторы (т.е. в кейсах прописывать pattern = new Regex(*индивидуальный шаблон*, *индивидуальные модификации*)).
как это грамотнее сделать? можно ли не создавая под каждый кейс индивидуальную переменную класса Regex под конец кейса удалять объект pattern? или можно без удаления объекта просто каждый раз писать pattern = new Regex(*индивидуальный шаблон*, *индивидуальные модификации*))?
P.S. за шарпы и в целом ООП не особо шарю, до этого писала только на сишке, там работа с памятью (вроде как)погибче, да и препод куда больше инфы давал. может вообще не в том направлении думаю как сделать, если что перенаправьте.
В прошлом месяце прочёл книгу "Объектно-ориентированное программирование с помощью Python". Должен признаться, что у меня была смешанная реакция: с одной стороны, я понимал, что ООП — это важная тема для программиста, а с другой — 500+ страниц, и я опасался, что это будет скучное и нудное чтение про классы, объекты и инкапсуляцию.
Понравилось то, что Первые главы оказались не такими уж и нудными, а сама книга была насыщена практическими задачами, что было для меня настоящей находкой. Я мог не только читать, но и тут же пробовать реализовать идеи на практике. С этих примеров я запилил свой проект - игра, в которой я реализовал классы для персонажей и врагов.
Так же понравился раздел об инкапсуляции. До чтения книги я хоть и знал, но не придавал большого значения тому, как организовывать код. Но теперь я понял, насколько важно скрывать внутренние детали и оставлять только нужные интерфейсы. Это сделало мой код гораздо более понятным и чистым.
В общем, книга очень хорошая для тех кто начинает изучать ООП. Даже со своим немалым опытом я чувствую, что стал лучше понимать, как строить программы, которые будут не только работать, но и легко поддерживаться.
Книгу скачивал тут --> Книжный
Когда говорят про ООП, часто забывают о двух вещах:
- Это не только инкапсуляция, наследование и полиморфизм, но ещё и абстракция
- Инкапсуляция, наследование и полиморфизм не прибиты гвоздями к ООП, особенно инкапсуляция и полиморфизм. Но об этом не сегодня.
Сегодня советую к просмотру видео: Абстракция, уровни абстракции.
ℹ️ Основные моменты:
- Абстракция — отвлечение от несущественных сторон, свойств, связей объекта с целью выделения их существенных, закономерных признаков. Иными словами, мы выделяем существенные свойства для нашей конкретной задачи, и не обращаем на несущественные.
- Абстрация = Интерфейс + Инкапсуляция
- Интерфейс — выделяет существенное
- Инкапсуляция — скрывает несущественное
- Абстрагирование нужно для управления сложностью кода, чтобы всё было надёжно, эффективно, расширяемо и поддерживаемо.
💡 Например, у нас есть квадрат, и для разных задач, нам важны его различные свойства.
- Если нам важно вычислять его площадь и периметр, то мы говорим, что квадрат — это геометрическая фигура (абстрагируемся). Иначе говоря квадрат реализует интерфейс IGeometricShape.
- Если нам важно, чтобы квадрат мог быть сохранён в файл, то мы говорим, что квадрат — сериализуемый, например, в JSON объект, который можно затем можно записать в файл. Иначе говоря квадрат реализует интерфейс ISerializable.
- Аналогично, если нам важно уметь рисовать квадрат на экране, он должен реализовывать интерфейс IDrawable.
- Ну и где-то у нас есть методы, которые работают с абстракциями IGeometricShape, ISerializable и IDrawable. Таким образом методы абстрагированы от конкретных реализаций, что увеличивает переиспользуемость кода.
Ну и немного от себя, абстракция — фундаментальное понятие.
- Без абстракции не будет полиморфизма
- Без полиморфизма не будет Dependency Injection (Внедрение зависимостей)
https://t.me/cherkashindev/167
Автор: Гуськова Ольга
Год: 2018
Количество страниц: 241
Учебное пособие посвящено объектно-ориентированному программированию на языке Java. Рассматриваются основные принципы объектно-ориентированного программирования, средства работы со структурами данных – коллекции и дженерики, принципы объектно-ориентированного дизайна.
В лунном свете, пронизывающем плотные тени древнего леса, стояла жрица по имени Moonwhisper. Её белые одеяния светились, словно отражая мягкий свет луны, а её глаза, глубокие и мудрые, отражали непоколебимую решимость. Ночь была тихой, но в воздухе витали предчувствия предстоящего приключения.
Moonwhisper долго готовилась к этому путешествию. С детства она была обучена искусству магии и древним знаниям своего народа. Но теперь перед ней стояла задача, требующая большего, чем просто магические способности или мудрость стариков. Она отправлялась в поисках Забытой Книги Тайн, древнего манускрипта, который, по легендам, содержал знания, способные изменить мир.
Подземелья, куда она направлялась, были зловещим и опасным местом. Сказания гласили, что они были созданы в древние времена, когда драконы и люди вели войны за господство над землями. Теперь эти подземелья были заброшены, и в их темных коридорах скрывались опасности, которые могли испытать даже самого смелого исследователя.
Но жрица не боялась. Её сердце наполняла цель, которая была для неё важнее собственной жизни. Moonwhisper знала, что путь будет труден. Она могла столкнуться с древними заклятьями, забытыми ловушками и, конечно же, драконами, чье дыхание было способно расплавить камень.
Собрав свои вещи, включая свиток заклинаний, амулет защиты и небольшой мешочек с травами и зельями, Moonwhisper последний раз взглянула на звездное небо. Затем она глубоко вздохнула и шагнула в тьму леса, ведущего к входу в подземелья. Приключение начиналось.
.....
Паттерн Адаптер в Программировании: Простыми Словами
🔌 Что такое Паттерн Адаптер?
Представьте, что у вас есть розетка (один интерфейс) и вилка (другой интерфейс), которые не подходят друг другу. Чтобы они работали вместе, вам нужен переходник. Вот здесь и приходит на помощь паттерн Адаптер! Он позволяет объектам с несовместимыми интерфейсами работать вместе.
🔨 Как он работает?
Адаптер оборачивает один из объектов, позволяя ему "подружиться" с другим интерфейсом. Таким образом, вы можете использовать существующий класс с новым интерфейсом, не изменяя его код.
👩💻 Пример в программировании:
Допустим, у вас есть старая система логирования, которую вы хотите использовать с новым интерфейсом логирования. Вместо переписывания старой системы, вы создаете Адаптер, который позволяет старой системе работать с новым интерфейсом.
🌐 Зачем это нужно?
Этот паттерн полезен, когда вы хотите интегрировать старый код в новую систему или использовать стороннюю библиотеку в вашем проекте без изменения существующего кода.
🔍 Ключевые моменты:
Преобразует один интерфейс в другой.
Обеспечивает совместимость между классами.
Упрощает интеграцию и повышает гибкость системы.
Сначала определение из википедии - способность функции обрабатывать данные разных типов.
PHP - язык с динамической и слабой типизацией, это значит, что в процессе работы программы тип переменной может быть изменен. Более того, операнды не обязаны быть одного типа и интерпретатор сможет обработать такие варианты операций без ошибок:
<?php
echo 1 . 1; // 11
echo PHP_EOL;
echo 1 + 1; // 2
echo PHP_EOL;
echo 1 + '1'; // 2
?>
Такое поведение уже формально подпадает под определение, но мы конечно хотим от полиморфизма совсем другого.
Практическая польза от полиморфизма в том, чтобы использовать один и тот же код для обработки данных полученных из разных функций, классов файлов и других источников.
Например, у нас есть новостной сайт. И мы получаем из базы данных информацию о новостях, чтобы вывести их пользователю. Чтобы не подключать бд к php песочнице, определим формат новости как json объект:
{
"title": "This is title",
"text": "This is text",
"time": "2024-01-13 12:00:00"
}
Напишем функцию, которая разберет этот json на отдельные поля и выведет на экран с нужным форматированием.
<?php
$jsonString = '{"title": "This is title", "text": "This is text", "time": "2024-01-13 12:00:00"}';
function publish($jsonString){
$jsonObject = json_decode($jsonString);
echo "<h1>$jsonObject->title</h1>";
echo PHP_EOL;
echo "<p>$jsonObject->text</p>";
echo PHP_EOL;
echo "<span>$jsonObject->time</span>";
}
publish($jsonString);
?>
Пока что неплохо справляемся и без ооп с полиморфизмом. Давайте добавим на наш сайт не только новости, но еще и статьи. В статьях не будет времени публикации, но будет имя автора. К сожалению, наша функция перестанет работать, если мы передадим такой json в нее. И тогда надо писать другую. И так для каждого типа контента. Конечно можно добавить несколько if - else и перерисовать дизайн блоков в зависимости от типов, но есть способ получше.
Теперь нам придется написать несколько классов.
<?php
class News
{
private $jsonString;
public function __construct()
{
$this->jsonString = '{"title": "This is title", "text": "This is text", "time": "2024-01-13 12:00:00"}';
}
public function publish()
{
$jsonObject = json_decode($this->jsonString);
echo "<div class='news'>";
echo "<h1>$jsonObject->title</h1>";
echo "<p>$jsonObject->text</p>";
echo "<span>$jsonObject->time</span>";
echo "</div>";
}
}
class Article
{
private $jsonString;
public function __construct()
{
$this->jsonString = '{"title": "This is title", "text": "This is text", "author": "Pikabu Member"}';
}
public function publish()
{
$jsonObject = json_decode($this->jsonString);
echo "<div class='article'>";
echo "<h2>$jsonObject->title</h2>";
echo "<p>$jsonObject->text</p>";
echo "<span>$jsonObject->author</span>";
echo "</div>";
}
}
$contents[] = new News();
$contents[] = new Article();
foreach($contents as $content){
$content->publish();
echo PHP_EOL."<div class='divider'></div>".PHP_EOL;
}
?>
Классы News и Article имеют одно приватное свойство jsonString. Заполняют его при создании объекта в конструкторе и выводят информацию из этого свойства в методе publish.
Таким образом мы можем использовать один метод для отрисовки данных из разных классов. И в главном потоке программы использовать простую конструкцию foreach(){$content->publish} для вывода разных отформатированных блоков.
Кто-то также говорит, что многие реализации должны принадлежать одному интерфейсу. То есть, мы должны определить общий интерфейс для классов его реализующих. На этапе вызова общего метода проверить принадлежность к интерфейсу. Таким образом мы сможем расширять программу многими классами и не задумываться об изменении главной программы.
<?php
interface IContent
{
function publish();
}
class News implements IContent
{
private $jsonString;
public function __construct()
{
$this->jsonString = '{"title": "This is title", "text": "This is text", "time": "2024-01-13 12:00:00"}';
}
public function publish()
{
$jsonObject = json_decode($this->jsonString);
echo "<div class='news'>";
echo "<h1>$jsonObject->title</h1>";
echo "<p>$jsonObject->text</p>";
echo "<span>$jsonObject->time</span>";
echo "</div>";
}
}
class Article implements IContent
{
private $jsonString;
public function __construct()
{
$this->jsonString = '{"title": "This is title", "text": "This is text", "author": "Pikabu Member"}';
}
public function publish()
{
$jsonObject = json_decode($this->jsonString);
echo "<div class='article'>";
echo "<h2>$jsonObject->title</h2>";
echo "<p>$jsonObject->text</p>";
echo "<span>$jsonObject->author</span>";
echo "</div>";
}
}
$contents[] = new News();
$contents[] = new Article();
foreach($contents as $content){
if ($content instanceof IContent) {
$content->publish();
echo PHP_EOL."<div class='divider'></div>".PHP_EOL;
}
}
?>
Вместо заключения. Хоть праздники уже закончились, но статью я дописал только сейчас, поэтому - Желаю всем счастливого нового года, денег, тепла и мира.
Спасибо всем, кто смог дочитать этот пост до конца несмотря на ужасное оформление, примеры на php и общую безграмотность. Отдельное спасибо всем, кто заходит и подписывается на ютуб канал. Я начинаю готовить видео на тему ООП. Может быть примеры кода на видео будут более понятны.
Ссылки на полезные документы:
Ну и в конце добавлю опрос