Тема: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Прихований текст

http://не-дійсний-домен/pictures_06/object-oriented-cartoon.png

Привіт всім!
А є взагалі програмерська сповідальня? :)
Щось на зразок, отче Native_Real_Class загубився я в шляхах програмних, вкажи шлях коду вірний, та розуміння логіки абстрактне  :) , хе-х жартую..

Так от до чого я, Якось так сталось що зацепився я за таке поняття, як "Обєктно-Орієнтовне Програмування." так як про нього нічого не знаю. Кручу його і так і сяк, щось не можу второпати чито його більше варто крутити, чим більше розжовуєш, то більше повинен розкривається смак :)

та ще й сьогоднішні вимоги до кодера "Good object-oriented design (OOD) skills" це теж саме, ні?

Взагалі то моя позиція була щодо програмування, ось ця штука виконує ось таку операцію та й все. Ніби позиція з чорним ящиком, ось тут значення віддав, а ось на виході отримав. Легкий підхід в програмуванні.
Ну наприклад,  функція mysqli_data_seek() встановлює результуючу вибірку даних на вказаний рядок даних, все працює ніби й зрозуміло, більше нічого не потрібно, потрібно там 9-ий рядок даних, будь ласка отримуй.

Можливо дещо смішно, Але якось що це за значок такий -> а ось тут :: ? :) :)
І виходить що є таке поняття як Обєкт, так звісно чув, обєкт та й обєкт, ладно, але ж все ж думаю дай ще раз перегляну що Інтернет каже "-що таке обєкт"
знайшов ось таке от визначення

Об'єкти - тип даних, що прийшов з об'єктно-орієнтованого програмування (ООП).

скажімо легко знаю що таке integer, string, boolen,- цифра, символи стрічка, значення так/ні;
що ж до обєкту? - теж тип даних, складний тип даних, гаразд, будемо рахувати що це такий тип даних, що описує програмерську сутність...
приклади обєкту: якщо PHP/база даних то маємо... а точно обєкт може бути і "Вася" і до нього можна застосувати наприклад метод ( нове слово в усвідомленні поняття обєкт) обєкту mysqli::real_query (статичні)

ось тут Вася і засипався, так як читаю:

При цьому неможливо створити об'єкт абстрактного класу, можна тільки визначати нові класи від базового абстрактного класу і створювати об'єкти вже від похідних класів.

що мимоволі визиває посмішку, хто, що , кому, навіщо все це нагородили? Чи всі це знають один лиш я не знаю :) ?

Та ще, А чому назвали "обєктно орієнтовне програмування" як я зрозумів тут спочатку визначається клас, а обєкт існує завдяки визначення класу, тобто клас, як на мене головніший. Назвали б "Класовий Стиль Програмування". А з класів посипалось би обєкт (статичний динамічний, абстрактний), далі витікли б методи/властивості обєкту(видимі/public невидимі/private), конструктори, деструктори і все інше що я ще не дописав


P.S. Та ще ООП основане на : Інкапсуляції;Поліморфізмі;Спадкування. Мг-м, воно точно потрібне для того щоб програмувати?
Чи це просто теорія, і можна було б сказати ООП може бути просто гнукою мовою програмування. і забити на "Інкапсуляції;Поліморфізмі;Спадкування"

З. І. Так що мій вердикт, обєкт ніфіга не тип даних, це взагалі щось із, як кажуть, парадигм програмування...

Маєте свою думку щодо ООП?

Подякували: Дмитро-Чебурашка1

2

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Спочатку б зрозуміти, що таке ООП взагалі, а то чим далі, тим більше мені здається, що ООП у кожного своє.

воно точно потрібне для того щоб програмувати?

Необхідності у всьому цьому точно немає. Але так можна і до машинних кодів дійти, якщо дах не з'їде ще десь по дорозі.

Подякували: Анатолій, leofun012

3

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Що за паніка? Візьміть себе в руки. Почніть з елементарного - хоча би зрозуміти те, що найчастіше Об'єкт у програмуванні - це по суті модель Об'єкту реального світу. Ось спробуйте словами описати об'єкт "Людина" (поки без коду, просто словами). Сам опис об'єкту - це клас. Тобто, коли ви зустрінете негра, то теоретично по опису ви зможете його віднести до класу "Людина", хоч сам цей негр буде якраз об'єктом. Це зрозуміло? А тоді спробуйте "унаслідувати" від "Людини" клас "Програміст". Ну, от спробуйте.

п.с. OOP та OOD - таки різні поняття, але вони й пов'язані між собою.

Подякували: Анатолій, leofun012

4

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Master_Sergius

з таким порівнянням ООП, скажуть якись расизм, а не ООП, а там уже бандерівці і фашисти з хунтою підуть в ассоціацією

5

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Спробую вам пояснити з іншого боку: в будь-якій живій мові є дві групи частин мови: назви і дії. Найпростіший варіант - іменники і дієслова, але ще є прикметники, дієприслівники і т.д., які якимось чином крутяться навколо цих двох частин.
Програмування на першому етапі мало фіксовані іменники (комірки пам'яті) та дієслова (команди процесора). Будь-яку ідею, щоб запрограмувати, треба було розкласти до рівня цих понять (тобто не "Петро дав Галі 2 яблука", а "значення комірки пам'яті, що зберігає кількість яблук Петра, зменшити на 2, а значення комірки пам'яті, що зберігає кількість яблук Галі, збільшити на 2")

SUB PetroAppleCount, 2
ADD HalyaAppleCount, 2

що для людини складно і неприродно.
Наступною ідеєю стали процедури - такі собі дієслова. Можна об'єднати кілька команд в одну логічну сутність (процедуру), яка буде втіленням певної ідеї. Програмування стало легшим: "з комірки пам'яті, що зберігає кількість яблук Петра, передати до комірки пам'яті, що зберігає кількість яблук Галі, 2 яблука".

GiveApples(var PetroAppleCount, var HalyaAppleCount, 2);

Звісно, все ще лишається проблема з іменниками (вони лишаються комірками), але, принаймні, ми вже не зможемо випадково відняти у Петра 2 яблука і додати Галі 4 - бо число 2 фігурує тут тільки 1 раз.
Звісно, питання, як бути з іменниками, лишалося. Виникли АТД - структури: можна зібрати кілька комірок (чи хоча б одну) і пояснити компілятору, що це не просто комірка, а щось інше, наприклад, кількість яблук. Тепер вже можна "передати з яблук Петра до яблук Галі 2 яблука"

GiveApples(Petro, Halya, 2);

що значно простіше для сприйняття, і не можна буде випадково передати петрові яблука до галиних груш.
Тут з'являються такі речі, як інкапсуляція і успадкування.
Має сенс запхати всі функції кудись ближче до об'єктів, щоб не переплутати, яку саме функцію ми застосовуємо, і заборонити доступ до даних (комірок пам'яті):

Petro.GiveApples(Halya, 2);//GiveApples - метод, що належить до типу Human, а Petro - змінна цього типу
Petro.AppleCount = Petro.AppleCount + 2;//помилка! немає доступу до даних!

- це інкапсуляція.
Успадкування дозволяє писати один раз функцію (чи давати опис даних) для кількох різних типів даних. Наприклад, якщо Галя вміє готувати пиріг з яблук, а Петро - ні, то можна зробити щось таке:

class Human//проголошення типу Human
{
  GiveApples( target, count ); //метод, що належить цьому типу
  //якісь ще дані і методи
}
class Cook extends Human//проголошення типу Cook - нащадка Human
{
  MakePie();//метод "приготувати пиріг"
  //якісь ще дані і методи
}
Human Petro;//Петро - просто людина
Cook Halya;//Галя - кухар
Petro.GiveApples(Halya,4);
Halya.GiveApples(Petro,2);//все добре, кухарі вмію робити все, що вміють і прості люди
Halya.MakePie();//працює!
Petro.MakePie();//помилка: прості люди не вміють готувати пироги

Ну і остання деталь, яка і робить ООП ООП - це поліморфізм. Нащадки можуть перевизначати методи предків, а програма під час виконання з'ясує, хто що і як робить. Наприклад, припустимо, що кухар перед тим, як комусь передати яблука, записує це до кухарського журналу. Тоді можна робити так:

function GiveBack( Human giver, Human taker )
{
  giver.GiveApples(taker,2);
  taker.GiveApples(giver,2);
}
Human Petro;
Cook Halya;
GiveBack( Petro, Halya );//Галя запише в журнал, що віддала 2 яблука Петрові, хоча програміст, що писав функцію GiveBack, міг взагалі не знати, що існує тип Cook

Що ж до OOD - то тут треба, окрім загального знання ООП, ще мати певний досвід розробки ООП-додатків і знати патерни. Невдалий вибір того, в якого саме об'єкта знаходиться метод, може дуже сильно попсувати нерви в майбутньому.

6

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Почніть з елементарного - хоча би зрозуміти те, що найчастіше Об'єкт у програмуванні - це по суті модель Об'єкту реального світу.

Мені ніколи не подобалось таке пояснення, бо воно нічого насправді не пояснює. Об'єкт у програмуванні — це просто структура даних, до якої прив'язано певний набір функцій, що з цими даними працюють. Ну а далі цю структуру можна використовувати для моделювання реальних об'єктів (до речі, доволі рідкісне застосування), для організації візуального інтерфейсу, для маніпуляції з якимись внутрішніми даними і т.д.

Подякували: leofun011

7

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

для мене  Об'єкт це виділення пам'яті в кучі з своїм пасьянсом і пошуком дівчат

Подякували: Анатолій1

8 Востаннє редагувалося volodimirg (24.02.2016 15:27:30)

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

:) Коли був студентом, то мені здавалось, що ті хто придумав ООП чокнуті, адже із функціями усе зрозуміло, а з об'єктами чорт голову зломить. Зараз навпаки дума, це був би жах розбирати сучасні програми, якщо б вони не були написані в ОО стилі. Якщо справді хочеться зрозуміти треба взяти якусь книжку по програмуванню і все спробувати на практиці, інакше ніяк. А читання всяких опусів про ООП лишень забиває мозок:).

Щодо назви об'єктне чи класове програмування:) Якщо подумати то описуємо ми клас об'єктів, а ось основна робота спрямована на маніпулювання об'єктами, а не класами. Бо клас один, а об'єктів на його основі може бути і тисяча. Якщо ми маємо клас солдат, то на його основі можемо створити 10 солдатів (10 об'єктів) і кожному задати якусь свою роботу і наділити його своїми харектеристиками. Один об'єкт класу солдат може мати червону форму, інший об'єкт може мати синю форму. Тобто управління іде об'єктами:)

Подякували: koala, fed_lviv, Анатолій, leofun014

9

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Будинок - ваш обєкт. Вхідні параметри - люди, що в нього заходять. Методи - предмети будинку. Люди впливають на предмети. Люди, предмети будинку можуть бути видими/доступними або невидимими/недоступними для світу. Заховавши предмети, властивості будинку від вільного доступу іншим людям та від взаємодії їх з іншими предметами, нам простіше все впорядкувати в світі (програмі) :)

Подякували: Анатолій1

10 Востаннє редагувалося Vo_Vik (24.02.2016 15:49:14)

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Та ви вже знаєте трохи ООП, той же згаданий вами mysqli. Це клас. Ви створюєте об’єкт цього класу коли підключаєтесь до бази даних. Далі методами цього класу конвертуєте дані з бази даних в масиви даних PHP.

хіба це для вас складно?

якщо ні, то спробуйте створити дочірній клас з класу mysqli  додавши якусь свою фунцію, яка би наприклад робила insert і як результат повертала кількість вставлених рядків.

11 Востаннє редагувалося fed_lviv (24.02.2016 15:49:33)

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Ну, якщо так лякають:

...ООП основане на : Інкапсуляції;Поліморфізмі;Спадкування...

То можна, для початку: "Объектно-ориентированный анализ и проектирование" - Бретт Маклафлин

12

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Погоджуся з koala: чим складнішою стає програма, тим більше доводиться вживати усіляких трюків, щоб вона залишалася зрозумілою іще комусь окрім творця. Щоб це усвідомити, треба самому спробувати написати щось достатньо складне. Читати, що таке ООП, можна довго, але розуміння, навіщо воно треба, прийде лише коли спробуєш його в дії. З часом приходиш до того, що уся складність береться з надмірної кількості зв'язків між окремими частинами програми. Починаєш думати, як би ці частини максимально розділити. Отут і треба починати читати про патерни та OOD.

Подякували: koala, leofun012

13

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

а чим пояснюється що на ООП немає до цієї пори ядра, була спроба ядро віндовс на С++ з ООП написати і кинули, ядро там на процедурному способі, а юзер оболонка з ООП

14

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Torbins написав:

Читати, що таке ООП, можна довго, але розуміння, навіщо воно треба, прийде лише коли спробуєш його в дії.

Погоджуюсь, з поправкою, що це стосується всього, а не тільки ООП чи програмування взагалі. Практика - це найкраща штукенсія, щоб щось зрозуміти.

15 Востаннє редагувалося volodimirg (24.02.2016 16:35:33)

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

reverse2500 написав:

а чим пояснюється що на ООП немає до цієї пори ядра, була спроба ядро віндовс на С++ з ООП написати і кинули, ядро там на процедурному способі, а юзер оболонка з ООП

Може тому, що потрібну всю систему переписати:), а коли є куча напрацювань, то тут уже проблема. Плюс чи будуть тоді програми написані раніше працювати на новій системі. Потрібно додаткову якусь прокладку писати для того щоб можна було викликати старі WindowsAPI. Адже тут вже не задача модернізації віндовз, а по суті нову систему з нуля потрібно зробити. Також хоч не хоч а система змушена працювати на найнижчому рівні напряму з апаратним забезпеченням...

P.S. По суті ООП система - це вже мабуть буде якась віртуальна машина на зразок JVM, адже для кожного фізичного елемента потрібне відповідне об'єктне відображення...

16

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

всі говорять що ООП написати не проблема, проблема буде з помилками і їх правкою, всі так і пишуть "хочете з економити собі час, менше пишіть на ООП", будете швидше виправляти помилки

17 Востаннє редагувалося Анатолій (24.02.2016 16:53:42)

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

fed_lviv написав:
Torbins написав:

Читати, що таке ООП, можна довго, але розуміння, навіщо воно треба, прийде лише коли спробуєш його в дії.

Погоджуюсь, з поправкою, що це стосується всього, а не тільки ООП чи програмування взагалі. Практика - це найкраща штукенсія, щоб щось зрозуміти.


Щож панове всім дякую за розяснення, як завжди практика буде доброю панацеєю.
я ледь на грані утримував пояснення пана Коали, майже розумію що він він хоче сказати,
значить практика,
реалізую декілька паттернів класів обєктів та спробую Щоб Петро скуштував яблук Галі :)

розбирати Петю потрошки, по одному якомусь основному поняттю в день,
зараз в мене не виходить усвідомити зручність ООП

http://не-дійсний-домен/pictures_06/oop_its_easy.jpg

18

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

reverse2500 написав:

а чим пояснюється що на ООП немає до цієї пори ядра, була спроба ядро віндовс на С++ з ООП написати і кинули, ядро там на процедурному способі, а юзер оболонка з ООП

https://en.wikipedia.org/wiki/Object-or … ing_system
Мало?

Подякували: leofun011

19

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

зараз в мене не виходить усвідомити зручність ООП

ну для прикладу в процедурному створив функцію, потрібно схожу функцію з додатковими перемінними, сворюй ще одну функцію, в ООП це вирішує (extends) розширення.
Як вже писали ООП добре для великих програм, бо не просто робились всі ці інкапсуляції, поліморфізм

20

Re: Обєктно Орієнтовне програмування. Його взагалі можна зрозуміти?

Анатолій
Патерни вам мабуть іще рано. Спробуйте спочатку найпростіші об'єкти, але щоб загалом програма була достатньо складною. А потім спробуйте зробити те саме на функціях.

Подякували: leofun011