Адам, Ева и их дети в ООП
Моим первым языком программирования был Pascal. На нем, за первые годы учебы в вузе, я понаписал кучу всякой лабораторной всячины. Дальше был С, С++, а потом, на несколько лет, по ряду причин, я выпал из студенческой жизни. Вернувшись к высшему образованию после вынужденного перерыва, я начал осваивать другую специальность и забыл о программировании.
Вспомнил про него случайно, когда младшая сестра поступила в институт. Как-то она обратилась ко мне за помощью, нужно было написать лабораторную работу по ООП на C++.
Вытаскивая из памяти заброшенные знания и пытаясь донести их до сестры, я пришел к выводу, что с разбегу объяснить основы ООП не выйдет. Имея навыки «процедурного» программирования, она совсем не понимала сути ООП. Тогда я решил упростить такие понятия, как: объекты, классы, методы классов, свойства классов и пр., и стал представлять их в виде привычных вещей.
Для наглядности, я привожу код на PHP. Конечно, это просто пример, для улучшения восприятия ООП и не более того. Многие функции не описаны полностью, да это и не требуется в данном случае. Подобный подход к объяснению понятных программистам вещей, очень хорошо воспринимается обычными людьми, так как основан на объектах из человеческой жизни, а не на ситуациях из жизни машин и программ. Ну и конечно капелька юмора в коде только улучшает восприятие.
//абстрактный человек abstract class human { abstract function nutrition(); //функция питания abstract function reproduction(); //функция размножения abstract function survival(); //функция выживания } //первый человек, мужчина class Adam extends human { function reproduction() { while (!$tired): $anyFemale=findFemale(); sex($anyFemale); endwhile; } function survival() { while ($warning==true): saveSelfBalls(2); endwhile; } function nutrition() { while (!foodSearch()): $foods=foodSearch(); endwhile; feedSelf($foods['meat']);} } //интерфейс для создания женщины interface rib { public function makeFemaleFromRib(); } //первая женщина - из ребра Адама class Eva extends Adam implements rib { public function makeFemaleFromRib() { return true;} function reproduction() { while (!Child()) : $bestMale=findMale(); sex($bestMale); endwhile; } function survival() { while ($warning) : saveChildren($childCount); endwhile; } function nutrition() { while (!foodSearch()) : $foods=foodSearch(); endwhile; feedChildren($foods['bestFood']); feedSelf($foods['otherFood']); } } //современная женщина class ModernWoman extends Eva { function nutrition() { if ($richHusband){ goToRestourant($restorants['bestRestourant']); eat($food['bestFood']);} elseif (!$richHusband()) { $products=buyFood($shops['kopeika']); $food=makeFood($products['anyFood']); eat($food);} } function findHusband($selfAge){ if ($selfAge>25) { return tryFindRichMan();} elseif ($selfAge>25&&$selfAge>35){ return tryFindSportsMan();} elseif ($selfAge>35&&$selfAge>40){ return tryFindAnyMan();} else return findRandomMan(); } function reproduction() { while (!married()): $man=findHusband($selfAge); tryToMarriage($man); endwhile; if (!$lifeProblems&&!$moneyProblems&&!healthProblems&&!anyProblems){ while (!Child($childCount)): sex($man); endwhile; } else safeSex($man); } function survival() { while ($warning) : save($things[‘anyThings’]); endwhile; } } //соврменный мужчина class ModerMan extends Adam{ function nutrition() { if (!$marriage()&&!$liveTogeatherMother){ $food=buySausage($shops['anyShop']); eat($food);} elseif ($marriage||$liveTogeatherMother){ $food=askFood($foods['tasty']); eat($food);} elseif ($programmer){ $food=orderPizza(); eat($food);} } function findGirl ($boobsSize,$hairColor,$anyParams){ return $allWorldGirls[$boobsSize][$hairColor][$anyParams];} function reproduction(){ if (!$gay&&!$marriage){ $female=findGirl('3 or more','blonde','best world girl'); while (!$tried): sex($female); endwhile;} elseif ($marriage){ while (!$football&&!$tv&&!$beer): sex($wife); sleepAfterSex($sleepAfterSexInterval); endwhile; } else return false; } function survival() { if (!$gay){ while ($warning==true): saveSelfBalls(2); endwhile;} elseif ($gay){ hardAnalWork();} else return false; } } ?>
В такой форме, с функциями и переменными названными осмысленными именами, обучение гораздо веселее и понятнее. А сколько всего интересного можно добавить в этот шутливый код!
Например, не хватает некоторых методов для класса ModernWoman:
function writeSocialMessage($socialNetwork,$message) { if (postMessage($socialNetwork,$message)) { return true;} else return false; } postSocialMessage($socialNetworks['twitter'],'Мой папик просто пусик!');
Простор для творчества огромен. Попробуйте этот подход, если вам понадобится объяснять ООП простым людям. А дети, которые только учатся программировать, просто в восторге от подачи материала в такой форме (конечно без взрослой специфики).