Упражнения и задачи за по - добро усвояване на OOP

C++ JAVA
chepa
Потребител
Потребител
Posts: 746
Joined: Fri Aug 14, 2009 3:01 pm

Упражнения и задачи за по - добро усвояване на OOP

Post by chepa » Fri Mar 03, 2017 5:00 pm

Гледам уроци, но когато гледам урока ми е лесно, но тръгна ли да пиша.. ;д Вие как се упражнявате?


П.С - най -вече визирам класовете

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 861
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Fri Mar 03, 2017 5:23 pm

Ами с практика и много четене на чужд код.

Дай да видим от къде учиш.

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3260
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 126

Post by dakata__92 » Sat Mar 04, 2017 8:01 am

Колегата го каза много добре. Спазвай PSR стандартите и най-вече идеята на ООП, която е всеки клас да изпълнява своите дейности не да съдържа чужда структура. Просто се иска практика и мисъл за по-добро структуриране на системата. :) Преминеш ли веднъж на ООП и процедурният код ще ти се стори мнооого неправилно структуриран. Смисъл ще започнеш сам да пишеш единствено с ООП, защото мисълта ти ще тече в този вид, което и ще е много добре. :?: Много четене и поставяне на лични задачки. Ето от 3 годинки си имам на хоста сайт за издирване на хора онлайн и постоянно си го подобрявам от към модули. :P

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 861
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Sat Mar 04, 2017 8:51 am

Това, за което говори Даката е Силна свързаност(High/Strong Cohesion) и Функционална независимост(Loose coupling). Най-добрата практика е, да се спазват тези два принципа.

Ако имаш въпроси питай тука, ако можем и ни стига интелекта - ще помагаме. :D

pix3l
Нов
Нов
Posts: 161
Joined: Sat Oct 08, 2016 2:31 pm

Post by pix3l » Tue Mar 07, 2017 11:31 am

Първо трябва да разбереш разликата между клас и обект, после принципите на ООП, след това обектно-ориентираното моделиране, и накрая трябва да се научиш да си създаваш абстрактни модели на задачите, които решаваш.

Правиш си online магазин, в него имаш някакви продукти, категории, потребители, кошница с продуктите, поръчки и т.н.
С обектно-ориентираното моделиране изкарваш обектите, които ще са ти нужни за решаване на задачата... в този случай имаме обектите Магазин, Продукт, Категория, Потребител, Кошница, Поръчка.
Създаваш си класове за тези обекти, като описваш само детайлите, които са важни за решаването на задачата... например, когато описваш потребителя, важни може да са потребителско име, адрес за доставка, име, телефон за връзка и т.н. Потребителя си има и други характеристики, като цвят на очите, цвят на косата височина, тегло, но тези неща едва ли ще са важни, за да му изпратиш поръчките, следователно игнорираш подобни детайли при описанието. Това се нарича абстрактен модел - концентрираш се върху важните детайли, като игнорираш всичко останало.
След като си намерил важните детайли, трябва да ги опишеш в класове, чрез свойства. Свойствата сами по себеси не са достатъчни, потребителя трябва да може да може да направи поръчката, кошницата трябва да може да добавя продукти в себе си, магазина трябва да регистрира потребители, категорията трябва да добавя продукти в себеси, а за продукта не се сещам в момента кво може да прави. Тези действия се описват чрез методи, методите оперират единствено върху данни в класа, или в най-добрия случай върху данни, подадени им през параметрите.
Класовете трябва да държат само свойства и методи, които имат смисъл в контекста на тези класове... не може в класа Потребител да има свойство "номер на продукт", или в класа Продукт да има метод "регистрирай потребител", по простата причина, че в контекста на тези класове такива свойства нямат никакъв смисъл.

Това (плюс още няколко принципа) представлява ООП - данните и работата с тях се събира в едно и образува обект, който работи като отделна единица в решаването на общия проблем.

Конкретен код не съм дал, щото ООП е повече принципи от колкото писане на код. Пък и пиша от телефон, така че ша извиняваш, ако има грешки някъде... :D

chepa
Потребител
Потребител
Posts: 746
Joined: Fri Aug 14, 2009 3:01 pm

Post by chepa » Tue Mar 07, 2017 6:02 pm

Благодаря на всички! Доста изчерпателно обяснение, за което ти благодаря много! Ще приключа с уроците и ще се обръщам в тази тема при нужда :)



П.С - ще прочета псота ти още 100 - 200 пъти, за да го oсмисля по - добре доста е подробен и изчерпателен ;д


ЕДИТ: Ето малко понятия с които ми е още трудно да свикна. Поствам ги, тъй като може да са полезни на някого.
Какви понятия се използват в ООП:
 Class - клас: Това е дефиниран от програмиста даннов тип, който съдържа данни и функции. Вие
може да мислите за класа като за един шаблон, чрез който може да правите различни обекти
(инстанции на класа).
 Object: една конкретна инстанция на класа.
 Променливи на класа: Това са данните, които са дефинирани в класа (още – атрибути на класа).
Тези данни трябва да са невидими за света извън класа – да могат да се достъпва, единствено
чрез функциите на класа.
 Член функции: Това са функциите, дефинирани в класа, използват се за достъп до данните в
класа.
 Наследяване (Inheritance): Когато един клас се дефинира като наследяващ данни и функции на
друг (родителски или базов) клас, то имаме наследяване. Той се явява – наследник (или дете или
породен клас) на родителски клас (Parent class).
 Родителски клас (Parent class) = base class или super class: Един клас, който се наследява от друг
клас.
 Клас - наследник (Child Class) или породен клас: Клас, който наследява друг клас.
 Полиморфизъм: Това е една обектно ориентирана концепция, състояща в това: една функция да
бъде използвана за различни цели. Например функцията „move” на клас „animal” може да се
изпълнява по различен начин: пълзене, летене, вървене и т.н.
 Конструктор (Constructor): това е специална функция, която се извиква автоматично, когато се
създава конкретен обект (инстанция)на класа.
 Деструктор (Destructors): специална функция, която се извиква автоматично, когато един обект
трябва да се разруши.

pix3l
Нов
Нов
Posts: 161
Joined: Sat Oct 08, 2016 2:31 pm

Post by pix3l » Tue Mar 07, 2017 7:26 pm

И разбра ли от това описание какво е полиморфизъм например? :D
На човек, който от години пише обектно-ориентирано най-веротятно ще му говори нещо, но на човек, който за първи път се сблъсква с ООП едва ли.
А полиморфизма всъщност е нещо много просто... метод, който работи по различен начин в различните класове, но в крайна сметка резултата е един и същ.
Или ако го караме по твоето описание - имаме един общ клас "Animal", в който има метод "move()", имаме и 3 класа, които наследяват "Animal" - "Snake", "Eagle", "Lion". Гарантирано ни е, че класовете, които наследяват "Animal" ще имат метода "move()", но "Snake" ще декларира в себеси "move()" и ще презапише наследения метод, като имплементира пълзене... "Eagle" ще пренапише "move()", като имплементира летене, а "Lion" ще го презапише, като имплементира бягане.
Тези, които ще ползват метода не се интересуват как е имплементиран метода "move()", те знаят, че щом го извикат, всяко животно от тип "Animal" ще започне да се движи.

Code: Select all

class Animal {
    public function move() {
        // Basic implementation
    }
}

class Snake extends Animal {
    public function move() {
        // Implements creeping
    }
}

class Eagle extends Animal {
    public function move() {
        // Implements flying
    }
}

class Lion extends Animal {
    public function move() {
        // Implements running
    }
}

Code: Select all

class Test {
    public function move(Animal $animal) {
        $animal->move();
    }
}

$snake = new Snake();
$eagle = new Eagle();
$lion = new Lion();

$test = new Test();

$test->move($snake);
$test->move($eagle);
$test->move($lion);
Това е цялата история с полиморфизма. :D

Или още по-прост пример от реалния живот: Когато караш кола, за да спреш - натискаш педала за спирачката. Имплементации на спирачките има колкото искаш... при по-старите коли имаш барабани, при по-новите дискове. Към спирачките има различни технологии - ABS и други системи за сигурност според марката и модела. Това, което ти знаеш със сигурност е, че когато натиснеш спирачката, колата ще спре.
Това е полиморфизъм в реалния живот. :)[/code]

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3260
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 126

Post by dakata__92 » Wed Mar 08, 2017 3:20 pm

С изучаването на шаблоните за дизайн, ще му стане доста по ясна концепцията на ООП. Ще се сблъска с доста интересни противоречия и решения на проблеми. :?:

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 861
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Wed Mar 08, 2017 4:08 pm

Рано му е да се сблъсква с шаблоните, ако още не е разбрал основните принципи. Някои шаблони са сложни и само ще го объркат.
Моя съвет е да не бърза с тях.

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3260
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 126

Post by dakata__92 » Wed Mar 08, 2017 4:24 pm

Revelation wrote:Рано му е да се сблъсква с шаблоните, ако още не е разбрал основните принципи. Някои шаблони са сложни и само ще го объркат.
Моя съвет е да не бърза с тях.
То и да не бърза те са доста често добри примери за начинаещи. Примерно Сингълтон доста добре разяснява работата при създаване на инстанции и това как всяка инстанция работи. Ако се ползва дизайна какъв проблем решава и така нататък. Фактори също е добър дизайн за обучение, но наистина първо са нужни часове писане на примери и схващане на различни идеи. Просто се иска практика. :?:

Post Reply