Ооп что это: Объектно-ориентированное программирование: на пальцах

Содержание

Объектно-ориентированное программирование: на пальцах

Наста­ло вре­мя серьёз­ных тем: сего­дня рас­ска­жем про объектно-ориентированное про­грам­ми­ро­ва­ние, или ООП. Это тема для про­дви­ну­то­го уров­ня раз­ра­бот­ки, и мы хотим, что­бы вы его постигли.

Из это­го тер­ми­на мож­но сде­лать вывод, что ООП — это такой под­ход к про­грам­ми­ро­ва­нию, где на пер­вом месте сто­ят объ­ек­ты. На самом деле там всё немно­го слож­нее, но мы до это­го ещё добе­рём­ся. Для нача­ла пого­во­рим про ООП вооб­ще и раз­бе­рём, с чего оно начинается.

Обычное программирование (процедурное)

Чаще все­го под обыч­ным пони­ма­ют про­це­дур­ное про­грам­ми­ро­ва­ние, в осно­ве кото­ро­го — про­це­ду­ры и функ­ции. Функ­ция — это мини-программа, кото­рая полу­ча­ет на вход какие-то дан­ные, что-то дела­ет внут­ри себя и может отда­вать какие-то дан­ные в резуль­та­те вычис­ле­ний. Пред­ставь­те, что это такой кон­вей­ер, кото­рый упа­ко­ван в коробочку.

Напри­мер, в интернет-магазине может быть функ­ция «Про­ве­рить email». Она полу­ча­ет на вход какой-то текст, сопо­став­ля­ет со сво­и­ми пра­ви­ла­ми и выда­ёт ответ: это пра­виль­ный элек­трон­ный адрес или нет. Если пра­виль­ный, то true, если нет — то false.

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

Что не так с процедурным программированием

Про­це­дур­ное про­грам­ми­ро­ва­ние иде­аль­но рабо­та­ет в про­стых про­грам­мах, где все зада­чи мож­но решить, гру­бо гово­ря, десят­ком функ­ций. Функ­ции акку­рат­но вло­же­ны друг в дру­га, вза­и­мо­дей­ству­ют друг с дру­гом, мож­но пере­дать дан­ные из одной функ­ции в другую.

Напри­мер, вы пише­те функ­цию «Заре­ги­стри­ро­вать поль­зо­ва­те­ля интернет-магазина». Внут­ри неё вам нуж­но про­ве­рить его элек­трон­ный адрес. Вы вызы­ва­е­те функ­цию «Про­ве­рить email» внут­ри функ­ции «Заре­ги­стри­ро­вать поль­зо­ва­те­ля», и в зави­си­мо­сти от отве­та функ­ции вы либо реги­стри­ру­е­те поль­зо­ва­те­ля, либо выво­ди­те ошиб­ку. И у вас эта функ­ция встре­ча­ет­ся ещё в деся­ти местах. Функ­ции как бы переплетены.

Тут при­хо­дит продакт-менеджер и гово­рит: «Хочу, что­бы поль­зо­ва­тель точ­но знал, в чём ошиб­ка при вво­де элек­трон­но­го адре­са». Теперь вам нуж­но научить функ­цию выда­вать не про­сто true — false, а ещё и код ошиб­ки: напри­мер, если в адре­се опе­чат­ка, то код 01, если адрес спа­мер­ский — код 02 и так далее. Это неслож­но реализовать.

Вы зале­за­е­те внутрь этой функ­ции и меня­е­те её пове­де­ние: теперь она вме­сто true — false выда­ёт код ошиб­ки, а если ошиб­ки нет — пишет «ОК».

И тут ваш код лома­ет­ся: все десять мест, кото­рые ожи­да­ли от про­ве­ряль­щи­ка true или false, теперь полу­ча­ют «ОК» и из-за это­го ломаются.

Теперь вам нужно:

  • либо пере­пи­сы­вать все функ­ции, что­бы научить их пони­мать новые отве­ты про­ве­ряль­щи­ка адресов;
  • либо пере­де­лать сам про­ве­ряль­щик адре­сов, что­бы он остал­ся сов­ме­сти­мым со ста­ры­ми места­ми, но в нуж­ном вам месте как-то ещё выда­вал коды ошибок;
  • либо напи­сать новый про­ве­ряль­щик, кото­рый выда­ёт коды оши­бок, а в ста­рых местах исполь­зо­вать ста­рый проверяльщик.

Зада­ча, конеч­но, реша­е­мая за час-другой.

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

Это назы­ва­ет­ся спагетти-код, и для борь­бы с ним как раз при­ду­ма­ли объектно-ориентированное программирование.

Объектно-ориентированное программирование

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

Объ­ект — это не какая-то кос­ми­че­ская сущ­ность. Это все­го лишь набор дан­ных и функ­ций — таких же, как в тра­ди­ци­он­ном функ­ци­о­наль­ном про­грам­ми­ро­ва­нии. Мож­но пред­ста­вить, что про­сто взя­ли кусок про­грам­мы и поло­жи­ли его в короб­ку и закры­ли крыш­ку. Вот эта короб­ка с крыш­ка­ми — это объект.

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

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

Объ­ек­ты харак­те­ри­зу­ют­ся четырь­мя сло­ва­ми: инкап­су­ля­ция, абстрак­ция, насле­до­ва­ние и поли­мор­физм. Если инте­рес­но, что это такое, при­гла­ша­ем в кат:

Инкап­су­ля­ция — объ­ект неза­ви­сим: каж­дый объ­ект устро­ен так, что нуж­ные для него дан­ные живут внут­ри это­го объ­ек­та, а не где-то сна­ру­жи в про­грам­ме. Напри­мер, если у меня есть объ­ект «Поль­зо­ва­тель», то у меня в нём будут все дан­ные о поль­зо­ва­те­ле: и имя, и адрес, и всё осталь­ное. И в нём же будут мето­ды «Про­ве­рить адрес» или «Под­пи­сать на рассылку».

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

В про­грам­ме мы можем ска­зать: «Уда­лить поль­зо­ва­те­ля». На язы­ке ООП это будет «пользователь.удалить()» — то есть мы обра­ща­ем­ся к объ­ек­ту «поль­зо­ва­тель» и вызы­ва­ем метод «уда­лить». Кайф в том, что нам не так важ­но, как имен­но будет про­ис­хо­дить уда­ле­ние: ООП поз­во­ля­ет нам не думать об этом в момент обращения.

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

Насле­до­ва­ние — спо­соб­ность к копи­ро­ва­нию. ООП поз­во­ля­ет созда­вать мно­го объ­ек­тов по обра­зу и подо­бию дру­го­го объ­ек­та. Это поз­во­ля­ет не копи­па­стить код по две­сти раз, а один раз нор­маль­но напи­сать и потом мно­го раз использовать.

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

На осно­ве это­го иде­аль­но­го поль­зо­ва­те­ля вы може­те создать реаль­но­го «Поку­па­те­ля Ива­на». У него при созда­нии будут все свой­ства и мето­ды, кото­рые вы зада­ли у иде­аль­но­го поку­па­те­ля, плюс могут быть какие-то свои, если захотите.

Иде­аль­ные объ­ек­ты про­грам­ми­сты назы­ва­ют классами.

Поли­мор­физм — еди­ный язык обще­ния. В ООП важ­но, что­бы все объ­ек­ты обща­лись друг с дру­гом на понят­ном им язы­ке. И если у раз­ных объ­ек­тов есть метод «Уда­лить», то он дол­жен делать имен­но это и писать­ся вез­де оди­на­ко­во. Нель­зя, что­бы у одно­го объ­ек­та это было «Уда­лить», а у дру­го­го «Сте­реть».

При этом внут­ри объ­ек­та мето­ды могут быть реа­ли­зо­ва­ны по-разному. Напри­мер, уда­лить товар — это выдать пре­ду­пре­жде­ние, а потом поме­тить товар в базе дан­ных как уда­лён­ный. А уда­лить поль­зо­ва­те­ля — это отме­нить его покуп­ки, отпи­сать от рас­сыл­ки и заар­хи­ви­ро­вать исто­рию его поку­пок. Собы­тия раз­ные, но для про­грам­ми­ста это неваж­но. У него про­сто есть метод «Уда­лить()», и он ему доверяет.

Такой под­ход поз­во­ля­ет про­грам­ми­ро­вать каж­дый модуль неза­ви­си­мо от осталь­ных. Глав­ное — зара­нее про­ду­мать, как моду­ли будут общать­ся друг с дру­гом и по каким пра­ви­лам. При таком под­хо­де вы може­те улуч­шить рабо­ту одно­го моду­ля, не затра­ги­вая осталь­ные — для всей про­грам­мы неваж­но, что внут­ри каж­до­го бло­ка, если пра­ви­ла рабо­ты с ним оста­лись прежними.

Плюсы и минусы ООП

У объектно-ориентированного про­грам­ми­ро­ва­ния мно­го плю­сов, и имен­но поэто­му этот под­ход исполь­зу­ет боль­шин­ство совре­мен­ных программистов.

  1. Визу­аль­но код ста­но­вит­ся про­ще, и его лег­че читать. Когда всё раз­би­то на объ­ек­ты и у них есть понят­ный набор пра­вил, мож­но сра­зу понять, за что отве­ча­ет каж­дый объ­ект и из чего он состоит.
  2. Мень­ше оди­на­ко­во­го кода. Если в обыч­ном про­грам­ми­ро­ва­нии одна функ­ция счи­та­ет повто­ря­ю­щи­е­ся сим­во­лы в одно­мер­ном мас­си­ве, а дру­гая — в дву­мер­ном, то у них боль­шая часть кода будет оди­на­ко­вой. В ООП это реша­ет­ся наследованием.
  3. Слож­ные про­грам­мы пишут­ся про­ще. Каж­дую боль­шую про­грам­му мож­но раз­ло­жить на несколь­ко бло­ков, сде­лать им мини­маль­ное напол­не­ние, а потом раз за разом подроб­но напол­нить каж­дый блок.
  4. Уве­ли­чи­ва­ет­ся ско­рость напи­са­ния. На стар­те мож­но быст­ро создать нуж­ные ком­по­нен­ты внут­ри про­грам­мы, что­бы полу­чить мини­маль­но рабо­та­ю­щий прототип.

А теперь про минусы:

  1. Слож­но понять и начать рабо­тать. Под­ход ООП намно­го слож­нее обыч­но­го про­це­дур­но­го про­грам­ми­ро­ва­ния — нуж­но знать мно­го тео­рии, преж­де чем будет напи­са­на хоть одна строч­ка кода.
  2. Тре­бу­ет боль­ше памя­ти. Объ­ек­ты в ООП состо­ят из дан­ных, интер­фей­сов, мето­дов и мно­го дру­го­го, а это зани­ма­ет намно­го боль­ше памя­ти, чем про­стая переменная.
  3. Ино­гда про­из­во­ди­тель­ность кода будет ниже. Из-за осо­бен­но­стей под­хо­да часть вещей может быть реа­ли­зо­ва­на слож­нее, чем мог­ла бы быть. Поэто­му быва­ет такое, что ООП-программа рабо­та­ет мед­лен­нее, чем про­це­дур­ная (хотя с совре­мен­ны­ми мощ­но­стя­ми про­цес­со­ров это мало кого волнует).

Что дальше

Впе­ре­ди нас ждёт раз­го­вор о клас­сах, объ­ек­тах и всём осталь­ном важ­ном в ООП. Кре­пи­тесь, будет интересно!

ООП — что это такое? Расшифровка, определение, перевод

ООП чаще всего расшифровывается как «Объектно Ориентированное Программирование». Это самая модная и эффективная парадигма составления современных, гибких и понятных компьютерных программ.

Согласно модели ООП, Вселенная представляет из себя набор объектов, каждый из которых обладает определёнными свойствами и может совершать определённые действия.

Свойства объектов прописываются в виде атрибутов — переменных, принимающих те или иные значения. Действия прописываются в виде методов — функций, наделяющих объекты способностью совершать те или иные компьютерные мини-программы. Ещё одним важным элементом ООП является «наследование» объектов, позволяющее, к примеру, создать из объекта «человек» новый объект — «студент» или «программист». Наследование бывает многоступенчатым, поэтому «студент-химик» наследует «студента», наследующего в свою очередь «человека».




Вы узнали, откуда произошло слово ООП, его объяснение простыми словами, перевод, происхождение и смысл.
Пожалуйста, поделитесь ссылкой «Что такое ООП?» с друзьями:

И не забудьте подписаться на самый интересный паблик ВКонтакте!

 

ООП чаще всего расшифровывается как «Объектно Ориентированное Программирование». Это самая модная и эффективная парадигма составления современных, гибких и понятных компьютерных программ.

Согласно модели ООП, Вселенная представляет из себя набор объектов, каждый из которых обладает определёнными свойствами и может совершать определённые действия.

Свойства объектов прописываются в виде атрибутов — переменных, принимающих те или иные значения. Действия прописываются в виде методов — функций, наделяющих объекты способностью совершать те или иные компьютерные мини-программы. Ещё одним важным элементом ООП является «наследование» объектов, позволяющее, к примеру, создать из объекта «человек» новый объект — «студент» или «программист». Наследование бывает многоступенчатым, поэтому «студент-химик» наследует «студента», наследующего в свою очередь «человека».

ООП в JavaScript | Frontend Stuff

Когда речь идет об объектно-ориентированном программировании — подразумевается моделирование реальных объектов и отношений.

В ООП объект представляет собой блок, содержащий информацию (состояние / атрибуты) и операции (методы).

Ключевое слово

this

  • this — это объект, свойством которого является функция;
  • this — дает функциям доступ к своему объекту и его свойствам;
  • this — помогает выполнить один и тот же код для нескольких объектов;
  • this — можно рассматривать как кто меня вызвал?; т. е. то, что находится слева от точки. Например, window.a();
  • this — имеет динамическую область, т. е. не важно, где он был написан, важно, где он был вызван.
const obj = {
  name: 'Alex',
  sing() {
    console.log('a this ', this);
    var anotherFunc = function() {
      console.log('b this ', this);
    }
    anotherFunc();
  }
};

obj.sing();


var b = {
  name: 'jay',
  say() {
    console.log('this is ', this);
  }
}
b.say()


var c = {
  name: 'jay',
  say() {
    return function () {
      console.log('this is ', this);
    }
  }
}
c.say()()


var d = {
  name: 'jay',
  say() {
    
    return () => console.log('this is ', this);
  }
}
d.say()()

Стрелочные функции связывают this с лексической областью действия.

const obj = {
  name: 'Alex',
  sing() {
    console.log('a this ', this);
    var anotherFunc = () => {
      console. log('b this ', this);
    }
    anotherFunc();
  }
};

obj.sing();


Прототип

  • Прототип (prototype) — это экземпляр рабочего объекта. Объекты наследуются напрямую от других объектов.
  • __proto__ является ссылкой на свойство прототипа родительского объекта, например:
const obj = {};
obj.__proto__ === Object.prototype 
  • Свойство prototype принадлежит только функциям, в частности, функциям конструктора. Конструктор Object создает обертку объекта.
  • Свойства proto и prototype используются для создания цепочки наследования свойств между объектами, начиная с Object и Primitive Types.
  • Object.create() можно использовать для создания объектов с его свойством proto, связанным со свойством prototype объекта, переданного в качестве аргумента Object. create().
  • Object — это базовая функция (конструктор). Корнем всего в JavaScript является Object, который на самом деле является функцией.

Object имеет свойство prototype, которое является базовым объектом для всех вещей в JavaScript, включая функции JavaScript.

ES6 Классы

  • Ключевое слово class в JS — синтаксический сахар. Под капотом он всё еще использует прототипное наследование (prototypal inheritance).
  • Экземпляры класса должны создаваться с ключевым словом new.
  • Метод constructor используется для создания экземпляра state (данных) нового объекта. State обычно уникально для каждого экземпляра.
  • Функции обычно не включаются в конструктор, так как они создают ссылку на место в памяти в каждом новом экземпляре класса. Таким образом используя больше памяти, чем необходимо. Включая функции в качестве методов класса, экземпляры класса могут ссылаться на функцию через цепочку прототипов.
  • Прототипное наследование (prototypal inheritance) имеет лучшую эффективность памяти, чем классическое наследование, благодаря тому, что оно разделяет ссылки памяти своих свойств прототипа с теми объектами, которые наследуют от него. В классическом наследовании, экземпляры класса создают новые ссылки на память для каждого унаследованного свойства.

Object.create() vs. Classes

  • Оба Object.create() и class являются способами создания цепочки прототипов.
  • Некоторые люди предпочитают избегать ключевые слова constructor, class и this, чтобы ограничить путаницу из-за this.
  • Другие предпочитают использовать ключевые слова constructor, class и this, возможно, из-за его сходства с другими языками с парадигмой объектно-ориентированного программирования.

Private vs. Public vs. Protected

Во многих объектно-ориентированных языках программирования, которые имеют классы, идея private и public полей действительно важна. В JavaScript этого нет. Ранее, если нужно было сделать поле private, к которому нельзя обращаться из класса, мы добавляли подчеркивание _ перед именем, чтобы другие программисты знали, что это private метод. Но, к сожалению, подчеркивание на самом деле ничего не делает.

В JavaScript есть предложение ECMAScript, которое предназначено для объявлений полей класса.

Это модификаторы доступа, которые помогают нам реализовать Encapsulation (или скрытие информации). Они сообщают компилятору, какие другие классы должны иметь доступ к определенному полю или методу.

Private — только текущий класс будет иметь доступ к полю или методу.
Protected — только текущий класс и подклассы этого класса будут иметь доступ к полю или методу.
Public — любой класс может ссылаться на поле или вызывать метод.

Так как в Javascript таких полей пока нет, для их реализации мы можем использовать TypeScript.

4 принципа ООП

Инкапсуляция

Инкапсуляция включает в себя идею о том, что данные объекта не должны быть напрямую доступны. Нужно вызывать методы вместо прямого доступа к данным. Инкапсуляция позволяет нам скрывать/показывать свойства функций.

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

Инкапсуляция с использованием замыкания
const createCounter = () => {
  
  
  let count = 0;

  return ({
    
    
    
    click: () => count += 1,
    getCount: () => count. toLocaleString()
  });
};

const counter = createCounter();

counter.click();
counter.click();
counter.click();

console.log(counter.getCount()); 

Абстракция

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

Всё программное обеспечение — это абстракция, скрывающая всю тяжелую работу и бездумные детали.

Многие программные процессы повторяются снова и снова. Поэтому, на этапе декомпозиции проблемы, мы удалим дублирование, записывая какой-либо компонент (функцию, модуль, класс и т. Д.), присваивая ему имя (идентификатор) и повторно используя его столько раз, сколько нам нужно.

Процесс декомпозиции — это процесс абстракции. Успешная абстракция подразумевает, что результатом является набор независимо полезных и перекомпонованных компонентов.

Полиморфизм

Полиморфизмом является одним из принципов объектно-ориентированного программирования (ООП). Это помогает проектировать объекты таким образом, чтобы они могли совместно использовать или переопределять любое поведение с конкретными предоставленными объектами.

Само слово означает много форм. Существует много толкований того, что именно оно означает, но идея заключается в способности вызывать один и тот же метод для разных объектов, и при этом каждый объект реагирует по-своему.

Чтобы это произошло полиморфизм использует наследование.

В следующем примере дочерний объект, такой как Coder, переопределяет метод say, вызванный из родительского объекта Human, и возвращает новую строку соответственно. Тогда как другой дочерний объект Men, вместо переопределения метода say, наследует его и отображал родительскую строку.

class Human {
  constructor(name) {
    this.name = name;
  }

  say() {
    return `Hello, my name is ${this.name}, I like travelling`;
  }
}

class Men extends Human {
  constructor(name) {
    super(name)
  }
  
}

class Coder extends Human {
  constructor(name) {
    super(name)
  }

  say() {
    
    return `Hello, my name is ${this.name}, I like coding`;
  }
}

const alex = new Men('Alex');
const leo = new Coder('Leo');

alex.say() 
leo.say() 

Наследование

Наследование — это механизм базирования объекта или class на другом объекте (наследование на основе прототипа) или class (наследование на основе класса). Мы избегаем необходимости переписывать один и тот же код, а также экономим пространство памяти, используя общие методы.

class Human {
  constructor(name) {
    this.name = name;
  }

  sayMyName() {
    return 'Hello, I am ' + this.name;
  }
}

class Men extends Human {
  constructor(name) {
    super(name)
  }
}
class Coder extends Human {
  constructor(name) {
    super(name)
  }
}

const alex = new Men('Alex');
const leo = new Coder('Leo');

alex. sayMyName() 
leo.sayMyName() 
Prototypal Inheritance

Программирование на основе прототипов — это стиль объектно-ориентированного программирования, в котором повторное использование поведения (известное как наследование) выполняется через процесс повторного использования существующих объектов посредством делегирования, которые служат как prototypes. Сторонники программирования на основе прототипов утверждают, что данный стиль поощряет программиста сосредоточиться на поведении некоторого набора примеров и лишь позднее, беспокоиться о классификации этих объектов в архетипические объекты, которые впоследствии используются аналогично классам.

Classical Inheritance

Программирование на основе классов, или же, ориентация на классы, — это стиль объектно-ориентированного программирования (ООП), в котором наследование происходит через определение классов объектов, вместо наследования, которое происходит только через объекты.

Tight Coupling (сильная связанность) относится к волновым эффектам, которые могут произойти с подклассами (дочерние классы), когда вносится изменение в суперкласс (родительский класс).

  • Tight Coupling может привести ко многим непреднамеренным эффектам для подклассов.
  • Tight Coupling может помочь избежать повторений в коде.
  • Хрупкая проблема базового класса является фундаментальной архитектурной проблемой систем объектно-ориентированного программирования, в которых базовые классы (суперклассы) считаются «хрупкими», потому что, казалось бы, безопасные модификации базового класса, когда они наследуются производным классом, могут привести к сбоям в работе производных классов.
  • Проблема гориллы с бананом относится к проблеме наследования слишком много от суперкласса. «Будто тебе нужен банан, а ты получаешь банан в придачу с гориллой в джунглях».
  • Классическое наследование требует превосходного предвидения, чтобы избежать проблем неправильного наследования.

осваивай функциональные языки прямо сейчас

ООП или объектно-ориентированное программирование – парадигма, которую порой позиционируют как решение всех проблем. Так ли это на самом деле?

На практике людям приходится держать в голове сложные абстракции и беспорядочные графики общих объектов, подверженных изменениям. В итоге драгоценное время и интеллектуальный потенциал тратится на обдумывания «абстракций» и «шаблонов проектирования» вместо решения реальных проблем.

Конечная цель разработки софта состоит в написании надёжного кода. Забагованному и ненадёжному коду не помогут никакие концепции. А лучший путь к надёжности кода – простота. Следовательно, главная задача разработчиков – снижение сложности кода.

«Объектно-ориентированные программы предложены как альтернатива правильным…»

– Эдсгер Вибе Дейкстра, один из разработчиков концепции структурного программирования.

Объектно-ориентированное программирование создавалось с одной целью: управление сложностью процедурного кода. Другими словами, оно должно было улучшить организацию кода. Между тем, не существует объективного и открытого доказательства превосходства ООП над чистым процедурным программированием.

Горькая правда состоит в том, что ООП терпит неудачу в единственной поставленной ему задаче. Оно выглядит хорошо на бумаге, где у нас чистые иерархии животных, собак, людей и так далее. Всё это рушится по мере роста сложности приложения. Вместо понижения сложности оно поощряет беспорядочное совместное использование изменяемого состояния и вносит дополнительную сложность с его многочисленными шаблонами проектирования. ООП усложняет рефакторинг и тестирование.

Многие не согласятся, но правда в том, что современное ООП никогда не разрабатывалось правильно. Оно никогда не опиралось на правильные исследовательские институты (в отличие от Haskell/FP). У ООП нет десятилетий строгих научных исследований. Лямбда-исчисления предлагают полную теоретическую основу для функционального программирования. У ООП нет ничего близкого к этому. По большому счёту, ООП «просто случилось».

ООП-код недетерминированный, в отличие от функционального программирования нам не гарантирован одинаковый вывод при одном и том же вводе. В качестве упрощённого примера: 2 + 2 или calculator.Add(2, 2) дают на выходе 4, но иногда могу дать 3, 5 или вообще 1004. Зависимости объекта Calculator могут менять результат вычислений в тонкой, но глубокой манере.

«C++ – ужасный [объектно-ориентированный] язык… Ограничение вашего проекта до C означает, что люди не облажаются с какой-нибудь идиотской «объектной моделью»c&@p.» – Линус Торвальдс, создатель Linux.

Линус Торвальдс известен своей критикой в адрес C++ и ООП. Он прав в ограничении программистов. Чем меньше выбора у программиста, тем гибче становится его код. В цитате выше Линус Торвальдс настоятельно рекомендует использовать хороший фреймворк как базу для кода.

Многим не нравятся знаки ограничения скорости на дороге, но они необходимы для предотвращения несчастных случаев. Хороший фреймворк должен также предотвращать глупые действия.

Хороший фреймворк помогает писать надёжный код. Он должен помогать снижать сложность с помощью:

  1. Модульности и повторного использования.
  2. Правильной изоляции состояний.
  3. Высокого отношения сигнал/шум.

К несчастью, ООП предоставляет разработчикам слишком много инструментов без ограничений. Даже если ООП обещает обратиться к модульности и улучшению повторного использования, ему не удаётся выполнить обещания (далее подробней). ООП-код поощряет использование общих изменяемых состояний, которые снова и снова доказывают свою небезопасность.

Функциональное программирование

Некоторые люди склонны считать функциональное программирование очень сложной парадигмой, которую применяют только в научной среде, и которая непригодна для «реального мира». Конечно, это не так!

Да, функциональное программирование имеет под собой сильное математическое основание и уходит своими корнями в лямбда-исчисления. Но большинство идей возникли в нём, как ответ на слабость мейнстримных языков программирования. Функция – это основная абстракция функционального программирования. При правильном использовании функции дают модульность и повторное использование кода, невиданное в ООП.

Функциональное программирование отлично справляется с задачей написания надёжного софта. Необходимость в дебаггере полностью исчезает. Больше не нужно перемещаться по своему коду и отслеживать переменные.

Наконец, если вы умеете использовать функции, вы уже функциональный программи

Парадигмы программирования: что это такое и в чём различия | GeekBrains

Как новичку разобраться в многообразии подходов

https://d2xzmw6cctk25h. cloudfront.net/post/1106/og_image/9e7d7916e93fd701e8ca8a0163da017c.png

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

Что такое парадигма программирования? Если в двух словах, то это набор принципов и методик по созданию кода. Они нужны, чтобы упорядочить программу и сделать её структурированной, удобной и понятной другим программистам, работающим в той же парадигме. Важно, чтобы и для вычислительной машины программа была ясной, подготовленной к быстрому и точному исполнению. Разберём основные парадигмы программирования.

Объектно-ориентированное программирование

Наиболее распространённая на данный момент парадигма. Это подвид императивного программирования — оно основано на последовательных вызовах команд, изменяющих данные, с которыми работает программа. Таким образом она оперирует объектами, и это удобно для многих приложений.

Новичков зачастую пугает аббревиатура ООП, но освоить парадигму объектно-ориентированного программирования не так сложно, как кажется. В своё время эта идея оказалась вирусной: создавать объекты, принадлежащие классам, а также использовать методы в качестве действий, которые может выполнить объект или которые можно произвести над ним. Много специалистов по Computer Science придерживаются такого подхода. Большое преимущество здесь в том, что программисту, использующему ООП, легко разобраться, что происходит в программе. Достаточно посмотреть, какие действия производит каждый из объектов.

Легче всего использовать ООП в Python, посложнее — в C++. Но если в этих языках у программиста ещё есть возможность увильнуть от ООП (например, для Python вполне подходит функциональное программирование), то в Java и C# всегда необходимо создавать классы, одних функций недостаточно.

Функциональное программирование

По распространённости функциональная парадигма программирования занимает второе место после ООП. Это развитие идей декларативного программирования: программа создаётся как инструмент, который решает определённую задачу и в итоге даёт нужный результат. 

Между последователями разных парадигм, оказавшимися в одной ветке комментариев, всегда разгорается бесконечный холивар с обвинениями в «ООП/ФП головного мозга». Но бывают и программисты, готовые применить любой из подходов в зависимости от проекта.

Наиболее характерный для функционального программирования язык — Haskell. В реальных проектах он применяется редко, но будто создан для красивых решений в духе ФП — поэтому Haskell стал культовым среди профессиональных программистов, предпочитающих эту парадигму.

В ФП код программы состоит из функций, для которых подробно прописано, что должно быть на входе, а что — на выходе. Причём одну функцию вполне можно подать на вход другой в качестве аргумента. Так программа выполняется, запуская нужные функции.

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

Помимо объектно-ориентированного и функционального программирования, есть и другие парадигмы. Некоторые из них уже вытеснены более современными подходами. Но есть и специфические парадигмы, которые нужны для конкретных ситуаций. Расскажем про несколько самых распространённых.

Процедурное программирование

Этот подход — разновидность императивной парадигмы программирования. Процедурами здесь называют команды, которые применяются в определённом порядке и последовательно меняют состояние памяти. После применения всех команд программа выдаёт результат.

Процедурное программирование применяется не только в классических языках вроде C и Pascal, но и в самых современных. Например, в Go, где помимо процедурного подхода можно применить и ООП, но с ограниченной функциональностью.

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

Метапрограммирование

Здесь программа, которую вы создаёте, сама генерирует код новой программы или модифицирует свой. С помощью этого подхода часть задач разработчика можно автоматизировать. А ещё он даёт возможность людям, не владеющим языками программирования, создавать программы с помощью графических интерфейсов или словесных команд на естественном языке — программа преобразует их в обычный код.

Обобщённое программирование

В этой парадигме программист создаёт обобщённые представления для классов и функций. То есть не просто классы, которые могут наследоваться (как в ООП), а шаблоны функций или классов (если применить такой подход в C++). Изначально у них отсутствуют требования типа данных для входных параметров, поэтому шаблоны можно сделать более универсальными.

Преимущество этой парадигмы в том, что можно создавать алгоритмы, которые будут работать с разными типами, и для этого не придётся добавлять реализации для каждого типа отдельно. Такой подход можно совместить как с ООП, так и с другими современными парадигмами программирования.

Логическое программирование

Логическое программирование — это подвид декларативного. Основан на выводе информации из заданных фактов и логических правил, которые к ним можно применить. При выполнении программ используются правила формальной логики.

Возможность применить эту парадигму заложена в языке Prolog — он позволяет вводить предложения в виде фактов и набора правил. Разработку Prolog начали ещё в 1970 году, и целью было понять естественный язык. Логика используется как средство формализовать его семантику. Если располагать фактической информацией о предметной области, можно автоматизировать выдачу информации по схеме «вопрос — ответ».

Хотя подавляющее большинство разработчиков используют объектно-ориентированное или функциональное программирование, эти парадигмы не стали абсолютными монополистами. Не исключено, что с развитием технологий — например, при переносе части вычислительных задач на квантовые компьютеры — актуальной станет какая-то новая, ещё не созданная парадигма.

Если вы хотите ближе познакомиться с разными языками, приглашаем вас на бесплатный вебинар «Основы программирования». На нём вы погрузитесь в основы профессии и определитесь, по какому пути хотите развиваться в мире разработки.

Самоизоляция заканчивается — самое время освоить новую профессию, чтобы начать карьеру мечты и уверенно смотреть в будущее! Мы хотим помочь вам и с 1 по 10 июля 2020 г. дарим скидку 40% почти на все программы обучения GeekBrains. Будьте здоровы и успешны! 🙂

 

Основные понятия ООП — Признаки объектных языков

   Основным же признаком объектных языков можно считать наличие объектов и построение программы на их взаимодействии. Объект становится фундаментальной абстракцией системы, что позволяет реализовать принцип объектной декомпозиции и инкапсуляции. Инкапсуляция заключается теперь в сокрытии не только информации о внутреннем состоянии объекта, но и всех подпрограмм, которые реализуют поведение этого объекта. Взаимодействие между объектами происходит за счет ссылки сообщений. Таким образом, все, что опирается на объекты, относится именно к объектной технологии. Например, иерархия «is-а» и принцип параллелизма.

   ПАРАЛЛЕЛИЗМ — это возможность иметь несколько объектов, которые выполняются одновременно.

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

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

   Как только в систему введен параллелизм, сразу возникает вопрос о том, как синхронизировать отношения активных объектов друг с другом, а также с другими объектами, которые действуют последовательно. Например, если два объекта посылают сообщение третьему, должен быть какой-то механизм, который гарантирует, что объект, на который направлено действие, не зруйнується во время одновременной попытки двух активных объектов изменить его состояние. В этом вопросе соединяются абстракция, инкапсуляция и параллелизм. В параллельных системах недостаточно определить поведение объекта, нужно еще принять меры, которые гарантируют, что он не будет изодран на части несколькими независимыми процессами. Все это привело к созданию таких механизмов как семафоры и критические секции.

   Чем же существенно отличается объектная технология от объектно-ориентированной? Чтобы ответить на этот вопрос приведем определение объектно-ориентированного программирования с точки зрения Градия Буча:
   ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ — это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

   В соответствии с этим определением не все языки программирования являются объектно-ориентированными. Страуструп определил так: «если срок объектно-ориентированный язык вообще что-либо значит, то он должен означать язык, который имеет средства для поддержки объектно-ориентированного стиля программирования. .. Обеспечение такого стиля в свою очередь значит, что в языке удобно пользоваться этим стилем. Если написание программ в стиле объектно-ориентированного программирования требует специальных усилий или оно невозможно совсем, то этот язык не отвечает требованиям объектно-ориентированного программирования». Теоретически возможна имитация объектно-ориентированного программирования на обычных языках, таких, как Pascal и даже CLOS или ассемблер, но это крайне трудно.

   Главное отличие объектной технологии от объектно-ориентированной заключается в наличии механизма наследования, и всех механизмов, которые вытекают из этого. Наследование означает такое отношение между объектами (отношение отец/потомок), когда один объект позаимствует структурную или функциональную часть одного или нескольких других объектов. Использование наследования приводит к появлению таких понятий как класс, иерархия «is-a» и полиморфизм.

   Принцип наследования позволяет упростить выражение абстракций, делает проект менее громоздким и более выразительным за счет того, что для определенных объектов можно выделить какую-то общую часть (структуру или поведение) и не переписывать ее, а занести в какой-то общий фрагмент, который принадлежит ко всем этим объектам. При отсутствии наследования, каждый объект станет самостоятельным блоком, и всегда будет разрабатываться «из нуля». В качестве такого обобщающего фрагменту стал класс, как новая фундаментальная абстракция языка. Структуры классов стали образовывать иерархию «is-a». В наследственной иерархии общая часть структуры и поведения сосредоточена в наиболее общем суперклассе. Суперклассы при этом отбивают наиболее общие, а подклассы — более специализированы абстракции, в которых члены суперкласса могут быть дополнены, модифицированные и даже спрятанные. Без наследования не возможен также принцип полиморфизма, который является найпотужнішим механизмом объектно-ориентированного программирования.

О дружбе значимых типов с ООП

Камрад @ViIvanov в своем блоге поднял интересный вопрос о значимых типах и ООП. По сути, это был развернутый комментарий к моему посту «Пишем простой анализатор с помощью Roslyn», в котором я упомянул, что структуры плохо дружат с ООП. Вячеслав высказал очень разумную мысль, что наследование не является ключевой особенностью ООП, а значит ограничение значимых типов в этой части не должны делать из них граждан второго сорта. Ну что ж, пришло время развернуть мою мысль поглубже.

Начнем с того, чем же для меня является и не является ООП. Мое ИМХО в том, что ООП, как и проектирование в целом, основано на двух китах – абстракции и инкапсуляции (а не только на инкапсуляции, как выразился Вячеслав). Абстракция позволяет выделить существенные аспекты поведения, а инкапсуляция является тем инструментом, который позволяет спрятать ненужные подробности и детали реализации с глаз долой.

Инкапсуляция, которую принято отождествлять с закрытыми полями, является частью более общего принципа сокрытия информации (принципа наименьшего знания), который упрощает создание программных моделей. Любая программная или другая модель является лишь приближением реальности, в которой выделяются важные аспекты и игнорируются второстепенные детали. Этот подход лежит в основе познания мира, поскольку он позволяет хоть как-то справиться нашей жалкой головешке с бесконечным количеством деталей.

Теперь давайте посмотрим, в чем выражается абстракция и инкапсуляция в модных нынче ОО языках, типа C#.

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

Абстракция и инкапсуляция играют ключевую роль в борьбе со сложностью – они позволяют думать о проблемах на более высоком уровне, не вдаваясь во второстепенные детали и менять свои решения в будущем не затрагивая существующих клиентов.

Открытый метод конкретного класса играет не малую роль в борьбе со сложностью, ведь он прячет от своих клиентов детали и сложности реализации. Но иногда клиента нужно отвязать не только от деталей реализации конкретного класса, но и от конкретных классов в целом.

По сути, наследование переводят абстракцию и инкапсуляцию на следующий уровень. Класс Dictionary скрывает подробности реализации хэш-таблицы, а IDictionary скрывает целое семейство возможных реализаций, часть которых могут быть реализованы в виде дерева, а не хэш-таблицы, а многие реализации просто еще не появились на свет. Клиент Dictionary не знает о деталях реализации конкретного класса, а клиент IDictionary даже не знает, с чем конкретно он имеет дело.

Наследование является производным элементом, к тому же, далеко не самым простым и эффективным.

По сути, наследование и полиморфизм обеспечивают дополнительный уровень косвенности и аналогичную слабую связанность (low coupling) можно получить и другими способами: например, с помощью ad-hoc полиморфизма (строготипизированной утиной типизации) или с помощью делегатов.

Теперь, давайте перейдем к структурам и их связи с ООП. Структуры, как известно, обладают двумя ключевыми особенностями (в контексте ООП):

· От них нельзя относледоваться (хотя они могут реализовывать интерфейсы) и

· У них всегда есть конструктор по умолчанию (речь о C# и VB)

ПРИМЕЧАНИЕ
Здесь и далее я использую термин «конструктор по умолчанию» для структур. Говоря формально, default(CustomStruct) или new CustomStruct() не очень-то является конструктором по умолчанию. По сути, это способ создания экземпляра структуры с дефолтными значениями всех его полей. Но, поскольку термин прижился, я буду использовать именно его.

Первая особенность структур действительно несколько ограничивает ООП-шность, поскольку не позволяет использовать код повторно путем наследования и ограничивает полиморфное использование структур только на уровне интерфейсов. Но, поскольку наследование и правда не равно ООП, то с этим как-то можно жить.

Когда я говорю, что структуры плохо дружат с ООП (да, именно это здесь я и пытаюсь показать, если что), я говорю о проблеме конструкторов по умолчанию. Их наличие приводит к необходимости жертвовать инвариантами ваших сущностей. Инвариант структуры может быть либо довольно примитивным и валидным после вызова конструктора по умолчанию, или же он может устанавливаться специализированным конструктором, в надежде, что клиент структуры конструктором по умолчанию пользоваться не будет.

Если конструктор по умолчанию вполне подходит, как, например, для типа DateTime, то все нормально. А если не подходит? Тут, конечно, можно попросить клиента структуры им не пользоваться. Да, это вариант, но для этого клиент нашей структуры должен обладать тайным знанием, что этого делать не нужно. А это, ничто иное, как отсутствие того самого сокрытия информации, которое является ключевой характеристикой ООП.

Определение объектно-ориентированного программирования | PCMag

Структура языка программирования, в которой данные и связанная с ними обработка («методы») определены как автономные сущности, называемые «объектами». Сегодняшняя норма — языки объектно-ориентированного программирования (ООП), такие как C ++ и Java, предоставляют формальный набор правил для создания объектов и управления ими. Данные хранятся в традиционной реляционной базе данных или в объектной базе данных, если данные имеют сложную структуру. См. Отображение O-R и базу данных объектов.

В объектно-ориентированном программировании есть три основные особенности, которые отличает их от языков, отличных от ООП: инкапсуляция, наследование и полиморфизм.

Инкапсуляция обеспечивает модульность
Инкапсуляция означает создание автономных модулей, которые связывают функции обработки с данными. Эти определяемые пользователем типы данных называются «классами», а один экземпляр класса является «объектом». Например, в системе расчета заработной платы классом может быть Manager, а Pat и Jan могут быть двумя экземплярами (двумя объектами) класса Manager.Инкапсуляция обеспечивает хорошую модульность кода, в которой подпрограммы хранятся отдельно и менее подвержены конфликтам друг с другом.

Наследование передает «Знание» вниз
Классы создаются в иерархиях, и наследование позволяет передавать структуру и методы одного класса вниз по иерархии. Это означает, что при добавлении функций в сложные системы требуется меньше программирования. Если шаг добавляется внизу иерархии, необходимо добавить только обработку и данные, связанные с этим уникальным шагом.Все остальное передается по наследству. Возможность повторно использовать существующие объекты считается основным преимуществом объектной технологии.

Полиморфизм принимает любую форму
Объектно-ориентированное программирование позволяет создавать процедуры для объектов, точный тип которых неизвестен до времени выполнения. Например, экранный курсор может менять свою форму со стрелки на линию в зависимости от режима программы. Подпрограмма для перемещения курсора по экрану в ответ на движение мыши будет написана для «курсора», и полиморфизм позволяет этому курсору принимать любую форму, которая требуется во время выполнения.Это также позволяет легко интегрировать новые формы.

Языки ООП
SIMULA, используемый для моделирования поведения системы в конце 1960-х годов, был первым объектно-ориентированным языком. В 1970-х Smalltalk от Xerox был первым объектно-ориентированным языком программирования, который использовался для создания графического пользовательского интерфейса (см. Xerox Star). ACTOR и Eiffel также раньше были языками ООП.

Сегодня популярными объектно-ориентированными языками являются C ++, C #, Java, JavaScript, Visual Basic.NET и Python.Ниже приводится сравнение основных терминов ООП с традиционным программированием. См. Объектно-ориентированную СУБД.

  ООП Традиционное программирование 

 класс определить данные + обработка

 данные объекта + обработка

 данные атрибута (поле)

 функция метода

 вызов функции сообщения

 создать экземпляр создать структуру
 

Реляционное моделирование и моделирование объектов

Вместо отдельных таблиц сотрудников, отделов и должностей класс сотрудников содержит данные и обработку для всех сотрудников.Каждый подкласс (менеджер, секретарь и т. Д.) Имеет свои собственные данные и обработку, но также наследует все от класса сотрудников. Изменения, внесенные в класс сотрудников, влияют на каждый подкласс.

Ruby OOP — Что такое объектно-ориентированное программирование?

Эта глава даст вам общее представление об объектно-ориентированном программировании. Все эти темы будут рассмотрены более подробно в следующих главах.

Объектно-ориентированное программирование , часто называемое ООП , представляет собой парадигму программирования, которая была создана для работы с растущей сложностью больших программных систем.Программисты очень рано обнаружили, что по мере роста сложности и размера приложений их стало очень трудно поддерживать. Одно небольшое изменение в любой точке программы вызовет волновой эффект ошибок из-за зависимостей во всей программе.

Программистам нужен был способ создания контейнеров для данных, которые можно было бы изменять и манипулировать ими, не затрагивая всю программу. Им нужен был способ разделить области кода, выполняющие определенные процедуры, чтобы их программы могли стать взаимодействием множества мелких частей, а не одним массивным блоком зависимости.

Войдите в ООП. Сначала мы познакомимся с терминологией, а затем рассмотрим примеры.

Инкапсуляция скрывает часть функциональности и делает ее недоступной для остальной части кода. Это форма защиты данных, так что данными нельзя манипулировать или изменять без очевидного намерения. Это то, что определяет границы вашего приложения и позволяет вашему коду достичь новых уровней сложности. Ruby, как и многие другие объектно-ориентированные языки, выполняет эту задачу, создавая объекты и предоставляя интерфейсы (т.е., методы) для взаимодействия с этими объектами.

Еще одно преимущество создания объектов состоит в том, что они позволяют программисту мыслить на новом уровне абстракции. Объекты представлены как существительные реального мира и могут иметь методы, описывающие поведение, которое программист пытается представить.

Полиморфизм — это способность различных типов данных реагировать на общий интерфейс. Например, если у нас есть метод, который ожидает объекты аргументов, которые имеют метод move , мы можем передать ему любой тип аргумента, при условии, что он имеет совместимый метод move .Объект может представлять человека, кошку, медузу или, возможно, даже машину или поезд. То есть он позволяет объектам разных типов отвечать на вызов одного и того же метода.

«Поли» означает «много», а «морфинг» означает «формы». ООП дает нам гибкость в использовании предварительно написанного кода для новых целей.

Концепция наследования используется в Ruby, где класс наследует поведение другого класса, называемого суперклассом . Это дает Ruby-программистам возможность определять базовые классы с большой возможностью повторного использования и более мелкие подклассы для более детального и детального поведения.

Другой способ применить полиморфную структуру к программам Ruby — использовать модуль Module . Модули похожи на классы в том, что они содержат общее поведение. Однако вы не можете создать объект с помощью модуля. Модуль должен быть смешан с классом, использующим вызов метода include . Это называется миксином . После смешивания в модуле поведение, объявленное в этом модуле, становится доступным для класса и его объектов.

Мы увидим примеры всех вышеупомянутых терминов в действии в следующих главах.

В сообществе Ruby вы часто слышите фразу: «В Ruby все является объектом!». До сих пор мы избегали этого, поскольку объекты — это более сложная тема, и необходимо разобраться в базовом синтаксисе Ruby, прежде чем вы начнете думать об объектах.

Это даже не совсем правда; не все в Ruby является объектом. Однако все, что может иметь значение , является объектом: он включает числа, строки, массивы и даже классы и модули.Однако есть несколько вещей, которые не являются объектами: выделяются методы, блоки и переменные.

Объекты создаются из классов. Думайте о классах как о формах, а объекты как о вещах, которые вы производите из этих форм. Отдельные объекты будут содержать информацию, отличную от других объектов, но они являются экземплярами одного и того же класса. Вот пример двух объектов класса String :

  irb: 001> "привет" .class
=> Строка
irb: 002> "мир".класс
=> Строка
  

В приведенном выше примере мы используем метод экземпляра class , чтобы определить, что это за класс для каждого объекта. Как видите, все, что мы использовали, от строк до целых чисел, на самом деле является объектами, которые создаются из класса. Мы очень скоро рассмотрим это подробнее.

Ruby определяет атрибуты и поведение своих объектов в классах . Вы можете думать о классах как о базовых схемах того, из чего должен состоять объект и что он должен уметь делать.Для определения класса мы используем синтаксис, аналогичный определению метода. Мы заменяем def на class и используем соглашение об именах CamelCase для создания имени. Затем мы используем зарезервированное слово , конец , чтобы закончить определение. Имена файлов Ruby должны быть в snake_case и отражать имя класса. Таким образом, в приведенном ниже примере имя файла — good_dog.rb , а имя класса — GoodDog .

  класс GoodDog
конец

sparky = GoodDog.new
  

В приведенном выше примере мы создали экземпляр нашего класса GoodDog и сохранили его в переменной sparky .Теперь у нас есть объект. Мы говорим, что Sparky является объектом или экземпляром класса GoodDog . Весь этот рабочий процесс создания нового объекта или экземпляра из класса называется instantiation , поэтому мы также можем сказать, что мы создали экземпляр объекта с именем sparky из класса GoodDog . Вы со временем привыкнете к терминологии ООП, но здесь важно то, что объект возвращается путем вызова метода класса new .Взгляните на рисунок 3, чтобы наглядно представить, что мы делаем.

Как видите, определить и создать новый экземпляр базового класса просто. Но прежде чем мы продолжим и покажем вам, как создавать более сложные классы, давайте кратко поговорим о модулях.

Как мы упоминали ранее, модули — это еще один способ достижения полиморфизма в Ruby. Модуль — это набор поведений, который можно использовать в других классах через миксины . Модуль «подмешивается» к классу с использованием вызова метода include .Допустим, мы хотели, чтобы в нашем классе GoodDog был метод speak , но у нас есть и другие классы, с которыми мы также хотим использовать метод speak. Вот как мы это сделаем.

  модуль Speak
  def говорить (звук)
    ставит звук
  конец
конец

класс GoodDog
  включить Говорить
конец

class HumanBeing
  включить Говорить
конец

sparky = GoodDog.new
sparky.speak ("Арф!") # => Арф!
bob = HumanBeing.new
bob.speak ("Привет!") # => Привет!
  

Обратите внимание, что в приведенном выше примере как объект GoodDog , который мы называем Sparky , так и объект HumanBeing , который мы называем bob , имеют доступ к экземпляру speak . метод.Это возможно за счет «подмешивания» модуля Speak . Это как если бы мы скопировали метод speak в классы GoodDog и HumanBeing .

Когда вы вызываете метод, как Ruby узнает, где искать этот метод? Ruby имеет отдельный путь поиска, по которому он следует при каждом вызове метода. Давайте воспользуемся нашей программой, приведенной выше, чтобы увидеть, каков путь поиска метода для нашего класса GoodDog . Мы можем использовать метод ancestors для любого класса, чтобы найти цепочку поиска метода.

  модуль Говорите
  def говорить (звук)
    помещает "# {звук}"
  конец
конец

класс GoodDog
  включить Говорить
конец

class HumanBeing
  включить Говорить
конец

помещает "--- предки GoodDog ---"
ставит GoodDog.ancestors
ставит ''
помещает "--- Предки человека-существа ---"
помещает HumanBeing.ancestors
  

Результат выглядит так:

  --- Предки GoodDog ---
Хороший пес
Говорить
Объект
Ядро
BasicObject

--- Человеческие предки ---
Человек
Говорить
Объект
Ядро
BasicObject
  

Модуль Speak находится прямо между нашими пользовательскими классами (т.е., GoodDog и HumanBeing ) и класс Object , который поставляется с Ruby. В разделе «Наследование» вы увидите, как работает цепочка поиска методов при работе с миксинами и наследованием классов.

Это означает, что, поскольку метод Speak не определен в классе GoodDog , следующим местом, куда он смотрит, является модуль Speak . Это продолжается в упорядоченном, линейном порядке, пока метод не будет найден, или пока не останется мест, где его можно было бы искать.

Это был очень краткий обзор ООП в Ruby. В следующих парах глав мы углубимся в детали.

Четыре столпа объектно-ориентированного программирования

В этой статье я попытаюсь объяснить четыре основных принципа объектно-ориентированного программирования (ООП). Объектно-ориентированное программирование позволяет программистам думать о разработке программного обеспечения, как если бы они работали с реальными объектами. В повседневной жизни люди обладают знаниями и могут выполнять различные работы / задачи.В ООП объекты имеют поля для хранения знаний / состояния / данных и могут выполнять различные методы.

Прежде чем углубиться в четыре столпа ООП, я хотел бы остановиться на некоторых основных терминологиях.

Объект : экземпляр класса / рабочий объект класса

Класс : это модель или стандарт возможностей того, что объект может делать

Метод: Может изменять состояние класса, которое будет применяться ко всем экземплярам класса

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

Теперь, когда мы рассмотрели эти ключевые слова, давайте перейдем к четырем принципам объектно-ориентированного программирования: инкапсуляция, абстракция, наследование и полиморфизм.

Четыре принципа объектно-ориентированного программирования (ООП):

Инкапсуляция

Инкапсуляция выполняется, когда каждый объект поддерживает частное состояние внутри класса. Другие объекты не могут напрямую обращаться к этому состоянию, вместо этого они могут вызывать только список общедоступных функций.Объект управляет своим собственным состоянием с помощью этих функций, и никакой другой класс не может его изменить, если это явно не разрешено. Чтобы общаться с объектом, вам нужно будет использовать предоставленные методы. Мне нравится думать об инкапсуляции на примере людей и их собак. Если мы хотим применить инкапсуляцию, мы делаем это, инкапсулируя всю «собачью» логику в класс Dog. «Состояние» собаки находится в частных переменных: игривость, голод и энергия, и каждая из этих переменных имеет свои соответствующие поля.

Существует также частный метод: bark (). Класс собак может вызывать это, когда захочет, а другие классы не могут сказать собаке, когда лаять. Существуют также общедоступные методы, такие как sleep (), play () и eat (), которые доступны другим классам. Каждая из этих функций изменяет внутреннее состояние класса Dog и может вызывать bark (), когда это происходит, частное состояние и общедоступные методы связываются.

Абстракция

Абстракция — это расширение инкапсуляции.Это процесс выбора данных из большего пула, чтобы показать объекту только релевантные детали. Предположим, вы хотите создать приложение для знакомств, и вас просят собрать всю информацию о ваших пользователях. Вы можете получить от своего пользователя следующие данные: полное имя, адрес, номер телефона, любимую еду, любимый фильм, хобби, налоговую информацию, номер социального страхования, кредитный рейтинг. Этот объем данных велик, но не все они необходимы для создания профиля знакомств. Вам нужно только выбрать из этого пула информацию, имеющую отношение к вашему приложению для знакомств.Такие данные, как полное имя, любимая еда, любимый фильм и хобби, имеют смысл для приложения для знакомств. Процесс получения / удаления / выбора информации о пользователе из большего пула называется абстракцией. Одним из преимуществ Abstraction является возможность применять ту же информацию, которую вы использовали для приложения знакомств, к другим приложениям с небольшими изменениями или без них.

Наследование

Наследование — это способность одного объекта приобретать некоторые / все свойства другого объекта.Например, ребенок наследует черты своих родителей. При наследовании возможность многократного использования является большим преимуществом. Вы можете повторно использовать поля и методы существующего класса. В Java существуют различные типы наследования: одиночное, множественное, многоуровневое, иерархическое и гибридное. Например, Apple — это фрукт, поэтому предположим, что у нас есть класс Fruit и его подкласс с именем Apple. Наше яблоко приобретает свойства класса Fruit. Другими классификациями могут быть виноград, груша, манго и т. Д. Фрукты определяют класс продуктов, которые представляют собой зрелые завязи растения, мясистые, содержащие большое семя внутри или множество крошечных семян.Подкласс Apple получает эти свойства от Fruit и обладает некоторыми уникальными свойствами, которые отличаются от других подклассов Fruit, таких как красный, круглый, выемчатый наверху.

Полиморфизм

Полиморфизм дает нам возможность использовать класс точно так же, как его родительский, поэтому нет путаницы со смешением типов. При этом каждый дочерний подкласс сохраняет свои собственные функции / методы такими, какие они есть. Если бы у нас был суперкласс Mammal, в котором есть метод mammalSound ().Подклассами млекопитающих могут быть собаки, киты, слоны и лошади. У каждого из них будет своя собственная итерация звука млекопитающего (лай собаки, щелчок кита).

ПОДРОБНЕЕ: Основы между GraphQL и REST API, Прототипирование и исследование UX, Диаграммы сходства и кластеризация, Создание пользовательского пользовательского интерфейса материала: Создание цветовой схемы

классов (ООП) | Блестящая вики по математике и науке

Создание класса

В Python классы объявляются ключевым словом class , за которым следует имя класса.Оператор class определяет новый класс так же, как оператор def определяет новую функцию.

В следующем примере будет определен простой класс, определяющий пользователей Brilliant.

  класс brilliant Пользователь (объект):
  

Метод конструктора

После объявления имени класса программист должен определить метод конструктора . В Python это обозначается __init __ () .Функция __init__ принимает self в качестве первого аргумента, а затем любое количество аргументов по желанию программиста. В этом примере, описывающем блестящих пользователей, программист хочет знать имя, возраст и рейтинг каждого пользователя.

Имя __init __ () используется для «метода конструктора» класса. Хотя класс является планом для нового типа данных, программисту по-прежнему необходимо создавать значения этого типа данных, чтобы иметь что-то, что можно хранить в переменных или передавать функциям.

При вызове конструктор создает новый объект, запускает код в конструкторе и возвращает новый объект. Это строка user = brilliantUser (‘Mursalin’, 17, 4). Независимо от имени класса конструктор всегда называется __init__ .

Пока у нас

  класс brilliant Пользователь (объект):
    def __init __ (я, имя, возраст, рейтинг):
  

Вышеупомянутое определяет метод для класса brilliantUsers.Методы используются для функций, принадлежащих классу.

Переменные и тело метода __init__

Чтобы получить доступ к аргументам и связать их с конкретным экземпляром класса, в методе __init__ создайте переменные для каждого аргумента следующим образом: self.variableName = variableName .

Другой компонент, связанный с классами, — это атрибутов . Атрибуты — это характеристики объекта.Метод __init __ () используется для инициализации атрибутов объекта. Так же, как методы — это функции, определенные в классе, атрибуты — это переменные, определенные в классе.

Каждый метод в определении класса начинается со ссылки на объект-экземпляр. По соглашению это называется «я».

В Python первым параметром для методов является self . Параметр self используется для создания переменных-членов. Внутри класса мы инициализируем любые переменные, которые могут иметь разные значения в зависимости от конкретного экземпляра класса, как self.Имя переменной . В примере с автомобилем нам может потребоваться доступ к переменной color для car_1 и переменной color для car_2 , и для того, чтобы назначить каждой машине свое собственное значение цвета , нам понадобится self .

Тело функции-конструктора для примера пользователей Brilliant выглядит следующим образом:

  self.name = name
self.age = возраст
self.rating = рейтинг
  

Этот код создает переменные-члены для объекта, созданного конструктором.Переменные-члены будут начинаться с self , чтобы показать, что они являются переменными-членами, принадлежащими объекту, а не просто обычными локальными переменными в методе.

В целом класс для описания блестящих пользователей выглядит так:

  класс brilliant Пользователь (объект):
    def __init __ (я, имя, возраст, рейтинг):
      self.name = имя
      self.age = возраст
      self.rating = рейтинг

# Мы можем создать блестящий объект для пользователя


user = brilliantUser ('Мурсалин', 17, 4)
  

Создание экземпляра

Экземпляр — это особый объект, созданный из определенного класса.Чтобы создать экземпляры класса, вызовите класс, используя имя класса и передайте любые аргументы, которые принимает его метод __init__ — в этом примере метод __init__ принимает имя , возраст и рейтинг .

  user = brilliantUser ('Мурсалин', 17, 4)
  

Здесь мы создаем новый экземпляр класса brilliantUser . Или, другими словами, мы создаем экземпляр класса brilliantUser .

ООП (объектно-ориентированное программирование) Определение

означает «объектно-ориентированное программирование». ООП (не Упс!) Относится к методологии программирования, основанной на объектах, а не только на функциях и процедурах. Эти объекты организованы в классы, которые позволяют группировать отдельные объекты. Большинство современных языков программирования, включая Java, C / C ++ и PHP, являются объектно-ориентированными языками, а многие старые языки программирования теперь имеют объектно-ориентированные версии.

«Объект» в языке ООП относится к определенному типу или «экземпляру» класса.Каждый объект имеет структуру, аналогичную другим объектам в классе, но может иметь индивидуальные характеристики. Объект также может вызывать функции или методы, специфичные для этого объекта. Например, исходный код видеоигры может включать в себя класс, который определяет структуру персонажей в игре. Отдельные персонажи могут быть определены как объекты, что позволяет им иметь различный внешний вид, навыки и способности. Они также могут выполнять различные задачи в игре, которые выполняются с использованием конкретных методов каждого объекта.

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

Обновлено: 2 ноября 2007 г.

TechTerms — Компьютерный словарь технических терминов

Эта страница содержит техническое определение ООП.Он объясняет в компьютерной терминологии, что означает ООП, и является одним из многих программных терминов в словаре TechTerms.

Все определения на веб-сайте TechTerms составлены так, чтобы быть технически точными, но также простыми для понимания. Если вы найдете это определение ООП полезным, вы можете сослаться на него, используя приведенные выше ссылки для цитирования. Если вы считаете, что термин следует обновить или добавить в словарь TechTerms, отправьте электронное письмо в TechTerms!

Подпишитесь на рассылку TechTerms, чтобы получать избранные термины и тесты прямо в свой почтовый ящик.Вы можете получать электронную почту ежедневно или еженедельно.

Подписаться

Что такое объект? (Учебники по Java ™> Изучение языка Java> Концепции объектно-ориентированного программирования)

Объекты — ключ к пониманию объектно-ориентированной технологии . Посмотрите вокруг прямо сейчас, и вы найдете множество примеров реальных объектов: вашу собаку, ваш стол, ваш телевизор, ваш велосипед.

Реальные объекты имеют две характеристики: все они имеют состояние и поведение .У собак есть состояние (имя, окрас, порода, голод) и поведение (лай, взмах, виляние хвостом). Велосипеды также имеют состояние (текущая передача, текущая частота вращения педалей, текущая скорость) и поведение (переключение передач, изменение частоты вращения педалей, включение тормозов). Определение состояния и поведения объектов реального мира — отличный способ начать думать в терминах объектно-ориентированного программирования.

Найдите минутку прямо сейчас, чтобы понаблюдать за объектами реального мира, которые находятся в непосредственной близости от вас. Для каждого объекта, который вы видите, задайте себе два вопроса: «В каких возможных состояниях может находиться этот объект?» и «Какое возможное поведение может выполнять этот объект?».Обязательно запишите свои наблюдения. По мере того как вы это делаете, вы заметите, что объекты реального мира различаются по сложности; настольная лампа может иметь только два возможных состояния (включено и выключено) и два возможных поведения (включить, выключить), но настольное радио может иметь дополнительные состояния (включено, выключено, текущая громкость, текущая станция) и поведение (включить , выключить, увеличить громкость, уменьшить громкость, искать, сканировать и настраивать). Вы также можете заметить, что некоторые объекты, в свою очередь, также будут содержать другие объекты. Все эти наблюдения из реального мира переводятся в мир объектно-ориентированного программирования.

Программный объект.

Программные объекты концептуально похожи на объекты реального мира: они также состоят из состояния и связанного поведения. Объект сохраняет свое состояние в полях (переменные в некоторых языках программирования) и раскрывает свое поведение с помощью методов (функций в некоторых языках программирования). Методы работают с внутренним состоянием объекта и служат основным механизмом для связи между объектами. Скрытие внутреннего состояния и требование выполнения всех взаимодействий с помощью методов объекта известно как инкапсуляция данных — фундаментальный принцип объектно-ориентированного программирования.

Рассмотрим велосипед, например:

Велосипед, смоделированный как программный объект.

Приписывая состояние (текущая скорость, текущая частота вращения педалей и текущая передача) и предоставляя методы для изменения этого состояния, объект сохраняет контроль над тем, как внешний мир может его использовать. Например, если у велосипеда только 6 передач, метод переключения передач может отклонить любое значение, которое меньше 1 или больше 6.

Объединение кода в отдельные программные объекты дает ряд преимуществ, в том числе:

  1. Модульность: исходный код объекта может быть написан и поддерживаться независимо от исходного кода для других объектов.После создания объект может быть легко передан внутри системы.
  2. Скрытие информации: при взаимодействии только с методами объекта детали его внутренней реализации остаются скрытыми от внешнего мира.
  3. Повторное использование кода: если объект уже существует (возможно, написан другим разработчиком программного обеспечения), вы можете использовать этот объект в своей программе. Это позволяет специалистам реализовывать / тестировать / отлаживать сложные объекты, ориентированные на конкретные задачи, которым вы затем можете доверять для запуска в своем собственном коде.
  4. Возможность подключения и легкость отладки: если какой-либо конкретный объект окажется проблематичным, вы можете просто удалить его из своего приложения и подключить другой объект в качестве его замены. Это аналогично устранению механических проблем в реальном мире. Если болт сломается, замените на , а не всю машину.

Что такое ООП (объектно-ориентированное программирование)?

Обновлено: 30.06.2019 компанией Computer Hope

Создано Аланом Каем, объектно-ориентированное программирование , также известное как ООП или ООП , представляет собой парадигму языка программирования.В объектно-ориентированной программе код может быть структурирован как повторно используемые компоненты, некоторые из которых могут иметь общие свойства или поведение.

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

Концепции объектно-ориентированного программирования

При программировании на объектно-ориентированном языке программирования помните о следующих четырех ключевых концепциях.

  • Инкапсуляция — Группировка связанных функций и данных (переменных) вместе в объект, чтобы помочь снизить сложность и позволить повторно использовать части кода.
  • Абстракция — Покажите только самое необходимое, чтобы уменьшить абстрактность изменений.
  • Наследование — Устранение избыточного кода путем наследования функций и данных из других классов.
  • Полиморфизм — изменение функции объекта в зависимости от данных или класса.

Что такое OOPL?

OOPL (объектно-ориентированный язык программирования ) — это язык программирования, основанный на модели объектно-ориентированного программирования, описанной выше.Примерами объектно-ориентированных языков программирования являются C ++, C #, Java, Python, Simula и Smalltalk.

Общий пример ООП

Допустим, вы пишете видеоигру, в которой игроки управляют транспортными средствами и участвуют в гонках. Если вы используете объектно-ориентированный язык программирования, вы можете определить класс объектов с именем «транспортное средство». Этот класс может содержать определения качеств и поведения, присущих всем транспортным средствам. Например, все автомобили ускоряются и замедляются, а также потребляют топливо.В этом определении класса вы можете определить методов (аналогичные функциям), называемые «ускорение» и «замедление», и свойство (тип переменной), называемое «топливо», значение которого вы можете получить или набор .

Затем вы можете определить подкласса , также называемые производными классами , или дочерними классами , которые наследуют методы и свойства от класса «автомобиль». Например, вы можете определить подкласс под названием «мотоцикл» с двумя колесами и подкласс под названием «автомобиль» с четырьмя колесами.Их общие качества (ускорение, замедление и расход топлива) уже определены в «транспортном средстве», поэтому вам не нужно записывать их снова.

Затем вы можете создать экземпляры этих подклассов, чтобы определить отдельные игровые машины. Каждый экземпляр подкласса будет наследовать методы и свойства от всех своих родительских классов и иметь собственные свойства и методы. Например, его уникальные свойства могут включать цвет краски («красный», «синий» и т. Д.) И цену (если игрок хочет приобрести ее за внутриигровую валюту).

Позже, когда вы захотите изменить код, специфичный для мотоцикла, вам не нужно менять родительский класс «транспортного средства». Код «транспортного средства» уже протестирован и работает нормально, поэтому изменение вашей программы требует меньше усилий. Кроме того, поскольку изменяется меньше строк кода, уменьшается вероятность того, что ошибка будет внесена где-то в новый код. Если ошибка действительно появляется, вам не нужно задумываться, есть ли она в коде класса «автомобиль», потому что этот класс не был изменен.Таким образом, разработка и сопровождение программного обеспечения могут быть более эффективными, что позволяет экономить время и силы.

Класс, Компьютерные сокращения, Объект, Объектный модуль, Объектно-ориентированный, Полиморфизм, Термины программирования

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *