Глава 3: Какво е обектно-ориентирано програмиране?

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

Обект е образувание, което притежава както състояние (или свойства или атрибути), така и поведение. Казано по друг начин, обектът капсулира данните и функциите, които работят върху тези данни. Данните обикновено са скрити от други обекти, така че единственият начин да се повлияе на данните е чрез функциите (или методите) на обекта.

Пример за предмет е кола. Автомобилът има атрибути (например цвят, размер, тегло, капацитет на гориво, брой пътници и т.н.). Автомобилът има поведение, представено от неговите методи (например, стартирайте двигателя, завийте наляво / надясно, ускорете, спрете, включете чистачките и т.н.).

Класът е специален вид обект, който се използва като шаблон за създаване на екземпляри от себе си. Мислете за това като за рязане на бисквитки, който произвежда бисквитки (или обекти).

Класът може да наследи атрибутите и поведението на друг клас (неговия родител) и той може да променя или персонализира това поведение (т.е. неговите методи) за себе си. Това води до концепцията за полиморфизъм. Полиморфизъм означава, че когато обектът получи съобщение, се извиква правилния метод, базиран на класа на обекта. Този метод може да принадлежи на родителя или може да е такъв, който е персонализиран за този клас.

Ето пример за полиморфизъм:

Smalltalk позволява на клас да наследи само от един клас. Някои езици на OOP позволяват на клас да наследи от няколко класа; това е известно като многократно наследяване. Множественото наследяване причинява голяма сложност, поради което се избягва като цяло. Няма да говорим отново за многократно наследяване.

Въпреки че наследяването е важен аспект на OOP, това не е единственият начин за изграждане на програми. Вместо наследяване може да се използва състав или агрегация. Един клас може да включва копия на други класове, без да наследява нищо. Това е взаимоотношение „има“, както в: Клас A има член от клас B като член. Ако сте използвали наследяване, тогава клас B би бил вид обект от клас А; това е връзка „е вид“. Нека илюстрираме това с примери ...

Автомобилът е вид моторизирано превозно средство (клас родител). Така е и с мотоциклет. Така е и с моторна лодка. Така е и самолет. Всяко от тях може да наследи атрибутите и поведението на моторно превозно средство. Но те също могат да персонализират атрибутите и методите на родителския клас за себе си.

Колата има други предмети или класове като част от себе си, като двигател, джанти, волан и др. Тя не наследява нищо от тези класове.

Синтактично атрибутите на обект (данните на обекта) са представени от променливи инстанции. Обикновено ще създадете методи „getter“ (получаване на стойността на променлива на екземпляр) и „setter“ методи (задайте или модифицирайте стойността на променлива на инстанция) за тях, тъй като променливите на екземпляра са скрити от външния свят.

Във Pharo, променливи от инстанции се създават в дефиницията на клас, например:

Подклас по величина: # Време
   instanceVariableNames: 'секунди nanos'
   classVariableNames: ''
   poolРечници: „ХронологияКонстанти“
   пакет: „Ядро-хронология“

В клас #Time (хешът в #Time обозначава Времето като символ на Smalltalk) има две променливи на инстанция: „секунди“ и „нанос“. Методите на обекта ще работят върху тези променливи, които представляват скритото и вътрешното състояние на обекта.

Между другото, класът #Time произлиза или наследява от клас #Magnitude. Като алтернатива можете да кажете клас "Magnitude" "подкласове" клас час. Това е типично говорене на Smalltalk.

Обект наподобява конвенционалната модулна концепция, която се използва в по-прости езици за процедурно програмиране като C и Pascal. Модулът съдържа структура на данни и функциите, които работят върху структурата. Данните обаче не са скрити; всеки може да получи достъп до данните. Най-важното е, че модулите не могат да наследят от други модули.

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

Значи това е. Това е вашето въведение в обектно-ориентираното програмиране. Ако искате да изучите този интересен предмет в по-голяма дълбочина, има богатство книги и материали, посветени на OOP и Smalltalk, например:

  • Малък разговор по пример, от Алек Шарп
  • Smalltalk, предмети и дизайн, от Chamond Liu
  • Pharo by Example, от Stéphane Ducasse, Dimitris Chloupis, Nicolai Hess, Dmitri Zagidulin