Опубликован: 22.12.2005 | Уровень: для всех | Доступ: платный
Лекция 4:

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

Критика ООП

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

Также спорна большая гибкость объектных программ к изменениям. Она зависит от того, вносится ли новый метод (для серии объектов) или новый тип объекта. При процедурном подходе при появлении нового метода пишется отдельная процедура, в которой в каждой ветке алгоритма обрабатывается свой тип данных (то есть такое изменение требует редактирования одного места в коде). При ООП изменять придется каждый класс, внося в него новый метод (то есть изменения в нескольких местах). Зато ООП выигрывает при внесении нового типа данных: ведь изменения происходят только в одном месте, где описываются все методы для данного типа. При процедурном подходе приходится изменять несколько процедур. Сказанное иллюстрируется ниже. Пусть имеются классы A, B, C и методы a, b, c:

# ООП
class A:
  def a(): ...
  def b(): ...
  def c(): ...

class B:
  def a(): ...
  def b(): ...
  def c(): ...

class C:
  def a(): ...
  def b(): ...
  def c(): ...

# процедурный подход

def a(x):
  if type(x) is A: ...
  if type(x) is B: ...
  if type(x) is C: ...

def b(x):
  if type(x) is A: ...
  if type(x) is B: ...
  if type(x) is C: ...

def c(x):
  if type(x) is A: ...
  if type(x) is B: ...
  if type(x) is C: ...

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

# ООП

class D:
  def a(): ...
  def b(): ...
  def c(): ...

# процедурный подход

def a(x):
  if type(x) is A: ...
  if type(x) is B: ...
  if type(x) is C: ...
  if type(x) is D: ...

def b(x):
  if type(x) is A: ...
  if type(x) is B: ...
  if type(x) is C: ...
  if type(x) is D: ...

def c(x):
  if type(x) is A: ...
  if type(x) is B: ...
  if type(x) is C: ...
  if type(x) is D: ...

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

# процедурный подход

def d(x):
  if type(x) is A: ...
  if type(x) is B: ...
  if type(x) is C: ...

# ООП

class A:
  def a(): ...
  def b(): ...
  def c(): ...
  def d(): ...

class B:
  def a(): ...
  def b(): ...
  def c(): ...
  def d(): ...

class C:
  def a(): ...
  def b(): ...
  def c(): ...
  def d(): ...

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

Заключение

Даже достаточно неформальное введение в ООП потребовало определения большого количества терминов. В лекции была сделана попытка с помощью примеров передать не столько букву, сколько дух терминологии ООП. Были рассмотрены все базовые понятия: объект, тип, класс и виды отношений между объектами (IS-A, HAS-A, USE-A). Слушатели получили представление о том, что такое инкапсуляция и полиморфизм в стиле ООП, а также наследование, продление времени жизни объекта за рамками исполняющейся программы, известное как устойчивость объекта (object persistence). Были указаны недостатки ООП, но при этом весь предыдущий материал объективно свидетельствовал о достоинствах этого подхода.

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

Ссылки

Дэвид Мертц http://www-106.ibm.com/developerworks/linux/library/l-pymeta.html

Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Павел Ялганов
Павел Ялганов

Скажите экзамен тоже будет ввиде теста? или там будет какое то практическое интересное задание?

Максим Чиндясов
Максим Чиндясов
Россия, Нижний Новгород
Ольга Коваль
Ольга Коваль
Беларусь, Минск