понедельник, 21 ноября 2011 г.

В чём различие между объектно-ориентированным и системным подходами? Часть 1


Объектно-ориентированный подход – это подход к разработке программ. Он был изобретён Кристеном Нюгордом и Оле-Йоханом Далем при разработке языка Симула-67. Впоследствии многие его концепции были развиты Аланом Кеем и Дэном Ингалссом при работе над языком Smalltalk.

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

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

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

Системный подход – это подход к:


a)      изучению объектов и явлений;
b)      построению научных теорий и гипотез;
c)      проектированию техники.

Основоположником системного подхода является австрийский биолог Карл Людвиг фон Берталанфи.

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

Любая система имеет назначение, цель, ради которой существует. Эту цель задаёт система более высокого уровня (надсистема), в которую рассматривая система включена, как часть.

Система состоит из множества систем более низкого уровня, которые называются подсистемами. Подсистемы упорядочены внутри системы и образуют её структуру.

Система обладает системным эффектом. Системный эффект – это то, что отличает систему от просто суммы её частей. Системный эффект – это свойство системы, которым обладает система, но не обладают её части. Например, самолёт может летать, а его отдельные части – крылья, фюзеляж, шасси – летать не могут.

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

С точки зрения системы её подсистемы представляют собой "чёрные ящики". Система знает о назначении её отдельных подсистем, но не знает, как они устроены внутри, не знает их структуру.

Системы образуют иерархию уровней:

  1. Над-над-система.
  2. Над-система.
  3. Система.
  4. Под-система.
  5. Под-под-система.

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

  1. Где она расположена?
  2. Как и для чего она используется?

Назначение системы всегда лежит за её пределами.

Если мы хотим понять, как функционирует система, то нам, наоборот, нужно спуститься на уровень ниже – от надсистемы к системе, от назначения системы к её структуре. Хороший инженер (конструктор или изобретатель) никогда не рассматривает систему изолированно – он всегда изучает систему с разных системных уровней: надсистемного, системного, подсистемного.


Современные приложения – это сложные технические системы, которые можно представить в виде иерархии системных уровней:

  1. Код.
  2. Функция.
  3. Объект, класс (группа данных и функций).
  4. Группа взаимодействующих объектов, классов.
  5. Функциональный модуль.
  6. Библиотека.
  7. Набор библиотек.
  8. Программа.
  9. Приложение (набор программ и ресурсов).
  10. И т.д. – наверняка что-то пропустил.

Когда сторонники объектно-ориентированного подхода говорят, что могут с помощью него разработать приложение, то они немножко лукавят. Если посмотреть на приведённую иерархию, то легко увидеть, что объектно-ориентированный подход позволяет разработать системы уровней 3 и 4, т.е. части программ или небольшие программы. Чтобы сконструировать серьёзное приложение, нужно оперировать системами более высокого уровня – функциональными модулями, библиотеками, наборами библиотек и даже отдельными программами.

К сожалению, ряд вопросов остаётся за "скобками" объектно-ориентированного подхода. Например:

  1. Как, оперируя системами высого уровня, проектировать приложения?
  2. Как от систем высокого уровня переходить к классам и объектам?

ЛИТЕРАТУРА:

  1. Объектно-ориентированное программирование.
  2. Симула.
  3. Системный подход.
  4. Г.С. Альтшуллер "Структура талантливого мышления".
  5. С.В. Сычёв, К.А. Лебедев "О потерянном уровне".

Продолжение следует...

3 комментария:

  1. Кирилл, прекрасная статья. Отличный язык.

    Правда, мне не совсем понятна причина, побудившая написать статью? Почему вообще сравниваются ООП и СП?
    Почему бы не сравнивать OOSE и SADT - это было бы ближе к действительности?

    Отвечая на вопросы в конце статьи, хочу задать встречный вопрос:
    - а разве система - это не объект?
    - метод декомпозиции is a и has a?

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

    Кирилл, черкните, пожалуйста, по адресу: portugaled [собака] yandex [точка] ru.

    ОтветитьУдалить
  2. Эдуард. Причин было несколько. Одной из них был Ваш вопрос. Другая причина - мне самому захотелось разобраться в сходстве и различие подходов.

    Не всякая система - это объект, и не всякий объект - это система. Думаю, система - это то, что мы рассматриваем в качестве системы. Если мы рассматриваем объект с точки зрения системного подхода (в соответствии с выше приведёнными критериями), то тогда он является системой. Потому что система - это производная от системного подхода.

    При помощи агрегации и наследования можно конструировать отдельные и несложные части программы. Если же речь идёт о большом приложении (например, игре типа FIFA 12 или Need for Speed The Run), то нужно оперировать конструктивными элементами более высокого уровня.

    ОтветитьУдалить
  3. Кирилл, по поводу "Не всякая система - это объект, и не всякий объект - это система" - это дискуссионный момент.
    Для меня любой объект - система, т.е. нечто обладающее назначением, целостностью и имеющее некую внутренниюю структуру. Другие определения системы считаю следует оставить науке :).

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

    И если кто-то забывает об этом и выставляет ОО как альтернативу СП, то он заблуждается

    ОтветитьУдалить