Объясняем объекты
vk f t

Объясняем объекты

Глав­ное поня­тие совре­мен­ных под­хо­дов к про­грам­ми­ро­ва­нию.

Мы тут посте­пен­но рас­кла­ды­ва­ем по полоч­кам объектно-ориентированное про­грам­ми­ро­ва­ние. В пер­вой части мы гово­ри­ли про спагетти-код и пред­на­зна­че­ние ООП. Даль­ше раз­би­ра­ли клас­сы — то, из чего дела­ют­ся объ­ек­ты. Теперь, наконец-то, сами объ­ек­ты.

На примере Айфона

Вот лабо­ра­то­рия, кон­струк­тор­ское бюро. Там у нас сидят дизай­не­ры, инже­не­ры и про­грам­ми­сты. Они сде­ла­ли чер­те­жи и инструк­ции, как соби­рать новые Айфо­ны. Если все эти инструк­ции собрать, их сово­куп­ность мож­но назвать клас­сом. Это такая «идея Айфо­на».

Из преды­ду­щей ста­тьи мы зна­ем, что в клас­се мы можем про­пи­сать свой­ства и мето­ды.

Свой­ства — это, гру­бо гово­ря, дан­ные. У Айфо­на может быть «свой­ство» в виде запи­сан­ной на него опе­ра­ци­он­ной систе­мы.
Мето­ды — это, гру­бо гово­ря, «что это устрой­ство может делать». У Айфо­на могут быть «мето­ды» типа позво­нить, отпра­вить смс, запу­стить каме­ру, сде­лать сни­мок.

Всё это мно­же­ство свойств и мето­дов состав­ля­ет общий класс, кото­рый мы потом исполь­зу­ем для созда­ния наше­го вооб­ра­жа­е­мо­го Айфо­на.

Когда про­пи­сан класс, завод может взять его (то есть все эти чер­те­жи и спе­ци­фи­ка­ции) и сде­лать мно­го копий айфо­нов. Каж­дый теле­фон, кото­рый выхо­дит с заво­да, име­ет чёт­ко про­пи­сан­ные харак­те­ри­сти­ки: раз­мер памя­ти, диа­го­наль экра­на, цвет кор­пу­са и так далее. Это всё было зара­нее про­ду­ма­но и запи­са­но в инструк­ци­ях по изго­тов­ле­нию. При этом все теле­фо­ны полу­ча­ют­ся одно­вре­мен­но оди­на­ко­вые и раз­ные.

Оди­на­ко­вые: все теле­фо­ны одной моде­ли не отли­ча­ют­ся почти ничем. У них оди­на­ко­вое желе­зо, харак­те­ри­сти­ки и воз­мож­но­сти. Если взять с кон­вей­е­ра два слу­чай­ных теле­фо­на, меж­ду ними не будет ника­кой раз­ни­цы. Все они рабо­та­ют оди­на­ко­во — так, как заду­ма­ли про­ек­ти­ров­щи­ки.

Раз­ные: при этом у каж­до­го айфо­на есть уни­каль­ный серий­ный номер и дру­гие уни­каль­ные иден­ти­фи­ка­то­ры. Какие-то моде­ли могут отли­чать­ся цве­том кор­пу­са или иметь слот на 2 сим-карты, как вер­сии для китай­ско­го рын­ка.

После того как айфо­ны выхо­дят с заво­да и попа­да­ют в руки людям, каж­дый теле­фон начи­на­ет напол­нять­ся раз­ны­ми дан­ны­ми: фото, видео, музы­ка, кни­ги и про­грам­мы. При обыч­ном исполь­зо­ва­нии в мире нет двух теле­фо­нов с пол­но­стью оди­на­ко­вы­ми дан­ны­ми внут­ри. Но при этом у всех оди­на­ко­во запус­ка­ет­ся каме­ра, оди­на­ко­вым спо­со­бом меня­ют­ся обои и отправ­ля­ют­ся смс. Это озна­ча­ет, что все свой­ства и мето­ды рабо­ты с дан­ной моде­лью оди­на­ко­вы для всех теле­фо­нов этой моде­ли. Доста­точ­но понять, как рабо­тать с одним, — и вы пони­ма­е­те, как рабо­тать со все­ми точ­но таки­ми же.

Вся эта ана­ло­гия с Айфо­на­ми нуж­на, что­бы понять смысл объ­ек­тов:

Как создаются объекты

В общем виде на JavaScript объ­ект зада­ёт­ся вот такой кон­струк­ци­ей. Пока что она абстракт­ная, про­сто при­мер:

class MyClass {
  prop1 = value1; // свойства класса
  prop2 = value2; // 
  constructor(...) { // команда-конструктор, с её помощью создаются новые объекты
    // содержимое конструктора
  }
  method1(...) {} // методы класса, то, что класс умеет делать, и как с ним работать
  method2(...) {} 
  // ...
}

Теперь сде­ла­ем кон­крет­ный класс, кото­рый отве­ча­ет за теле­фон:

class iPhone{
 constructor(memory,color) { // при создании будем указывать размер встроенной памяти и цвет
    this.memory = memory; // создаём телефон с заданной памятью…
    this.color = color;  // … и с заданным цветом
   whois() { // метод, который выводит информацию о телефоне
    console.log('Память: ' + this.memory + 'Гб. Цвет: ' +  this.color);
  }
    }
}

У нас появи­лась коман­да this, кото­рая отве­ча­ет за свой­ства кон­крет­но­го клас­са. С её помо­щью класс обра­ща­ет­ся внут­ри себя к нуж­ным зна­че­ни­ям. Ещё мы сде­ла­ли метод whois, кото­рый выво­дит зна­че­ние памя­ти и цвет. Каж­дый объ­ект, кото­рый мы созда­дим на осно­ве это­го клас­са, будет уметь это делать — для это­го доста­точ­но напи­сать имя объ­ек­та, поста­вить точ­ку, а потом напи­сать имя мето­да.

Нам оста­лось толь­ко создать новый объ­ект и про­ве­рить, что за дан­ные у него полу­чи­лись внут­ри и как рабо­та­ет метод:

iPhone_object = new iPhone(64,'Black'); // создаём новый объект — айфон с определённой памятью и цветом
iPhone_object.whois(); // проверяем, как работает метод класса в готовом объекте

В дру­гих язы­ках прин­цип созда­ния объ­ек­тов прак­ти­че­ски такой же: дела­ем класс, в нём опи­сы­ва­ем всё, что нуж­но, а потом созда­ём объ­ект на осно­ве это­го клас­са.

Где это использовать

Пред­ставь­те, что вы дела­е­те игру вро­де Арка­но­и­да. Вам нуж­но, что­бы у вас был мячик, плат­фор­ма и какие-то сте­ны, от кото­рых этот мячик отска­ки­ва­ет.

Мож­но про­пи­сать все вза­и­мо­дей­ствия через функ­ции и каж­дую 1/25 секун­ды ана­ли­зи­ро­вать все коор­ди­на­ты и отри­со­вы­вать все состо­я­ния всех пред­ме­тов в игре. У вас будет огром­ный зоо­парк из про­ве­рок, усло­вий и цик­лов, цель кото­рых будет про­сто про­ве­рять коор­ди­на­ты все­го.

А мож­но про­пи­сать три клас­са: мячик, сте­на и плат­фор­ма. В класс «мячик» засу­нуть мето­ды типа «лететь» и «отско­чить». В класс «плат­фор­ма» засу­нуть мето­ды «дви­гать­ся» и, напри­мер, свой­ство «дли­на». А в класс «сте­на» засу­нуть толь­ко свой­ство «поло­же­ние». И на осно­ве этих трёх клас­сов сде­лать нуж­ное коли­че­ство объ­ек­тов: четы­ре сте­ны, один мячик, одну плат­фор­му.

Даль­ше вы даё­те коман­ду «мячик.лететь(в слу­чай­ном направ­ле­нии)» — и вол­шеб­ным обра­зом у вас полу­чит­ся игра. Объ­ек­ты будут жить каж­дый сво­ей жиз­нью по тем зако­нам, кото­рые вы им про­пи­са­ли. И если вам нуж­но будет создать вто­рой мячик, вы про­сто гово­ри­те: «Запу­стить кон­струк­тор мячи­ка».

Пока­жем это на при­ме­ре в одной из сле­ду­ю­щих ста­тей.

Ещё по теме