Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6085
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Что делает язык объектно-ориентированным?
Поскольку дискуссия без осмысленных терминов бессмысленна, я решил указать на слона в комнате и спросить: что именно делает язык "объектно-ориентированным"? Я не ищу здесь ответа из учебника, но он основан на вашем опыте работы с языками OO, которые хорошо работают в вашей области, независимо от того, что это может быть.
Связанный с этим вопрос, который может помочь ответить в первую очередь: что такое архетип объектно-ориентированных языков и почему?
Определения для объектной ориентации - это конечно огромная банка червей , но вот мои 2 цента:
Для меня объектная ориентация-это все, что связано с объектами, которые сотрудничают, отправляя сообщения. Это, на мой взгляд, самая важная черта объектно-ориентированного языка.
Если бы мне пришлось составить упорядоченный список всех функций, которые должен иметь объектно-ориентированный язык, это выглядело бы так:
- Объекты отправка сообщений другим объектам
- Все является объектом
- позднее связывание
- Полиморфизм Подтипа
- Наследование или что-то столь же выразительное, как делегирование
- Инкапсуляция
- сокрытие информации
- Абстракция
Очевидно, что этот список очень спорен, поскольку он исключает большое разнообразие языков, которые широко рассматриваются как объектно-ориентированные , такие как Java , C# и C++, все из которых нарушают пункты 1, 2 и 3. Однако нет никаких сомнений в том, что эти языки допускают объектно-ориентированное программирование (но так же как и C ) и даже облегчают его (чего не делает C). Итак, я пришел к тому, чтобы назвать языки, которые удовлетворяют этим требованиям "purely object-oriented".
В качестве архетипических объектно-ориентированных языков я бы назвал Self и Newspeak .
Оба они удовлетворяют вышеупомянутым требованиям. Оба они вдохновлены и преемники Smalltalk , и оба на самом деле умудряются быть "more OO" в некотором смысле. То, что мне нравится в " Я "и новоязе, - это то, что они оба принимают парадигму отправки сообщений до крайности (новояз даже больше, чем "я").
На новоязе все является отправкой сообщения. Здесь нет переменных экземпляра, нет полей, нет атрибутов, нет констант, нет имен классов. Все они эмулируются с помощью геттеров и сеттеров.
В " Я " нет никаких классов , только объекты. Это подчеркивает, что на самом деле OO-это объекты, а не классы.
В основном объектно ориентированный действительно сводится к "message passing"
На процедурном языке я вызываю такую функцию :
f(x)
И имя f, вероятно, связано с определенным блоком кода во время компиляции. (Если только это не процедурный язык с функциями более высокого порядка или указателями на функции, но давайте на секунду проигнорируем эту возможность.) Таким образом, эта строка кода может означать только одну однозначную вещь.
В объектно-ориентированном языке я передаю сообщение объекту, возможно, так: :
o.m(x)
В этом деле. m-это не имя блока кода, а a "method selector", и то, какой блок кода будет вызван, фактически зависит от объекта o в некотором роде. Эта строка кода является более двусмысленной или общей, потому что она может означать разные вещи в разных ситуациях, в зависимости от o.
В большинстве языков OO объект o имеет значение "class", и класс определяет, какой блок кода вызывается. В паре языков OO (наиболее известный-Javascript) o не имеет класса, но имеет методы, непосредственно связанные с ним во время выполнения, или унаследовал их от прототипа.
Моя демаркация заключается в том, что ни классы, ни наследование не являются необходимыми для того, чтобы язык был OO. Но эта полиморфная обработка сообщений очень важна.
Хотя вы можете подделать это с помощью указателей функций в say C, этого недостаточно для того, чтобы C назывался языком OO, потому что вам придется реализовать свою собственную инфраструктуру. Вы можете сделать это, и стиль OO возможен, но язык не дал вам его.
На самом деле это не языки, которые являются OO, это код.
Можно написать объектно-ориентированный код C (со структурами и даже членами указателя функции, если хотите), и я видел несколько довольно хороших примеров этого. (На ум приходит землетрясение 2/3 SDK.) Также определенно возможно написать процедурный (т. е. не OO) код в C++.
Учитывая это, я бы сказал, что это поддержка языка для написания хорошего кода OO, что делает его "Object Oriented Language." я бы никогда не беспокоился об использовании членов указателя функции в структурах в C, например, для того, что было бы обычными функциями-членами; поэтому я скажу, что C не является языком OO.
(Развивая это, можно было бы сказать, что Python также не является объектно-ориентированным, с обязательной ссылкой на "self" на каждом шаге и конструкторами , называемыми init, что угодно; но это религиозная дискуссия.)
Насколько я могу судить, основной взгляд на то, что делает язык "Object Oriented", поддерживает идею группировки данных и методы, которые работают с этими данными, что обычно достигается с помощью классов, модулей, наследования, полиморфизма и т. д.
Смотрите эту дискуссию для обзора того, что думают люди (мысль?) Средства объектной ориентации.
Что же касается языка "archetypal" OO, то это действительно Малый язык, как заметил Кристофер.
По моему опыту, языки не являются объектно-ориентированными, а код есть.
Несколько лет назад я писал набор программ на языке AppleScript, который на самом деле не использует никаких объектно-ориентированных функций, когда я начал grok OO. Писать объекты в формате AppleScript довольно неуклюже, хотя можно создать классы, конструкторы и так далее, Если вы потратите время на то, чтобы понять, как это сделать.
Язык был правильным языком для домена: получение различных программ на Macintosh для совместной работы для выполнения некоторых автоматических задач на основе входных файлов. Взять на себя труд по самоподдержанию объектно-ориентированного стиля было правильным выбором программирования, потому что это привело к коду, который было легче отрабатывать, тестировать и понимать.
Особенностью, которую я заметил больше всего в изменении этого кода с процедурного на OO, была инкапсуляция: как свойств, так и вызовов методов.
Чтобы продолжить то, что сказал aib, я бы сказал, что язык на самом деле не является объектно-ориентированным, если только стандартные библиотеки, которые доступны, не являются объектно-ориентированными. Самый большой пример этого-PHP. Хотя он поддерживает все стандартные объектно-ориентированные концепции, тот факт, что такой большой процент стандартных библиотек не являются объектно-ориентированными, означает, что практически невозможно написать код объектно-ориентированным способом.
Это не имеет значения, что они вводят пространства имен, если все стандартные библиотеки все еще требуют, чтобы вы префиксировали все свои вызовы функций такими вещами, как mysql_ и pgsql_, когда в языке, который поддерживал пространства имен в фактическом API, вы могли бы избавиться от функций с mysql_ и иметь просто "include system.db.mysql.* "в верхней части вашего файла, чтобы он знал, откуда взялись эти вещи.
Объект: объект - это хранилище данных. Например, если MyList является объектом ShoppingList, то MyList может записать ваш список покупок.
Класс: класс - это тип объекта. Может существовать много объектов одного класса; например, MyList и YourList могут быть объектами ShoppingList.
Метод: процедура или функция, которая работает с объектом или классом. Метод связан с определенным классом. Например, addItem может быть методом, который добавляет элемент к любому объекту ShoppingList. Иногда метод связан с семейством классов. Например, addItem может работать с любым списком, из которых ShoppingList-только один тип.
Наследование: класс может наследовать свойства от более общего класса. Например, класс ShoppingList наследует от класса List свойство хранения последовательности элементов.
Полиморфизм: возможность иметь один вызов метода работать с несколькими различными классами объектов, даже если эти классы нуждаются в разных реализациях вызова метода. Например, одна строка кода может вызывать метод "addItem" в любом виде списка, даже если добавление элемента в ShoppingList полностью отличается от добавления элемента в ShoppingCart.
Объектно-ориентированный: каждый объект знает свой собственный класс и какие методы управляют объектами в этом классе. Каждый ShoppingList и каждый ShoppingCart знает, какая реализация addItem применима к нему.
В этом списке единственное, что действительно отличает объектно-ориентированные языки от процедурных языков (C, Fortran, Basic, Pascal), - это полиморфизм.
Источник: https://www.youtube.com/watch?с V=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd
Я рад поделиться этим с вами, ребята, это было очень интересно и полезно для меня. Это отрывок из интервью Rolling Stone 1994 года, где Стив (не программист) объясняет OOP простыми словами.
Джефф Гуделл: не могли бы вы объяснить простым языком, что такое объектно-ориентированное программное обеспечение?
Стив Джобс: объекты похожи на людей. Они живут, дышат вещами, у которых есть знание о том, как делать вещи, и есть память внутри них, чтобы они могли помнить вещи. И вместо того, чтобы взаимодействовать с ними на очень низком уровне, вы взаимодействуете с ними на очень высоком уровне абстракции, как мы делаем прямо здесь.
Вот пример: если я ваш объект стирки, вы можете дать мне свою грязную одежду и отправить мне сообщение, в котором говорится: "я случайно знаю, где находится лучшая прачечная в Сан-Франциско. И я говорю по-английски, и у меня есть доллары в карманах. Поэтому я выхожу, сажусь в такси и говорю водителю, чтобы он отвез меня в это место в Сан-Франциско. Я пойду постираю твою одежду, запрыгну обратно в такси и вернусь сюда. Я отдаю тебе твою чистую одежду и говорю: “Here are your clean clothes.”
Ты даже не представляешь, как я это сделал. Вы ничего не знаете о прачечной. Может быть, ты говоришь по-французски и даже не можешь поймать такси. Вы не можете заплатить за него, у вас нет долларов в кармане. И все же я знал, как это сделать. И тебе не нужно было ничего об этом знать. Вся эта сложность была скрыта внутри меня, и мы могли взаимодействовать на очень высоком уровне абстракции. Вот что такое объекты. Они инкапсулируют сложность, и интерфейсы к этой сложности являются высокоуровневыми.
Прототип
Возможность выразить реальные сценарии в коде.
foreach(House house in location.Houses)
{
foreach(Deliverable mail in new Mailbag(new Deliverable[]
{
GetLetters(),
GetPackages(),
GetAdvertisingJunk()
})
{
if(mail.AddressedTo(house))
{
house.Deliver(mail);
}
}
}
-
foreach(Deliverable myMail in GetMail())
{
IReadable readable = myMail as IReadable;
if ( readable != null )
{
Console.WriteLine(readable.Text);
}
}
Почему?
Для того чтобы помочь нам более легко понять. Это имеет больше смысла в наших головах и, если реализовано правильно, делает код более эффективным, многократно используемым и сокращает повторение.
Для достижения этого Вам необходимо:
- Указатели / ссылки , чтобы убедиться, что это == это и это != что.
- Классы для пункт (например Arm), что хранилище данных (инт hairyness) и операций (броска(IThrowable))
- Полиморфизм (наследование и / или интерфейсы) для обработки конкретных объектов в общем виде, так что вы можете читать книги, а также граффити на стене (оба реализуют IReadable)
- Инкапсуляция , потому что apple не предоставляет свойство Atoms[]