Орел и решка на PHP. Практика ООП для начинающих

Поделиться
HTML-код
  • Опубликовано: 27 авг 2024
  • Привет. Меня зовут Рахим. Я разрабатываю на php, Laravel. Помогаю пройти путь обучения от синтаксиса до фреймворков.
    Инстаграм: / rahim.muratov
    Сайт: marlindev.ru
    VK: learnby...
    Это видеоурок по созданию игры Орел и решка. Также хорошая практика по ооп для начинающих
    Вдохновился идеей с канала Laracasts.

Комментарии • 76

  • @user-xn8cs3ch9m
    @user-xn8cs3ch9m 11 месяцев назад +4

    Блин!!! Как долго я искал такое видео!!! Я за эти 30 минут понял больше чем за несколько часов просмотров лекций!!! Так просто, доступно и понятно!!!!! Спасибо тебе добрый человек!!!!)

  • @sergeysachenko8616
    @sergeysachenko8616 Год назад +7

    это пушка!
    я как новичек, считаю это видео максимально полезным и необходимым для понимания!
    таких видосов фактически нет!
    дай Бог тебе здоровья и процветания - золотой Автор!

  • @prod.wembley3816
    @prod.wembley3816 4 месяца назад +1

    Автор молодец. В свое время не хватало такого урока, потому что я учился на 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)

  • @user-kr2tq4zk4p
    @user-kr2tq4zk4p 9 месяцев назад

    Братишь, от Души! Отличная практика. Редкий пример хорошей практики.

  • @edwardfisher5615
    @edwardfisher5615 Год назад +1

    Спасибо за урок!
    Написал аналог на C#.
    Монету вынес в отдельный класс с методом Toss, подбрасывающим монету, и свойством SideUp, которое может быть одним из энумов CoinSide Head / Tail.

  • @welldone8294
    @welldone8294 Год назад +2

    Комментарии редко пишу, но тут просто лайком не обойтись. Вот так и надо ООП объяснять. Спасибо большое. Хочу больше подобных примеров. А уж как я радовался за Джейн 😅

  • @user-pt8km8hd9e
    @user-pt8km8hd9e 10 месяцев назад

    Спасибо за труд 11/10
    Комментарии не пишу, но тут просто лайком не обойтись.

  • @user-bb9hk7dd4b
    @user-bb9hk7dd4b 2 года назад +1

    Рахмет от души брат , по PHP_шное процветание во всем !)

  • @dmitriysavinov9906
    @dmitriysavinov9906 2 года назад +5

    Хороший разбор, как раз для понятия ООП. Для практики можно на других языках реализовать. Спасибо!

  • @fighter1737
    @fighter1737 9 месяцев назад

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

  • @Amedomaroful
    @Amedomaroful 2 года назад

    Побольше бы таких примеров, особенно охото работы с циклами.
    Большое спасибо за видео, с нетерпением жду следующие!

  • @eldaeron
    @eldaeron 2 года назад +5

    После 9.7 месяцов Jane смогла разорить казино)

  • @PCMasterpro-hc9li
    @PCMasterpro-hc9li Год назад

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

    • @ToBeCloser007
      @ToBeCloser007  Год назад

      Какой пример еще хотелось бы увидеть?

    • @PCMasterpro-hc9li
      @PCMasterpro-hc9li Год назад

      Хотелось бы увидеть продолжение базы данных pdo, а также, больше практических примеров написания самого кода в ООП

  • @bogdanapache8263
    @bogdanapache8263 2 года назад +1

    спасибо за полезный урок! отличный формат

  • @l0lk3k4eburek
    @l0lk3k4eburek 2 года назад

    Спасибо, Рахим) очень заходит такой формат.

  • @disconnect3763
    @disconnect3763 6 месяцев назад

    Супер, видео. Спасибо большое!

  • @user-pv4nd4xr7p
    @user-pv4nd4xr7p Год назад

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

  • @nuklon
    @nuklon Год назад

    Замечание по логике задачи..
    Учитывается перенос монет туда-сюда, но не учитывается изменение шанса. Шанс просто высчитывается в начале и все. Там нет постоянных значений 99% на 1%. При каждом броске каждого игрока, процент шанса перетекает в ту или иную сторону. Поэтому Jane выиграла. Редкое, конечно, событие, но, как видим, возможное.
    Но, для зрителей это будет самостоятельной работой)

  • @nmirlanov
    @nmirlanov 2 года назад

    Все отлично. Спасибо! По больше бы таких задач.

  • @user-hs9zw4mk6o
    @user-hs9zw4mk6o 2 месяца назад

    Красапед!

  • @vlache6983
    @vlache6983 2 года назад +2

    Немного с рефакторингом можно было еще поиграть, но в целом годно!
    Спасибо, просмотрел, прослезился, прям так-же с движков все начиналось, которые были еще до фреймворков )))
    Ну и к реальности, нет наследования, инкапсуляции, полиморфизм, интерфейсов и абстрактных классов!

    • @andreykhalepov8260
      @andreykhalepov8260 Год назад

      Организация кода не оптимальная. Названия функций, передаваемые параметры. Да даже бесконечный цикл. Можно было написать что-то вроде while haveNoWinner {...}

  • @darknet106
    @darknet106 Год назад

    Классный формат, спасибо!

  • @CausticAscarite
    @CausticAscarite 2 года назад +1

    Ты как раз вовремя...

  • @user-ly7zn9fr6i
    @user-ly7zn9fr6i 2 года назад

    Спасибо за отличный урок.

  • @user-no7sl1yk3f
    @user-no7sl1yk3f Год назад

    Ура, рад за Jane. Это была потная катка

  • @kaemey4330
    @kaemey4330 8 месяцев назад

    Банкрот и банк это усложнения для того, кто в первый раз будет видеть код)))

  • @zhansayayerbolatova2244
    @zhansayayerbolatova2244 2 года назад +2

    аоаоаоа😍

  • @invisebledemon
    @invisebledemon 11 месяцев назад

    Ну... раз ютабчег решил мне это показать...
    1) Почему повышение счетчика подброса не в методе подброса ?
    2) Почему повышение счетчика происходит после возможного выброса из цикла ? (подброс так то был... выходит расчет всегда -1 подброс)
    1) Душный
    2) Ошибка

  • @matrix-brz
    @matrix-brz 17 часов назад

    всë. ютубу конец. про твои видео можно забыть

  • @user-du6ns4ww6o
    @user-du6ns4ww6o Год назад

    Мне так жаль что я не успел пройти курс у автора канала, было интересно учиться на этих уроках.

  • @zoodogood
    @zoodogood 2 года назад +2

    Я думаю содержимое цикла while можно вынести в новую функцию и это было бы круто с точки зрения простоты кода и ООП. Так как каждая итерация - самостоятельное действие.
    То есть:
    • подбросить монетку;
    • передать монетку от проигравшего к победителю;
    Это можно перенести в функцию party (с англ. можно перевести как "игровая партия"), а в внутри `play` продолжать вызывать её в том же цикле пока кто-то не станет банкротом

    • @ToBeCloser007
      @ToBeCloser007  2 года назад +1

      Тоже отличная идея!

  • @sergeypetrovetsky3431
    @sergeypetrovetsky3431 2 года назад +1

    Блин, кусочком попробовал php, класс, но синтаксис чуть хромает. В целом понравился.

  • @Net-olekma
    @Net-olekma 2 года назад +2

    Пых сила :)

    • @poul2008
      @poul2008 2 года назад

      js могила)))

  • @tolik8
    @tolik8 2 года назад +3

    • @tolik8
      @tolik8 2 года назад +2

      это просто шутка, если что )))

  • @delifeful
    @delifeful 2 года назад +1

    Материал хороший, спасибо вам.
    Но, пожалуйста, никогда не пишите таких условий как на 16:02 их реально сложнее читать чем то которое было.
    Если примите замечание то: лучше бы закрыть класс от изменений после первого написанного функционала. а на текущий класс добавить декоратор (украсить объект), с необходимым функционалом. и было бы круто!

    • @ToBeCloser007
      @ToBeCloser007  2 года назад +1

      Спасибо! Классный комментарий

  • @murd1337
    @murd1337 2 года назад +1

    Мне кажется, это не самый лучший вариант использования ООП - не соблюдается солид принцип. Просто смысл теряется ООП по моему мнению. И допустим вычитание и присваивание монет, мне кажется, лучше делать в Game, так как в person давать доступы к другому person - ну такое, я бы создал метод exchangeCoins и делал бы так: $this->exchangeCoins($this->_player2, $this->_player1). Так же с шансами - можно же сделать класс PlayerWithOdds, который наследуется от Player и при инициализации Game сразу высчитать шансы.
    А так спасибо - когда-то посмотрел твой ролик и начал понимать ООП

  • @back_to_life0
    @back_to_life0 2 года назад

    Круто

  • @djflorfila1985
    @djflorfila1985 Год назад

    Джейн вставила казино! XD

  • @MrKOHKyPEHT
    @MrKOHKyPEHT 2 года назад +1

    Можно ли метод winner написать так: *return $this->player1->bankrupt() ? $this->player2 : this->player->1* ? После тайпскрипта стал лучше понимать PHP :)

    • @ToBeCloser007
      @ToBeCloser007  2 года назад +1

      Тоже можно. Если п1 банкрот, то логично что победил п2, а если не банкрот, то победил п1

    • @MrKOHKyPEHT
      @MrKOHKyPEHT 2 года назад +1

      @@ToBeCloser007 Но твоя запись понятнее и легче читается. Это я так спросил... Самоутвердиться в своих глазах )

  • @user-dv9fk1hd3s
    @user-dv9fk1hd3s 2 года назад +1

    Тернарный оператор получился длинный, думаю можно было if else оставить

    • @ToBeCloser007
      @ToBeCloser007  2 года назад +1

      Можно, проблем нет 👍

  • @bassboosted1184
    @bassboosted1184 Год назад

    Нужно попробовать 10 месяцев монетку покидать)

  • @user-pv4nd4xr7p
    @user-pv4nd4xr7p Год назад

    В свои студенгческие годы я забросил программирование, потому что так и не смог понять как программировать с использованием ООП (МА-97). И вот в свои 42 года решил стать программистом, но и сейчас я уперся в этот потолок (синтаксис ООП я знаю и понимаю, заучил его, а вот написать что-то простое все еще не могу). Нет смысла использовать в программировании исключения, разбираться с многопоточностю, изучать основы системного программирования и взаимодествия с файловой системой, работе с БД, если вы все еще не можете на листочке написать словами алгоритм решения задачи с помощью инструментов ООП. Практики применения OOP на просторах youtube нет. Я нашел это ruclips.net/video/235odkP26vQ/видео.html и еще два видео годных для обучения мысленному проектированию на ООП, но этого мало для внутреннего сдвига парадигмы мышления. Вот мои два ресурса: 1) ruclips.net/video/Vhj04XyXXJo/видео.html и 2)ruclips.net/p/PLmRNNqEA7JoPhVQCUisflWWhjdoKucDuf. Поэтому огромное спасибо автору канала, что хоть немного приоткрыл практические подходы в применении ООП. Предлагаю всем неравнодушным добавлять в комментариях те ресурсы, которые Вам помогли преодолеть непонимание парадигмы мышления ООП и преодолеть эту пропасть.

    • @bigl_dev
      @bigl_dev 7 месяцев назад

      Не знаю, насколько мой комментарий будет актуален, но понять ООП в целом не сложно. Мы в обычной жизни его постоянно используем, но не замечаем.
      В большинстве случаев можно провести такую параллель:
      Класс - это подлежащее, свойства класса - это прилагательные, числительные и состав, методы - глаголы, что получится в итоге - результат метода, над чем глагол производит дейтсвия - это параметры методов.
      Пример:
      "я варю красный борщ из этих продуктов". Разберем предложение на части:
      - сказуемое "я"
      - глагол "варю". Исполнитель - я
      - над чем будет производиться действие? над продуктам
      - что получим после действия - борщ
      - прилагательные "красный", свойство борща, его цвет
      class Borsch {
      public $color = 'red';
      public function __construct(array $products){}
      }
      class I {
      function cooking(array $products) {
      return new Borsch($products);
      }
      }

  • @user-oo8sl3gl2j
    @user-oo8sl3gl2j 2 года назад

    Marlin, если у тебя Linux, что за дистрибутив ты используешь?

  • @denzeroneYT
    @denzeroneYT Год назад

    А как вообще используют ООП на тех же сайтах? Просто у меня задача была создать интернет магазин на ларавел, я его создал, но что-то вообще без ООП, мне сказали что нужно добавить наследование классов, интерфейсы и абстрактные классы для начала

    • @prod.wembley3816
      @prod.wembley3816 4 месяца назад

      С опытом приходит. Глаз со временем сам начинает делить код на классы, абстракции и методы.) Главное как можно чаще писать свою архитектуру и смотреть к взрослым дядям по типу Symfony и других больших проектов написанных на нем, либо на том же Laravel условном

  • @glavtrest
    @glavtrest 2 месяца назад

    А это вообще законно - устраивать дома казино? 😁

  • @redfyruiwufuio7210
    @redfyruiwufuio7210 2 месяца назад

    Даже код не выложил

  • @maxmax7831
    @maxmax7831 Год назад

    бро, можно погромче у меня здесь дети плачут и бегают

  • @Garry_Li
    @Garry_Li 2 года назад

    12:16 дичь какая-то, ужасный нейминг, потом нифига же не понять что за поинт и зачем мы туда передаём второго игрока, тут должен быть метод расчетБаллов который на вход принимает победителя и проигравшего, это не должен быть метод класса player, какого хрена player имеет доступ к очкам другого player

    • @jack-lizard
      @jack-lizard 2 года назад +2

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

  • @delusio5638
    @delusio5638 Год назад

    а ваще нах это ооп в пыхе нужно? в плане создания сайтов ооп особо не требуется, а для разных вычислений есть более удобные языки

    • @prod.wembley3816
      @prod.wembley3816 4 месяца назад

      Чтобы когда в проекте больше 1000 строк кода, изменения в одном куске не затрагивали всю программу. Чтобы можно было заниматься паралельной разработкой без стопроцентных мердж конфликтов. Чтобы можно было поддерживать приложение в котором уже не 1000, а 1.000.000 строк кода. Вообще, гугл в помощь)

    • @yanmet
      @yanmet 2 месяца назад

      Хочу увидеть лицо абсолютно любой РНР CMS, которые на 100% ООП и там абсолютно всё это класс, метод или обёртка к ним

    • @prod.wembley3816
      @prod.wembley3816 2 месяца назад

      @@yanmet October CMS?

    • @yanmet
      @yanmet 2 месяца назад

      @@prod.wembley3816, не совсем понял что именно имеете в виду этим вопросом: "имел ли я в виду October CMS" или "а что насчёт October CMS", поэтому отвечу на оба :)
      1. В том числе, но и WordPress, Drupal, Joomla, ModX, Bitrix тоже чистый ООП
      2. Да, October CMS тоже, может даже и в первую очередь, так как Laravel

  • @VovaEnt
    @VovaEnt Год назад

    Спасибо

  • @Bigboyrussia
    @Bigboyrussia Год назад

    Parse error: syntax error, unexpected ':', expecting ')' in
    почему ошибка ?
    new Player(name:"Hitler", coins:1000),