Орел и решка на PHP. Практика ООП для начинающих
HTML-код
- Опубликовано: 27 авг 2024
- Привет. Меня зовут Рахим. Я разрабатываю на php, Laravel. Помогаю пройти путь обучения от синтаксиса до фреймворков.
Инстаграм: / rahim.muratov
Сайт: marlindev.ru
VK: learnby...
Это видеоурок по созданию игры Орел и решка. Также хорошая практика по ооп для начинающих
Вдохновился идеей с канала Laracasts.
Блин!!! Как долго я искал такое видео!!! Я за эти 30 минут понял больше чем за несколько часов просмотров лекций!!! Так просто, доступно и понятно!!!!! Спасибо тебе добрый человек!!!!)
это пушка!
я как новичек, считаю это видео максимально полезным и необходимым для понимания!
таких видосов фактически нет!
дай Бог тебе здоровья и процветания - золотой Автор!
Автор молодец. В свое время не хватало такого урока, потому что я учился на Class Square, class Triangle... Кто понял тот понял))
На опыте, что можно было бы улучшить (для тех кто хочет прокачаться еще больше):
- добавить класс PlayerSettings вместо того чтобы передавать в плеера два параметра (закос на будущее когда параметров будет больше двух)
- вместо Player в аргументы Game принимать PlayerInterface (реализация D из SOLID, отказываемся от конкретики в пользу абстракций)
- вместо protected пишем private (I из SOLID, обеспечивает низкую связанность между различными частями системы - по мере необходимости расширять область доступа до protected/public)
- вместо class - final readonly class (см. предыдущий пункт, дальше по необходимости убираем final, readonly)
- в Game указать что это не просто свойство, а private PlayerInterface $player (инкапсуляция, Dependency Inversion)
- в новой версии PHP свойства класса можно обьявлять прямо в конструкторе, тут это как раз было уместно и сократило бы код (добавляем лаконичности, тут уже на вкус и цвет конечно)
- Game это у нас абстракция, ибо какая конкретно игра? Не ясно. Делаем класс abstract и создаем новый, который называем условно HeadsTails, наследуемся от Game (Open/Closed Principle)
- winner() я бы переименовал в getWinner(), что дает понять нам что метод точно что-то вернет, а не void
- start(), play() - по одним названиям не ясно чем они отличаются, нужно посидеть подумать как убрать один из них либо переименовать
- bankrupt() -> isBankrupt() (сразу ясно что метод вернет бул значение)
- point() -> increaseCoins() (сразу ясно что метод увеличивает кол-во коинов)
- bank() -> getTotalCoins() (сразу ясно что вернет общую сумму монет)
- odds() -> getPlayerWinChance() а еще лучше вынести это в метод класса Player и назвать его getWinChance() (S из SOLID)
Братишь, от Души! Отличная практика. Редкий пример хорошей практики.
Спасибо за урок!
Написал аналог на C#.
Монету вынес в отдельный класс с методом Toss, подбрасывающим монету, и свойством SideUp, которое может быть одним из энумов CoinSide Head / Tail.
Комментарии редко пишу, но тут просто лайком не обойтись. Вот так и надо ООП объяснять. Спасибо большое. Хочу больше подобных примеров. А уж как я радовался за Джейн 😅
Спасибо за труд 11/10
Комментарии не пишу, но тут просто лайком не обойтись.
Рахмет от души брат , по PHP_шное процветание во всем !)
Пожалуйста 🤝
Хороший разбор, как раз для понятия ООП. Для практики можно на других языках реализовать. Спасибо!
Спасибо 🙏
Во время просмотра все очень понятно и доходчиво, но вот когда закрываешь видео и пытаешься сделать самомтоятельно - начинаются проблемы. Но в любом случае это нужно сделать своими руками и желательно продолжать до тех пор, пока не получится написать весь проект без подглядываний.
Спасибо большое за видео)
Побольше бы таких примеров, особенно охото работы с циклами.
Большое спасибо за видео, с нетерпением жду следующие!
После 9.7 месяцов Jane смогла разорить казино)
Точно)
Спасибо, Рахим за Отличный пример, показывающий как можно наглядно и просто изложить ООП на конкретном примере. Давайте побольше таких примеров! Потому что хороший практических занятий по ООП на PHP с разбором в инете нет.
Какой пример еще хотелось бы увидеть?
Хотелось бы увидеть продолжение базы данных pdo, а также, больше практических примеров написания самого кода в ООП
спасибо за полезный урок! отличный формат
Спасибо, Рахим) очень заходит такой формат.
Крутот
Супер, видео. Спасибо большое!
Рахим, у тебя хорошо получается доходчиво обьяснять ход размышлений при использовании ООП. Напиши вариант блэк джека на ООП с таким же разбором. Будет просто огонь!
Замечание по логике задачи..
Учитывается перенос монет туда-сюда, но не учитывается изменение шанса. Шанс просто высчитывается в начале и все. Там нет постоянных значений 99% на 1%. При каждом броске каждого игрока, процент шанса перетекает в ту или иную сторону. Поэтому Jane выиграла. Редкое, конечно, событие, но, как видим, возможное.
Но, для зрителей это будет самостоятельной работой)
Все отлично. Спасибо! По больше бы таких задач.
Красапед!
Немного с рефакторингом можно было еще поиграть, но в целом годно!
Спасибо, просмотрел, прослезился, прям так-же с движков все начиналось, которые были еще до фреймворков )))
Ну и к реальности, нет наследования, инкапсуляции, полиморфизм, интерфейсов и абстрактных классов!
Организация кода не оптимальная. Названия функций, передаваемые параметры. Да даже бесконечный цикл. Можно было написать что-то вроде while haveNoWinner {...}
Классный формат, спасибо!
Ты как раз вовремя...
Спасибо за отличный урок.
Ура, рад за Jane. Это была потная катка
Банкрот и банк это усложнения для того, кто в первый раз будет видеть код)))
аоаоаоа😍
Ну... раз ютабчег решил мне это показать...
1) Почему повышение счетчика подброса не в методе подброса ?
2) Почему повышение счетчика происходит после возможного выброса из цикла ? (подброс так то был... выходит расчет всегда -1 подброс)
1) Душный
2) Ошибка
всë. ютубу конец. про твои видео можно забыть
Ок)
Мне так жаль что я не успел пройти курс у автора канала, было интересно учиться на этих уроках.
Я думаю содержимое цикла while можно вынести в новую функцию и это было бы круто с точки зрения простоты кода и ООП. Так как каждая итерация - самостоятельное действие.
То есть:
• подбросить монетку;
• передать монетку от проигравшего к победителю;
Это можно перенести в функцию party (с англ. можно перевести как "игровая партия"), а в внутри `play` продолжать вызывать её в том же цикле пока кто-то не станет банкротом
Тоже отличная идея!
Блин, кусочком попробовал php, класс, но синтаксис чуть хромает. В целом понравился.
Супер!
Пых сила :)
js могила)))
это просто шутка, если что )))
Материал хороший, спасибо вам.
Но, пожалуйста, никогда не пишите таких условий как на 16:02 их реально сложнее читать чем то которое было.
Если примите замечание то: лучше бы закрыть класс от изменений после первого написанного функционала. а на текущий класс добавить декоратор (украсить объект), с необходимым функционалом. и было бы круто!
Спасибо! Классный комментарий
Мне кажется, это не самый лучший вариант использования ООП - не соблюдается солид принцип. Просто смысл теряется ООП по моему мнению. И допустим вычитание и присваивание монет, мне кажется, лучше делать в Game, так как в person давать доступы к другому person - ну такое, я бы создал метод exchangeCoins и делал бы так: $this->exchangeCoins($this->_player2, $this->_player1). Так же с шансами - можно же сделать класс PlayerWithOdds, который наследуется от Player и при инициализации Game сразу высчитать шансы.
А так спасибо - когда-то посмотрел твой ролик и начал понимать ООП
Круто
Джейн вставила казино! XD
Можно ли метод winner написать так: *return $this->player1->bankrupt() ? $this->player2 : this->player->1* ? После тайпскрипта стал лучше понимать PHP :)
Тоже можно. Если п1 банкрот, то логично что победил п2, а если не банкрот, то победил п1
@@ToBeCloser007 Но твоя запись понятнее и легче читается. Это я так спросил... Самоутвердиться в своих глазах )
Тернарный оператор получился длинный, думаю можно было if else оставить
Можно, проблем нет 👍
Нужно попробовать 10 месяцев монетку покидать)
В свои студенгческие годы я забросил программирование, потому что так и не смог понять как программировать с использованием ООП (МА-97). И вот в свои 42 года решил стать программистом, но и сейчас я уперся в этот потолок (синтаксис ООП я знаю и понимаю, заучил его, а вот написать что-то простое все еще не могу). Нет смысла использовать в программировании исключения, разбираться с многопоточностю, изучать основы системного программирования и взаимодествия с файловой системой, работе с БД, если вы все еще не можете на листочке написать словами алгоритм решения задачи с помощью инструментов ООП. Практики применения OOP на просторах youtube нет. Я нашел это ruclips.net/video/235odkP26vQ/видео.html и еще два видео годных для обучения мысленному проектированию на ООП, но этого мало для внутреннего сдвига парадигмы мышления. Вот мои два ресурса: 1) ruclips.net/video/Vhj04XyXXJo/видео.html и 2)ruclips.net/p/PLmRNNqEA7JoPhVQCUisflWWhjdoKucDuf. Поэтому огромное спасибо автору канала, что хоть немного приоткрыл практические подходы в применении ООП. Предлагаю всем неравнодушным добавлять в комментариях те ресурсы, которые Вам помогли преодолеть непонимание парадигмы мышления ООП и преодолеть эту пропасть.
Не знаю, насколько мой комментарий будет актуален, но понять ООП в целом не сложно. Мы в обычной жизни его постоянно используем, но не замечаем.
В большинстве случаев можно провести такую параллель:
Класс - это подлежащее, свойства класса - это прилагательные, числительные и состав, методы - глаголы, что получится в итоге - результат метода, над чем глагол производит дейтсвия - это параметры методов.
Пример:
"я варю красный борщ из этих продуктов". Разберем предложение на части:
- сказуемое "я"
- глагол "варю". Исполнитель - я
- над чем будет производиться действие? над продуктам
- что получим после действия - борщ
- прилагательные "красный", свойство борща, его цвет
class Borsch {
public $color = 'red';
public function __construct(array $products){}
}
class I {
function cooking(array $products) {
return new Borsch($products);
}
}
Marlin, если у тебя Linux, что за дистрибутив ты используешь?
Ubuntu
@@ToBeCloser007 Благодарю :)
А как вообще используют ООП на тех же сайтах? Просто у меня задача была создать интернет магазин на ларавел, я его создал, но что-то вообще без ООП, мне сказали что нужно добавить наследование классов, интерфейсы и абстрактные классы для начала
С опытом приходит. Глаз со временем сам начинает делить код на классы, абстракции и методы.) Главное как можно чаще писать свою архитектуру и смотреть к взрослым дядям по типу Symfony и других больших проектов написанных на нем, либо на том же Laravel условном
А это вообще законно - устраивать дома казино? 😁
Даже код не выложил
бро, можно погромче у меня здесь дети плачут и бегают
12:16 дичь какая-то, ужасный нейминг, потом нифига же не понять что за поинт и зачем мы туда передаём второго игрока, тут должен быть метод расчетБаллов который на вход принимает победителя и проигравшего, это не должен быть метод класса player, какого хрена player имеет доступ к очкам другого player
Самоутверждаешься? Или гений разработки?
Вы, выражаетесь, как "быдлокодер". Что это за "нейминг"? К чему эти "пойнты"? Али, Вы, пишите на русском, либо на английском. А, Ваш, стиль - это "кабацкие частушки" с выходом из-за печки.
Сказано ж, таким "упоротым" критикам, как, Вы-сударь, что самая главная суть для новичка не в том, чтоб делать проект без ошибок, а в том, что надо практиковаться и еще раз практиковаться. При этом вырабатывать свой стиль. А ошибки - это нормально.
А на подобные комменты и на подобных умников просто необходимо класть "с прибором".
а ваще нах это ооп в пыхе нужно? в плане создания сайтов ооп особо не требуется, а для разных вычислений есть более удобные языки
Чтобы когда в проекте больше 1000 строк кода, изменения в одном куске не затрагивали всю программу. Чтобы можно было заниматься паралельной разработкой без стопроцентных мердж конфликтов. Чтобы можно было поддерживать приложение в котором уже не 1000, а 1.000.000 строк кода. Вообще, гугл в помощь)
Хочу увидеть лицо абсолютно любой РНР CMS, которые на 100% ООП и там абсолютно всё это класс, метод или обёртка к ним
@@yanmet October CMS?
@@prod.wembley3816, не совсем понял что именно имеете в виду этим вопросом: "имел ли я в виду October CMS" или "а что насчёт October CMS", поэтому отвечу на оба :)
1. В том числе, но и WordPress, Drupal, Joomla, ModX, Bitrix тоже чистый ООП
2. Да, October CMS тоже, может даже и в первую очередь, так как Laravel
Спасибо
Parse error: syntax error, unexpected ':', expecting ')' in
почему ошибка ?
new Player(name:"Hitler", coins:1000),