Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Начните с маленькой подводной лодки: устанавливайте бомбы, избавляйтесь от врагов и старайтесь не попадаться на глаза своим плавучим врагам. Вас ждет еще несколько игровых вселенных, много уникальных сюжетов и интересных загадок.

Пикабомбер

Аркады, Пиксельная, 2D

Играть

Топ прошлой недели

  • solenakrivetka solenakrivetka 7 постов
  • Animalrescueed Animalrescueed 53 поста
  • ia.panorama ia.panorama 12 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

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

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
11
f.lattys
f.lattys

Приятно удивлён книгой - "Объектно-ориентированное программирование с помощью Python"⁠⁠

1 год назад
Приятно удивлён книгой - "Объектно-ориентированное программирование с помощью Python"


В прошлом месяце прочёл книгу "Объектно-ориентированное программирование с помощью Python". Должен признаться, что у меня была смешанная реакция: с одной стороны, я понимал, что ООП — это важная тема для программиста, а с другой — 500+ страниц, и я опасался, что это будет скучное и нудное чтение про классы, объекты и инкапсуляцию.

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

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

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

Показать полностью 1
Программирование Обучение Книги IT Python Ооп Telegram (ссылка)
1
665
MaximVeter
MaximVeter
Самооборона

Что выбрать, вместо травмата?⁠⁠

1 год назад

Что выбрать, вместо травмата?

Итак, прошлый пост про мой опыт владения травматом набрал значительное количество откликов и реакций, поэтому, продолжим!

Защищаться нужно, но зачастую, это чревато последствиями, в том числе уголовного характера. Именно поэтому, не стал продлевать лицензию на Осу ПБ-4-2.

Как же быть? Лично я для себя нашел (на мой взгляд), идеальный вариант – антидог + газ.баллончик. Антидог изначально – это средство от бродячих агрессивных собак. Протестировав его, пришёл к выводу, что можно использовать как против четырёхлапых, так и от двуногих собак. Агрессивных.

Антидог – светошумовое устройство. Да, тут именно два аспекта – свет и шум.

Свет. Эту яркую вспышку видно, даже если зажмуришь глаза. Что уж говорить про нападающего, смотрящего широко открытыми глазами на диковинку в ваших руках? Зайчики и салют обеспечены в течении длительного времени. Его хватит, чтобы решить – бежать или добавить/добивать (условно).

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

Считаем плюсы, загибаем пальцы.

Не нужна лицензия (и связанные с ней траты), свободно продаётся.

Этим свето-шумом ты никого не убьёшь.

Тебе не нужно идти в полицию и заявлять о его применении.

Ты везде можешь с ним ходить.

Про газ.баллон ничего не буду говорить – это классика и азы самообороны)

Поэтому, в ЛРО я больше не ногой).

Показать полностью
[моё] Самооборона Травматическое оружие Ооп Текст
307
cherkalexander
cherkalexander

Абстракция⁠⁠

1 год назад
Абстракция


Когда говорят про ООП, часто забывают о двух вещах:

- Это не только инкапсуляция, наследование и полиморфизм, но ещё и абстракция
- Инкапсуляция, наследование и полиморфизм не прибиты гвоздями к ООП, особенно инкапсуляция и полиморфизм. Но об этом не сегодня.

Сегодня советую к просмотру видео: Абстракция, уровни абстракции.

ℹ️ Основные моменты:

- Абстракция — отвлечение от несущественных сторон, свойств, связей объекта с целью выделения их существенных, закономерных признаков. Иными словами, мы выделяем существенные свойства для нашей конкретной задачи, и не обращаем на несущественные.
- Абстрация = Интерфейс + Инкапсуляция
- Интерфейс — выделяет существенное
- Инкапсуляция — скрывает несущественное
- Абстрагирование нужно для управления сложностью кода, чтобы всё было надёжно, эффективно, расширяемо и поддерживаемо.

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

- Если нам важно вычислять его площадь и периметр, то мы говорим, что квадрат — это геометрическая фигура (абстрагируемся). Иначе говоря квадрат реализует интерфейс IGeometricShape.
- Если нам важно, чтобы квадрат мог быть сохранён в файл, то мы говорим, что квадрат — сериализуемый, например, в JSON объект, который можно затем можно записать в файл. Иначе говоря квадрат реализует интерфейс ISerializable.
- Аналогично, если нам важно уметь рисовать квадрат на экране, он должен реализовывать интерфейс IDrawable.
- Ну и где-то у нас есть методы, которые работают с абстракциями IGeometricShape, ISerializable и IDrawable. Таким образом методы абстрагированы от конкретных реализаций, что увеличивает переиспользуемость кода.

Ну и немного от себя, абстракция — фундаментальное понятие.
- Без абстракции не будет полиморфизма
- Без полиморфизма не будет Dependency Injection (Внедрение зависимостей)

https://t.me/cherkashindev/167

Показать полностью
Кросспостинг Pikabu Publish Bot Oop Текст YouTube (ссылка) Ооп Абстракция Программирование IT Telegram (ссылка)
2
6
f.lattys
f.lattys

Объектно-ориентированное программирование в Java⁠⁠

1 год назад
Объектно-ориентированное программирование в Java

Автор: Гуськова Ольга

Год: 2018

Количество страниц: 241

Учебное пособие посвящено объектно-ориентированному программированию на языке Java. Рассматриваются основные принципы объектно-ориентированного программирования, средства работы со структурами данных – коллекции и дженерики, принципы объектно-ориентированного дизайна.

Скачать книгу

Показать полностью 1
IT Программирование Java Ооп Книги Обучение Telegram (ссылка)
0
0
Deep.developer
Deep.developer

Жрица Moonwhisper и Заклинание Адаптера: Как Найти Общий Язык с Личем - Эпичное D&D Приключение!⁠⁠

1 год назад
Перейти к видео

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

Moonwhisper долго готовилась к этому путешествию. С детства она была обучена искусству магии и древним знаниям своего народа. Но теперь перед ней стояла задача, требующая большего, чем просто магические способности или мудрость стариков. Она отправлялась в поисках Забытой Книги Тайн, древнего манускрипта, который, по легендам, содержал знания, способные изменить мир.

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

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

Собрав свои вещи, включая свиток заклинаний, амулет защиты и небольшой мешочек с травами и зельями, Moonwhisper последний раз взглянула на звездное небо. Затем она глубоко вздохнула и шагнула в тьму леса, ведущего к входу в подземелья. Приключение начиналось.

.....

Паттерн Адаптер в Программировании: Простыми Словами

🔌 Что такое Паттерн Адаптер?

Представьте, что у вас есть розетка (один интерфейс) и вилка (другой интерфейс), которые не подходят друг другу. Чтобы они работали вместе, вам нужен переходник. Вот здесь и приходит на помощь паттерн Адаптер! Он позволяет объектам с несовместимыми интерфейсами работать вместе.

🔨 Как он работает?

Адаптер оборачивает один из объектов, позволяя ему "подружиться" с другим интерфейсом. Таким образом, вы можете использовать существующий класс с новым интерфейсом, не изменяя его код.

👩‍💻 Пример в программировании:

Допустим, у вас есть старая система логирования, которую вы хотите использовать с новым интерфейсом логирования. Вместо переписывания старой системы, вы создаете Адаптер, который позволяет старой системе работать с новым интерфейсом.

🌐 Зачем это нужно?

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

🔍 Ключевые моменты:

  • Преобразует один интерфейс в другой.

  • Обеспечивает совместимость между классами.

  • Упрощает интеграцию и повышает гибкость системы.

Показать полностью
[моё] Dungeons & Dragons Неочевидное D&D Baldur’s Gate 3 Программирование Ооп Паттерны Видео Длиннопост
0
4
vasiljevalentin
vasiljevalentin
Лига программистов
Серия ООП

Полиморфизм⁠⁠

1 год назад

Сначала определение из википедии - способность функции обрабатывать данные разных типов.

1 + '1' и другие приколы

1 + '1' и другие приколы

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 и общую безграмотность. Отдельное спасибо всем, кто заходит и подписывается на ютуб канал. Я начинаю готовить видео на тему ООП. Может быть примеры кода на видео будут более понятны.

Ссылки на полезные документы:

  • https://habr.com/ru/articles/37576/

  • https://habr.com/ru/articles/37610/

  • https://www.w3schools.com/php/php_oop_interfaces.asp

  • https://onlinephp.io/

Ну и в конце добавлю опрос

Что рассмотрим в следующий раз?
Всего голосов:
Показать полностью 1 1
[моё] Опрос Программирование Oop Ооп IT Длиннопост
4
11
vasiljevalentin
vasiljevalentin
Лига программистов
Серия ООП

Инкапсуляция и Наследование⁠⁠

2 года назад

Штош, Пикабу явно хочет поговорить про ооп. Так не будем останавливаться. Тем более, что в комментариях уже предложили массу тем для будущих постов. В этот раз я постараюсь описать принципы инкапсуляции и наследования и надеюсь, что более опытные коллеги смогут дать мне дельные советы и по этому поводу.

Примеры все еще на PHP

Примеры все еще на PHP

Инкапсуляция

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

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

<?php

class Text {

private $text;

public function __construct($text){

$this->text = $text;

}

public function printText() {

echo $this->text;

}

}

$hello = new Text("Hello, "); // создаем объект hello

$world = new Text("World!"); // создаем объект world

$hello->printText(); // вызываем метод print объекта hello

$world->printText(); // вызываем метод print объекта world

echo PHP_EOL.get_class($hello); // проверяем класс

echo PHP_EOL.get_class($world); // проверяем класс

?>

Здесь я добавил конструктор класса. С его помощью я передаю параметр с текстом. Этот параметр записывается в свойство text. Перед объявлением свойства text я использовал ключевое слово private, которое запрещает доступ к свойству извне класса. Функция get_class возвращает имя класса. Здесь я проверю, что класс двух объектов совпадает, почему это важно? Узнаем в следующих постах.

Определение возможности доступа к свойствам и методам класса (public, private, protected) - это сокрытие.

Таким образом получилось, что класс Text работает с параметром, который я передал через конструктор и методами, которые я описал в классе. Такое объединение данных и методов работы с ними + сокрытие - это инкапсуляция.

Наследование

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

<?php

class Text {

protected $text;

public function __construct($text){

$this->text = $text;

}

public function printText() {

return $this->text;

}

}

class Header extends Text {

public function printText() {

return strtoupper($this->text);

}

}

class Sentence extends Text {

public function printText() {

return ucfirst(strtolower($this->text));

}

}

$header = new Header("hello, world!");

$sentence = new Sentence("hello, WORLD!");

echo $header->printText();

echo PHP_EOL;

echo $sentence->printText();

?>

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

Вместо вывода: инкапсуляция, модификаторы доступа и наследование уже сильно отличается от использования простых функций. Расширение возможностей классов намного лучше переписывания отдельных функций или методов суперклассов. Поэтому использовать их хорошо.

Вместо заключения. Я, конечно, не ожидал такого отклика на первую статью. Тем более удивительно, что рейтинг на аккаунте стал немного больше, а не наоборот. Значит, все не зря. Более того, 63 человека стали подписчиками. Это уже совсем удивительно, ведь судя по комментариям, про ооп все уже все знают. Наверное, вы подписались из-за искрометных мемчиков вначале постов. В общем, всем спасибо! И отдельное спасибо новым подписчикам на ютубе :)

Что рассмотрим в следующий раз?
Всего голосов:
Показать полностью 1
[моё] Опрос PHP Программирование Ооп Oop Длиннопост
5
112
DrMort
Лига программистов

Ответ на пост «Поговорим про ооп»⁠⁠1

2 года назад

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

Чем класс в данном контексте отличается от функции? У класса есть свойства и методы. Это такой свод правил для каждой специальности - для бетонщиков, для штукатуров, для маляров - для каждой специальности отдельно. Когда вы нанимаете пять маляров, вы создаёте пять экземпляров класса маляр. У класса есть свойства. Это например возраст маляра, его рост (мелким малярам сложнее работать без стремянки), вес (некоторым малярам возможно понадобится более основательная стремянка), имя и например оклад. Набирая пяток маляров свойства у каждого из них будут отличаться и как говорит известная телеведущая - это нормально. А вот методы работы у них должны быть строго одинаковые!

Теперь к наследованию. Если мы пойдём в истории нашей бригады чуть назад, то мы поймём что все они строители (базовый класс - строитель), все они имеют некий общий набор свойств перечисленных выше. А вот уже от строителей отходят классы наследники - штукатуры, маляры и бетонщики. При этом каждый базовый "строитель" умеет таскать песок - то есть наши специализированные классы унаследовали от родительского такую возможность и в ООП это называется наследованием. Но иногда вы нанимаете шикарного маляра, который говорит: "я кароч песок таскать не буду, но зато смотри как шикарно я крашу!" И тогда это уже другой класс маляра - маляр-профессионал. Ему негоже таскать песок, но красит на пятёрочку и по другим методикам - это называется полиморфизм. На попытку заставить его таскать песок он ответит отказом, а покрасит лучше простого маляра. Это потомучто он переопределил в себе методы родителя CarryingSand() и PaintingAWalls(). Теперь к инкапсуляции. Если методичка по покраске стен написана хорошо, верно и конкретный Махмуд не несёт отсебятины, то результат предсказуем и повторяем. И самое главное нет нужды стоять у него над душой и контролировать процесс. В жизни так конечно не бывает, но мы предположим, что такие чудесные люди существуют в этом мире. Вот в таком случае считается что метод инкапсулирован и не важно что делает ваш маляр - важен итоговый результат или мотивированный отказ с указанием причины почему это сделать невозможно (например нет сен под покраску). Это конечно сильно утрированный пример, но зато понятнее для обывателя.

Показать полностью
PHP Программирование Ооп Oop Длиннопост Ответ на пост Текст
45
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии