Объектно-ориентированный подход – это подход к разработке программ. Он был изобретён Кристеном Нюгордом и Оле-Йоханом Далем при разработке языка Симула-67. Впоследствии многие его концепции были развиты Аланом Кеем и Дэном Ингалссом при работе над языком Smalltalk.
Объектно-ориентированный подход предполагает, что любую программу можно представить в виде набора взаимодействующих объектов. Сначала предполагалось, что объекты будут взаимодействовать посредством обмена сообщениями. Однако в большинстве существующих языков программирования объекты взаимодействуют при помощи вызова функций.
Для описания объектов в языках программирования существуют классы. Фактически, класс – это модуль, для которого можно создать экземпляр (или несколько экземпляров). Как и всякий модуль, класс имеет свои интерфейс (открытую часть) и реализацию (закрытую часть). Экземпляр класса является объектом.
Объектно-ориентированный подход считают развитием структурного подхода к программированию. Основное отличие заключается в том, что объектно-ориентированный подход позволяет объединить данные и методы, обрабатывающие эти данные, в единой сущности – объекте.
Системный подход – это подход к:
a) изучению объектов и явлений;
b) построению научных теорий и гипотез;
c) проектированию техники.
Основоположником системного подхода является австрийский биолог Карл Людвиг фон Берталанфи.
Суть системного подхода заключается в том, что любой объект или явление рассматривается, как система. Что это означает?
Любая система имеет назначение, цель, ради которой существует. Эту цель задаёт система более высокого уровня (надсистема), в которую рассматривая система включена, как часть.
Система состоит из множества систем более низкого уровня, которые называются подсистемами. Подсистемы упорядочены внутри системы и образуют её структуру.
Система обладает системным эффектом. Системный эффект – это то, что отличает систему от просто суммы её частей. Системный эффект – это свойство системы, которым обладает система, но не обладают её части. Например, самолёт может летать, а его отдельные части – крылья, фюзеляж, шасси – летать не могут.
Системный эффект соответствует назначению системы, и он проявляется благодаря правильной организации частей системы, т.е. благодаря тщательно проработанной структуре.
С точки зрения системы её подсистемы представляют собой "чёрные ящики". Система знает о назначении её отдельных подсистем, но не знает, как они устроены внутри, не знает их структуру.
Системы образуют иерархию уровней:
- Над-над-система.
- Над-система.
- Система.
- Под-система.
- Под-под-система.
Рассматривая объект или явление системно, мы можем перемещаться с одного системного уровня на другой. Если мы хотим понять назначение системы, то нам нужно подняться на уровень выше и посмотреть на систему с точки зрения надсистемы:
- Где она расположена?
- Как и для чего она используется?
Назначение системы всегда лежит за её пределами.
Если мы хотим понять, как функционирует система, то нам, наоборот, нужно спуститься на уровень ниже – от надсистемы к системе, от назначения системы к её структуре. Хороший инженер (конструктор или изобретатель) никогда не рассматривает систему изолированно – он всегда изучает систему с разных системных уровней: надсистемного, системного, подсистемного.
См. Г.С. Альтшуллер "Структура талантливого мышления".
Современные приложения – это сложные технические системы, которые можно представить в виде иерархии системных уровней:
- Код.
- Функция.
- Объект, класс (группа данных и функций).
- Группа взаимодействующих объектов, классов.
- Функциональный модуль.
- Библиотека.
- Набор библиотек.
- Программа.
- Приложение (набор программ и ресурсов).
- И т.д. – наверняка что-то пропустил.
Когда сторонники объектно-ориентированного подхода говорят, что могут с помощью него разработать приложение, то они немножко лукавят. Если посмотреть на приведённую иерархию, то легко увидеть, что объектно-ориентированный подход позволяет разработать системы уровней 3 и 4, т.е. части программ или небольшие программы. Чтобы сконструировать серьёзное приложение, нужно оперировать системами более высокого уровня – функциональными модулями, библиотеками, наборами библиотек и даже отдельными программами.
К сожалению, ряд вопросов остаётся за "скобками" объектно-ориентированного подхода. Например:
- Как, оперируя системами высого уровня, проектировать приложения?
- Как от систем высокого уровня переходить к классам и объектам?
ЛИТЕРАТУРА:
- Объектно-ориентированное программирование.
- Симула.
- Системный подход.
- Г.С. Альтшуллер "Структура талантливого мышления".
- С.В. Сычёв, К.А. Лебедев "О потерянном уровне".
Продолжение следует...
Кирилл, прекрасная статья. Отличный язык.
ОтветитьУдалитьПравда, мне не совсем понятна причина, побудившая написать статью? Почему вообще сравниваются ООП и СП?
Почему бы не сравнивать OOSE и SADT - это было бы ближе к действительности?
Отвечая на вопросы в конце статьи, хочу задать встречный вопрос:
- а разве система - это не объект?
- метод декомпозиции is a и has a?
В любом случае основная задача программного инженера определить как будут распределяться отвественности. Похоже каждый выдающийся инженер предлагает свой способ решения этой задачи.
Кирилл, черкните, пожалуйста, по адресу: portugaled [собака] yandex [точка] ru.
Эдуард. Причин было несколько. Одной из них был Ваш вопрос. Другая причина - мне самому захотелось разобраться в сходстве и различие подходов.
ОтветитьУдалитьНе всякая система - это объект, и не всякий объект - это система. Думаю, система - это то, что мы рассматриваем в качестве системы. Если мы рассматриваем объект с точки зрения системного подхода (в соответствии с выше приведёнными критериями), то тогда он является системой. Потому что система - это производная от системного подхода.
При помощи агрегации и наследования можно конструировать отдельные и несложные части программы. Если же речь идёт о большом приложении (например, игре типа FIFA 12 или Need for Speed The Run), то нужно оперировать конструктивными элементами более высокого уровня.
Кирилл, по поводу "Не всякая система - это объект, и не всякий объект - это система" - это дискуссионный момент.
ОтветитьУдалитьДля меня любой объект - система, т.е. нечто обладающее назначением, целостностью и имеющее некую внутренниюю структуру. Другие определения системы считаю следует оставить науке :).
Просто я бы не стал противопоставлять системный и ОО подходы. Понимает есть системный подход - некое научное мировозрение - инструмент изучения окружающего мира и реструктуризации его под нужды человека. Есть и другие подходы. Проявление системного подхода может быть разным:
теоретико-множественным, кибернетическим, структурно-функциональным, объектно-ориентированным и т.п.
И если кто-то забывает об этом и выставляет ОО как альтернативу СП, то он заблуждается