итак. для начала перечислим состовными частями. вот они: палка,лекса,катушка,груз,круюёк,папловок.
очевидно удочку надо относледовать от палки. так же очевидно что нужно агрегировать леску и катушку. теперь надо разобраться с грузом крючок и поплавком. очевидно что груз это базовый класс. от него наследуються крючок и поплавок.
так. с основной частью разобрались.
теперь рассмотрим методы которые есть у лески. у ней нет методов.
рассмотрим методы которые есть груза: прикрепиться к леске. открепиться от лески. порвать леску.
рассмотрим методы которые есть у удочки. прикрепить леску. открепиться лески. порвать леску.
рассмотрим методы которые есть у катушки: прикрепить леску. открепиться лески. порвать леску.
очевидно у них есть общий интерфейс. значит наследуем удочку и барабан от груза.
кстати, агрегировать барабан и леску удочке не нужно. деагрегируем.
так. кажеться я забыл про палку. ок. тогда надо сначала палку относледовать от груза, а потом удочку от палки... стоп. палка это и есть удочка. значит удаляем удочку и делаем палку которая наследуеться от груза и ничего не агрегирует.
итак, теперь груз - корень иерархии наследования.
ок. тогда заканчиваем описывать удочку.
начинаем рыбачить.
итак.
для начала возмём кусочек хлеба. хлеб надо относледовать от груза. нет. стоп. нам не наго крепить хлеб к леске. нам надо крепить хлеб к крючку. тогда надо относледовать хлеб от крючка. но тогда не клюнет рыба. что же делать? я вспомнил у нас же есть инкапсуляция. ок используем приватное наследование. наследуем хлеб от крючка приватно.
oh shi~ что стало с моей буханкой хлеба, кажеться я проколол себе крючком язык.
>>420026 >очевидно удочку надо относледовать от палки >очевидно что груз это базовый класс. от него наследуються крючок и поплавок. >тогда надо относледовать хлеб от крючка. Программач поясняэ
Пишу в ЭПИЧНОМ треде. Оп забыл, что есть такой прекрасный паттерн как обсервер. Таким образом, хлеб становится observable и при поедании его рыбой (sic!) сообщает об изменении крючку, который вызывает у рыбы метод попасться(). Если вызов удачный то крючок (сам являющийся observable) вызывает зарегистрированный метод лески, которая в свою оучередь натягивается(), сообщая об этом катушке и удочке, которые принимают решение согласно бизнес-логике, порвать леску или нет.
В целом такой изящной конструкцией мы инвертировали зависимость ключка от картошки (очевидно что картошка не должна плавать на воде) и избавились от по-моему ненужного грузила.
В тред приглашаются знатоки GoF, приветствуются непосредственные члены GoF, если тут такие есть. Поясните, какие паттерны еще стоит применить в нашей конструкции.
>>420026 Спасибо, проблевался. Мудак, открой для себя композицию и о наследовании вспоминай в самую последнюю очередь. Хлеб он собрался наследовать от груза... ну ахуеть теперь
Так уж и быть, научу детей ООП. Ок, давайте опишем удочку с точки зрения ООП. Для начала надо посмотреть на задачу, что нам требуется сделать. Найти условия задачи в потоке бессвязного бреда довольно трудно, но мы будем исходить из предположения, что Удочка способна поймать Рыбу, а также, мы можем снять пойманную Рыбу. При этом очевидно что на Удочку на которой уже есть Рыба, поймать ничего не получится.
Если не сделать это предположение, то так как никаких требований к Удочке нет, класс Удочка можно описать так:
class FishingRod {}
Так неинтересно, потому решим задачу в соответствии с придуманными требованиями. Итак, очевидно что на Удочку может быть поймана Рыба, и может быть не поймана. Сделаем свойство для хранения пойманной Рыбы, и сразу же методы для ее ловли/снятия.
class FishingRod { private $caughtFish; public function catchFish(Fish $fish) { ... } // возвращает Рыбу public function removeFish() { ... } }
Насчет самой Рыбы, неясно, есть ли у нее какие-то свойства — если нет, хватило бы поля типа bool вместо объекта, потому придумаем условия что Рыба бывет разных видов и веса.
class Fish { const TYPE_PIKE = 1; const TYPE_SWORD_FISH = 2; const TYPE_SHARK = 3;
private $weight; private $type; public function __construct($type, $weight); }
Ну и раз есть вес, то вдобавок можно сделать допольнительные проверки: например, сделать Удочке свойство МаксимальныйВес и проверять, выдержит ли она Рыбу или нет (выбрасывать в этом случае исключение RodBrokenException).
>>420208 ПХП макака не могла не обосраться и вместо удочки создала палку для хранения рыбины. Как через объект такого класса выразить одевание наживки, забрасывание, мониторинг поплавка, подсекание, вытягивание и прочие вещи которые делают из палки удочку - непонятно.
>>420233 Неистово двачую данный пост. Даже это >ОП просто не осилил ООП тоже хотел написать.
Например, у тебя есть такие сущности - клиент и покупатель. Ты, как человек, знаешь, что обе эти сущности представляют тоже люди, и чтобы тебе было легче ориентироваться в системе наследуешь их от общего класса Person. Ведь это максимум логично. Да. Но потом ты смотришь на это, плачешь и бежишь создавать в /pr/ тред о том, что ооп говно. В описанном примере наследовать от общего класса не стоит, если у сущностей нет ничего общего. Да, и то, и то это люди, но если в контексте твоей программы они не пересекаются, то и наследование нинужно, это абсолютно разные классы.
>>420633 Школоло детектед. В рекурсиях нет ничего сложного для понимания, это способ решения задач вроде быстрой сортировки или просмотра дерева каталогов, и только-то.
>>420026 Удочка - это слишком плохой пример для изучения ООП. Гораздо интереснее изучать ООП на примере педо-леса: есть класс Лоля, у неё есть атрибуты: - имя - возраст - желание - опыт в обычном сексе - опыт в анальном сексе - опыт в оральном сексе и следующие методы: - быть отняшенной в писю(Лолиёб кем) - быть отняшенной в попу(Лолиёб кем) - быть отняшенной в рот(Лолиёб кем) - отняшить ртом(Лолиёб кого) - выдать статистику
По аналогии создаём класс Лолиёба. А так же необходимо игровое поле Педолес, который разбиваем на клетки и располагаем в нем лолей и лолиёбов. По очереди при помощи генератора случайных чисел передвигаем лолей и лолиёбов и если они встречаются в одной клетке, то в зависимости от желания и генератора случайных чисел, применяют друг-на-друга различные методы. Применение методов, лучше всего при этом снабдить выдачей в консоль соответствующих комментариев. Так же, можно сделать возможным, что бы один из лолиёбов или одна из лолей находился/лась в прямом управлении пользователя.
>>421213 Спроси у Цивеника, он в этом плане переплюнул тебя раз в 20.
Касательно кода: coin_flip() и generate_name() к классу Loli не относятся, их надо вынести в топ-левел. Алсо, мог бы и рогалик сделать при помощи escape-последовательностей.
>>421213 А, еще. "_orally", "_anally", "_vaginally" - тебе не кажется, что код с этими вещами довольно сильно повторяется? Зделой признак "how", который будет равен ANALLY, ORALLY, VAGINALLY, например.
>>421213 Очень хорошо получилось, правда можно сделать еще ряд улучшений, например, самое простое - это добавить несколько лолиебов, так как с одним скучно и собирать статистику и для них.
Ну и самое пожалуй сложное - это написать более интересные диалоги при сексе: зависящие от возраста, опыта и опционально от рэндома.
Я сам когда пытался это сделать, мне это не удавалось, так как после написания нескольких фраз, у меня появлялся дикий стояк и дальше продолжать не было никакой возможности.
http://rghost.ru/private/60087504/52505f9672f509ef2f627bfb9569847e 1.01rc >>421248 В диалоги я не умею. >>421234 Детект в pedobear.process(loli) тоже сделан бездумно, и его надо как-то менять (но я не знаю как, без разделения обработки на два прохода). Алсо, ооп в пистоне - неудобный пиздец. >Спроси у Цивеника Кто такой, чем знаменит? Не гуглится. Я знаю только парня с форчана с его loli raep sim.
>>420026 пиздец как ты далек от рыбалки, грузило у него леску рвет, у лески методов нет, охуеть теперь, дальше не читал. Начнем с того что нужно подбирать вес груза, для этого есть приватная переменная и сеттер, который заранее не дает ставить такой груз который своей тяжестью вызовет интерфейс из класса лески который ее рвет. Ты написал хуету.
>>420026 Что вы тут блядь все несете, дибилы сука? Здесь от удочки должен наследоваться кручек с рыбой (насаженной), где рыба наследуются от привычного анимал, а леска наследуется от черенка, а грузы уже от лески. Далее по цепочке вызываем методы от наследованных объектов, получаем профит. Всё!
В данном конкретном примере с удочкой, вообще ничего не нужно наследовать, а следует применить агрегацию (или композицию), т.е. класс Удочка, должен состоять из параметров: грузило, леска, крючек, палка, барабан (и какие там еще составные части у удочки?)
Наследование имеет смысл только тогда, когда Класс-Ребенок - это подвид Класса-Родителя, например: Автомобиль -> Волга 2110 Животное -> Собака Персоонаж -> Лоля
>>421674 Это не важно на чем вы пишете. Наследовать составные части предмета друг от друга, когда нужно применить агрегацию (или композицию) - это высший идиотизм.
>>421781 Кстати да. Умение определять когда A, B, C являются частными случаями D, а когда D состоит из A, B, C похоже важнейшее в ООD.
Хотя я как-то давно разочаровался в наследовании и использую онли композицию и интерфейсы, полёт нормальный. Иногда хочется взять и заебашить всё на наследовании, так как проще, но потом когда вспоминаешь эту хрупкую абстракцию, эти уёбищные пятиэтажные деревья наследования, в которые в результате все разрастается, то быстро бросаешь эту задумку.
>>421814 >Попытался научить их ходить и обосрался. В чем проблема? Это же не очень сложно
>Зато есть мысли как отрефакторить тот пиздец, который в диалогах. Вообще, на мой взгляд, для большего интереса, стоит создать целый сложный массив (или набор массивов) с диалогами. (Можно все это положить в отдельный файл).
>>420026 > очевидно удочку надо относледовать от палки И сразу файл, дальше не читал. Удочку следует отнаследовать от абстрактного класса инструментов, а палкой следует композиционно расширить этот класс
>>422212 В общем, если подумать, то я начинаю понимать, откуда появляются паттерны. Вот такая, казалось бы, простая задача, которая не в ООП стиле решается со скоростью набора текста на клавиатуре, тут превращается в полный пиздец. Вот, например, диалоги у меня вставлены рандомно между строками кода. Это неправильно. А чтобы сделать красиво, поддерживаемо и вообще, надо вводить полноценную систему сообщений. Лолиёб видит лоли, отправляет себе сообщение, некий "модуль диалогов" его перехватывает и выбирает реплику, которая отсылается лоли (и печатается в консольку). Лоля получает это сообщение и как-то реагирует, отсылает сообщение лолиёбу, и т.д. и т.п.. Но я не хочу это делать; слишком много лишнего кода ради ничего. Задача-то решена, в принципе. Дальше только развитие вширь, с добавлением вытекающей спермы, диаметров отверстий/хуйцов и всего такого, но это уже не сильно интересно. Разве только управление прикрутить и цветное отображение.
>>422488 > dependency injection Ненужная хуйня. Потому как все это вырастает потом в SendMessage(ISender sender,IMessage msg,IReceiver receiver). И ты ахуееваешь от этой ненужной иерархии. >XML Сжечь нахуй
>>422904 > без фанатизма Понимаешь, XML действительно удобен как язык разметки (хотя я бы предпочел аналогичный вариант SGML с «</>» в качестве закрывающего тега), но так как в подавляющем большинстве случаев, с которыми я имел дело, его используют неуместно, то лучше пусть его сожгут вообще, нахуй.
>>423028 Не, ящитаю ты неправ. XML должен существовать, чтобы на него как мухи на говно слетались разные идиоты от мира программирования. Сожгут XML - они ПРИДУТ ЗА ТОБОЙ
>>421417 А вот всё это делает как раз рыбак. То есть рыбак наблюдает за удочкой (implements Runnable), а Рыба попадается на удочку в случайный момент времени (она может кружить вокруг удочки и покусывать приманку, может попасться на крючок, то есть она тоже implements Runnable).
>>423789 Еще момент - покусывая приманку, рыба может её eventually съесть полностью, нужно этот момент обработать, чтобы она съела и при этом не попалась
>>423575 >Как может рыба по собственному желанию клюнуть? Он только хочет есть. Так рыбак тоже только хочет есть, а удочка - иплементация его интерфейса Hungerable с методом findFood()
итак. для начала перечислим состовными частями.
вот они:
палка,лекса,катушка,груз,круюёк,папловок.
очевидно удочку надо относледовать от палки.
так же очевидно что нужно агрегировать леску и катушку.
теперь надо разобраться с грузом крючок и поплавком.
очевидно что груз это базовый класс. от него наследуються крючок и поплавок.
так. с основной частью разобрались.
теперь рассмотрим методы которые есть у лески.
у ней нет методов.
рассмотрим методы которые есть груза:
прикрепиться к леске.
открепиться от лески.
порвать леску.
рассмотрим методы которые есть у удочки.
прикрепить леску.
открепиться лески.
порвать леску.
рассмотрим методы которые есть у катушки:
прикрепить леску.
открепиться лески.
порвать леску.
очевидно у них есть общий интерфейс. значит наследуем удочку и барабан от груза.
кстати, агрегировать барабан и леску удочке не нужно.
деагрегируем.
так. кажеться я забыл про палку.
ок. тогда надо сначала палку относледовать от груза, а потом удочку от палки... стоп.
палка это и есть удочка. значит удаляем удочку и делаем палку которая наследуеться от груза и ничего не агрегирует.
итак, теперь груз - корень иерархии наследования.
ок. тогда заканчиваем описывать удочку.
начинаем рыбачить.
итак.
для начала возмём кусочек хлеба.
хлеб надо относледовать от груза.
нет. стоп. нам не наго крепить хлеб к леске. нам надо крепить хлеб к крючку.
тогда надо относледовать хлеб от крючка.
но тогда не клюнет рыба.
что же делать?
я вспомнил у нас же есть инкапсуляция.
ок используем приватное наследование.
наследуем хлеб от крючка приватно.
oh shi~ что стало с моей буханкой хлеба, кажеться я проколол себе крючком язык.
/убежал к хирургу.