Блин!!! Как долго я искал такое видео!!! Я за эти 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.
Комментарии редко пишу, но тут просто лайком не обойтись. Вот так и надо ООП объяснять. Спасибо большое. Хочу больше подобных примеров. А уж как я радовался за Джейн 😅
Во время просмотра все очень понятно и доходчиво, но вот когда закрываешь видео и пытаешься сделать самомтоятельно - начинаются проблемы. Но в любом случае это нужно сделать своими руками и желательно продолжать до тех пор, пока не получится написать весь проект без подглядываний. Спасибо большое за видео)
Спасибо, Рахим за Отличный пример, показывающий как можно наглядно и просто изложить ООП на конкретном примере. Давайте побольше таких примеров! Потому что хороший практических занятий по ООП на PHP с разбором в инете нет.
Рахим, у тебя хорошо получается доходчиво обьяснять ход размышлений при использовании ООП. Напиши вариант блэк джека на ООП с таким же разбором. Будет просто огонь!
Немного с рефакторингом можно было еще поиграть, но в целом годно! Спасибо, просмотрел, прослезился, прям так-же с движков все начиналось, которые были еще до фреймворков ))) Ну и к реальности, нет наследования, инкапсуляции, полиморфизм, интерфейсов и абстрактных классов!
Организация кода не оптимальная. Названия функций, передаваемые параметры. Да даже бесконечный цикл. Можно было написать что-то вроде while haveNoWinner {...}
Замечание по логике задачи.. Учитывается перенос монет туда-сюда, но не учитывается изменение шанса. Шанс просто высчитывается в начале и все. Там нет постоянных значений 99% на 1%. При каждом броске каждого игрока, процент шанса перетекает в ту или иную сторону. Поэтому Jane выиграла. Редкое, конечно, событие, но, как видим, возможное. Но, для зрителей это будет самостоятельной работой)
Мне кажется, это не самый лучший вариант использования ООП - не соблюдается солид принцип. Просто смысл теряется ООП по моему мнению. И допустим вычитание и присваивание монет, мне кажется, лучше делать в Game, так как в person давать доступы к другому person - ну такое, я бы создал метод exchangeCoins и делал бы так: $this->exchangeCoins($this->_player2, $this->_player1). Так же с шансами - можно же сделать класс PlayerWithOdds, который наследуется от Player и при инициализации Game сразу высчитать шансы. А так спасибо - когда-то посмотрел твой ролик и начал понимать ООП
Я думаю содержимое цикла while можно вынести в новую функцию и это было бы круто с точки зрения простоты кода и ООП. Так как каждая итерация - самостоятельное действие. То есть: • подбросить монетку; • передать монетку от проигравшего к победителю; Это можно перенести в функцию party (с англ. можно перевести как "игровая партия"), а в внутри `play` продолжать вызывать её в том же цикле пока кто-то не станет банкротом
Ну... раз ютабчег решил мне это показать... 1) Почему повышение счетчика подброса не в методе подброса ? 2) Почему повышение счетчика происходит после возможного выброса из цикла ? (подброс так то был... выходит расчет всегда -1 подброс) 1) Душный 2) Ошибка
Можно ли метод winner написать так: *return $this->player1->bankrupt() ? $this->player2 : this->player->1* ? После тайпскрипта стал лучше понимать PHP :)
Материал хороший, спасибо вам. Но, пожалуйста, никогда не пишите таких условий как на 16:02 их реально сложнее читать чем то которое было. Если примите замечание то: лучше бы закрыть класс от изменений после первого написанного функционала. а на текущий класс добавить декоратор (украсить объект), с необходимым функционалом. и было бы круто!
В свои студенгческие годы я забросил программирование, потому что так и не смог понять как программировать с использованием ООП (МА-97). И вот в свои 42 года решил стать программистом, но и сейчас я уперся в этот потолок (синтаксис ООП я знаю и понимаю, заучил его, а вот написать что-то простое все еще не могу). Нет смысла использовать в программировании исключения, разбираться с многопоточностю, изучать основы системного программирования и взаимодествия с файловой системой, работе с БД, если вы все еще не можете на листочке написать словами алгоритм решения задачи с помощью инструментов ООП. Практики применения OOP на просторах youtube нет. Я нашел это ua-cam.com/video/235odkP26vQ/v-deo.html и еще два видео годных для обучения мысленному проектированию на ООП, но этого мало для внутреннего сдвига парадигмы мышления. Вот мои два ресурса: 1) ua-cam.com/video/Vhj04XyXXJo/v-deo.html и 2)ua-cam.com/play/PLmRNNqEA7JoPhVQCUisflWWhjdoKucDuf.html. Поэтому огромное спасибо автору канала, что хоть немного приоткрыл практические подходы в применении ООП. Предлагаю всем неравнодушным добавлять в комментариях те ресурсы, которые Вам помогли преодолеть непонимание парадигмы мышления ООП и преодолеть эту пропасть.
Не знаю, насколько мой комментарий будет актуален, но понять ООП в целом не сложно. Мы в обычной жизни его постоянно используем, но не замечаем. В большинстве случаев можно провести такую параллель: Класс - это подлежащее, свойства класса - это прилагательные, числительные и состав, методы - глаголы, что получится в итоге - результат метода, над чем глагол производит дейтсвия - это параметры методов. Пример: "я варю красный борщ из этих продуктов". Разберем предложение на части: - сказуемое "я" - глагол "варю". Исполнитель - я - над чем будет производиться действие? над продуктам - что получим после действия - борщ - прилагательные "красный", свойство борща, его цвет class Borsch { public $color = 'red'; public function __construct(array $products){} } class I { function cooking(array $products) { return new Borsch($products); } }
А как вообще используют ООП на тех же сайтах? Просто у меня задача была создать интернет магазин на ларавел, я его создал, но что-то вообще без ООП, мне сказали что нужно добавить наследование классов, интерфейсы и абстрактные классы для начала
С опытом приходит. Глаз со временем сам начинает делить код на классы, абстракции и методы.) Главное как можно чаще писать свою архитектуру и смотреть к взрослым дядям по типу Symfony и других больших проектов написанных на нем, либо на том же Laravel условном
12:16 дичь какая-то, ужасный нейминг, потом нифига же не понять что за поинт и зачем мы туда передаём второго игрока, тут должен быть метод расчетБаллов который на вход принимает победителя и проигравшего, это не должен быть метод класса player, какого хрена player имеет доступ к очкам другого player
Самоутверждаешься? Или гений разработки? Вы, выражаетесь, как "быдлокодер". Что это за "нейминг"? К чему эти "пойнты"? Али, Вы, пишите на русском, либо на английском. А, Ваш, стиль - это "кабацкие частушки" с выходом из-за печки. Сказано ж, таким "упоротым" критикам, как, Вы-сударь, что самая главная суть для новичка не в том, чтоб делать проект без ошибок, а в том, что надо практиковаться и еще раз практиковаться. При этом вырабатывать свой стиль. А ошибки - это нормально. А на подобные комменты и на подобных умников просто необходимо класть "с прибором".
Чтобы когда в проекте больше 1000 строк кода, изменения в одном куске не затрагивали всю программу. Чтобы можно было заниматься паралельной разработкой без стопроцентных мердж конфликтов. Чтобы можно было поддерживать приложение в котором уже не 1000, а 1.000.000 строк кода. Вообще, гугл в помощь)
@@prod.wembley3816, не совсем понял что именно имеете в виду этим вопросом: "имел ли я в виду October CMS" или "а что насчёт October CMS", поэтому отвечу на оба :) 1. В том числе, но и WordPress, Drupal, Joomla, ModX, Bitrix тоже чистый ООП 2. Да, October CMS тоже, может даже и в первую очередь, так как Laravel
Блин!!! Как долго я искал такое видео!!! Я за эти 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_шное процветание во всем !)
Пожалуйста 🤝
Спасибо, Рахим за Отличный пример, показывающий как можно наглядно и просто изложить ООП на конкретном примере. Давайте побольше таких примеров! Потому что хороший практических занятий по ООП на PHP с разбором в инете нет.
Какой пример еще хотелось бы увидеть?
Хотелось бы увидеть продолжение базы данных pdo, а также, больше практических примеров написания самого кода в ООП
Хороший разбор, как раз для понятия ООП. Для практики можно на других языках реализовать. Спасибо!
Спасибо 🙏
спасибо за полезный урок! отличный формат
Супер, видео. Спасибо большое!
Побольше бы таких примеров, особенно охото работы с циклами.
Большое спасибо за видео, с нетерпением жду следующие!
Рахим, у тебя хорошо получается доходчиво обьяснять ход размышлений при использовании ООП. Напиши вариант блэк джека на ООП с таким же разбором. Будет просто огонь!
Спасибо, Рахим) очень заходит такой формат.
Крутот
Немного с рефакторингом можно было еще поиграть, но в целом годно!
Спасибо, просмотрел, прослезился, прям так-же с движков все начиналось, которые были еще до фреймворков )))
Ну и к реальности, нет наследования, инкапсуляции, полиморфизм, интерфейсов и абстрактных классов!
Организация кода не оптимальная. Названия функций, передаваемые параметры. Да даже бесконечный цикл. Можно было написать что-то вроде while haveNoWinner {...}
Классный формат, спасибо!
Все отлично. Спасибо! По больше бы таких задач.
Ура, рад за Jane. Это была потная катка
После 9.7 месяцов Jane смогла разорить казино)
Точно)
Замечание по логике задачи..
Учитывается перенос монет туда-сюда, но не учитывается изменение шанса. Шанс просто высчитывается в начале и все. Там нет постоянных значений 99% на 1%. При каждом броске каждого игрока, процент шанса перетекает в ту или иную сторону. Поэтому Jane выиграла. Редкое, конечно, событие, но, как видим, возможное.
Но, для зрителей это будет самостоятельной работой)
Красапед!
Спасибо за отличный урок.
Ты как раз вовремя...
аоаоаоа😍
Мне так жаль что я не успел пройти курс у автора канала, было интересно учиться на этих уроках.
Круто
Джейн вставила казино! XD
Мне кажется, это не самый лучший вариант использования ООП - не соблюдается солид принцип. Просто смысл теряется ООП по моему мнению. И допустим вычитание и присваивание монет, мне кажется, лучше делать в Game, так как в person давать доступы к другому person - ну такое, я бы создал метод exchangeCoins и делал бы так: $this->exchangeCoins($this->_player2, $this->_player1). Так же с шансами - можно же сделать класс PlayerWithOdds, который наследуется от Player и при инициализации Game сразу высчитать шансы.
А так спасибо - когда-то посмотрел твой ролик и начал понимать ООП
Блин, кусочком попробовал php, класс, но синтаксис чуть хромает. В целом понравился.
Супер!
Я думаю содержимое цикла while можно вынести в новую функцию и это было бы круто с точки зрения простоты кода и ООП. Так как каждая итерация - самостоятельное действие.
То есть:
• подбросить монетку;
• передать монетку от проигравшего к победителю;
Это можно перенести в функцию party (с англ. можно перевести как "игровая партия"), а в внутри `play` продолжать вызывать её в том же цикле пока кто-то не станет банкротом
Тоже отличная идея!
Пых сила :)
js могила)))
Банкрот и банк это усложнения для того, кто в первый раз будет видеть код)))
Ну... раз ютабчег решил мне это показать...
1) Почему повышение счетчика подброса не в методе подброса ?
2) Почему повышение счетчика происходит после возможного выброса из цикла ? (подброс так то был... выходит расчет всегда -1 подброс)
1) Душный
2) Ошибка
Можно ли метод winner написать так: *return $this->player1->bankrupt() ? $this->player2 : this->player->1* ? После тайпскрипта стал лучше понимать PHP :)
Тоже можно. Если п1 банкрот, то логично что победил п2, а если не банкрот, то победил п1
@@ToBeCloser007 Но твоя запись понятнее и легче читается. Это я так спросил... Самоутвердиться в своих глазах )
Marlin, если у тебя Linux, что за дистрибутив ты используешь?
Ubuntu
@@ToBeCloser007 Благодарю :)
Материал хороший, спасибо вам.
Но, пожалуйста, никогда не пишите таких условий как на 16:02 их реально сложнее читать чем то которое было.
Если примите замечание то: лучше бы закрыть класс от изменений после первого написанного функционала. а на текущий класс добавить декоратор (украсить объект), с необходимым функционалом. и было бы круто!
Спасибо! Классный комментарий
В свои студенгческие годы я забросил программирование, потому что так и не смог понять как программировать с использованием ООП (МА-97). И вот в свои 42 года решил стать программистом, но и сейчас я уперся в этот потолок (синтаксис ООП я знаю и понимаю, заучил его, а вот написать что-то простое все еще не могу). Нет смысла использовать в программировании исключения, разбираться с многопоточностю, изучать основы системного программирования и взаимодествия с файловой системой, работе с БД, если вы все еще не можете на листочке написать словами алгоритм решения задачи с помощью инструментов ООП. Практики применения OOP на просторах youtube нет. Я нашел это ua-cam.com/video/235odkP26vQ/v-deo.html и еще два видео годных для обучения мысленному проектированию на ООП, но этого мало для внутреннего сдвига парадигмы мышления. Вот мои два ресурса: 1) ua-cam.com/video/Vhj04XyXXJo/v-deo.html и 2)ua-cam.com/play/PLmRNNqEA7JoPhVQCUisflWWhjdoKucDuf.html. Поэтому огромное спасибо автору канала, что хоть немного приоткрыл практические подходы в применении ООП. Предлагаю всем неравнодушным добавлять в комментариях те ресурсы, которые Вам помогли преодолеть непонимание парадигмы мышления ООП и преодолеть эту пропасть.
Не знаю, насколько мой комментарий будет актуален, но понять ООП в целом не сложно. Мы в обычной жизни его постоянно используем, но не замечаем.
В большинстве случаев можно провести такую параллель:
Класс - это подлежащее, свойства класса - это прилагательные, числительные и состав, методы - глаголы, что получится в итоге - результат метода, над чем глагол производит дейтсвия - это параметры методов.
Пример:
"я варю красный борщ из этих продуктов". Разберем предложение на части:
- сказуемое "я"
- глагол "варю". Исполнитель - я
- над чем будет производиться действие? над продуктам
- что получим после действия - борщ
- прилагательные "красный", свойство борща, его цвет
class Borsch {
public $color = 'red';
public function __construct(array $products){}
}
class I {
function cooking(array $products) {
return new Borsch($products);
}
}
А как вообще используют ООП на тех же сайтах? Просто у меня задача была создать интернет магазин на ларавел, я его создал, но что-то вообще без ООП, мне сказали что нужно добавить наследование классов, интерфейсы и абстрактные классы для начала
С опытом приходит. Глаз со временем сам начинает делить код на классы, абстракции и методы.) Главное как можно чаще писать свою архитектуру и смотреть к взрослым дядям по типу Symfony и других больших проектов написанных на нем, либо на том же Laravel условном
это просто шутка, если что )))
всë. ютубу конец. про твои видео можно забыть
Ок)
Нужно попробовать 10 месяцев монетку покидать)
Тернарный оператор получился длинный, думаю можно было if else оставить
Можно, проблем нет 👍
А это вообще законно - устраивать дома казино? 😁
бро, можно погромче у меня здесь дети плачут и бегают
Даже код не выложил
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),