TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Живой Журнал

Гостевая книга

Рассылка

Благодарности

Об авторе

ООП - это очень просто

Выпуск № 5

Выдавать глобальные идеи - это удовольствие.
Искать сволочные маленькие ошибки - вот настоящая работа
/Брукс/

В этом выпуске:
  1. Удовольствия.
  2. Маленькая работа
  3. Настоящая работа
  4. Вопрос - опрос

Мысли ООПрограммиста об ООПрограммировании

Данная работа является продолжением рассылки ООП - это просто

Сначала я напишу о том, как я понимаю сущность объектно-ориентированного программирования (а может другие не так, так пусть напишут сами)

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

Следует определить, для чего, с какой целью создаем объект, даже если его создаем с учебными целями. Нужно определить, какую группу задач должен решать этот объект. (Именно так! Именно группу задач!) Практически никогда объект не создается для решения одной задачи. И даже если это так, то все равно, следует подумать, куда еще можно применить этот объект. НО ПРИ ЭТОМ, когда будем применять еще, не нужно будет переписывать объект, а лишь определить его ПОТОМКОВ с новыми качествами.

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

  • какие данные объект должен хранить. Это будут поля объекта;

  • как удобно будет "просить" объект выполнить нужные действия. Это будут методы объекта;
  • какие поля и методы нужны будут еще объекту для решения задачи. Это будут кандидаты на частные (private) поля и методы.

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

Базовый объект решает только одну главную задачу. Весь сервис реализуют его наследники.

Наследование - одно из ключевых понятий объектно - ориентированного программирования! Разработчикам компиляторов (и трансляторов) языков программирования удалось создать эффективный механизм наследования для объектов. И не пользоваться этим механизмом Вы не сможете, если Вы перейдете, например, на Delphi. Так что давайте попробуем разобраться в родственных связях на конкретном примере реализации базы данных

[ в начало ]

Планирование объекта

Рассуждения о базовом объекте:

  1. Он не должен иметь никакого представления о том, что он хранит. Для этого информация будет размещаться в структуре RECORD, которую создадим в отдельном модуле для облегчения возможности редактирования ее структуры. Базовый объект будет работать с указателями на эту запись. (Для знатоков отмечу, что я тоже знаю, что есть такой почти стандартный объект TCollection в модуле Objects. О нем я напишу позднее. Отличие моего объекта - он хранит не объекты, а записи).
  2. Тип хранения - связанный список, который хранится в динамической памяти ЭВМ. Выберу односвязный список, хотя это и не принципиально. В объекте будут методы, которые будут "знать" все о  хранении. (ВОТ: стоило было задуматься о реализации - как сразу - ПОТОМ! Это хорошая реализация принципа экономии мышления).
  3. У объекта должна быть возможность добавлять новую информацию, осуществлять поиск информации и удалять информацию. Тут мне пришло в голову (шучу - там пусто :)) ): было бы неплохо иметь возможность хранить информацию во внешнем файле. НО хм ... . Базовому объекту это ни к чему. Его дело хранить. Работу с файлами добавим потом, в одном из объектов, наследников. (Надо бы запомнить, что "тот" объект должен будет проверять версию базы данных. То есть, вдруг захочу добавить новые поля, а в файле их нет. Запомнили и тут же забыли. Сейчас есть другие задачи).
  4. И с клавиатуры заполнять базу данных в базовом объекте не будем! У объекта должен быть метод с названием, например, Add или Insert(Указатель на такую-то запись). Запись заполним при тестировании программно, добавим и посмотрим, правильно ли все работает.  А добавлять с помощью "Клавы" - это будет делать самый первый наследник. Из файла сможет следующий.  (Чувствуете, ВОТ ОНА - обещанная ЦЕПОЧКА).

Прежде чем перейти к реализации задуманного следует рассказать Вам всю правду об объектах. Сейчас это так модно!

Так вот: объекты не находят в капусте! Сначала объект описывают в разделе описания типов TYPE, а потом обычно их размещают в динамической памяти компьютера. Для этого у объекта должен быть метод, который может называться как угодно, делать, что угодно, или ничего не делать, но определяться не как procedure или function, а только CONSTRUCTOR. В Borland Pascal ему обычно дают имя Init, в Delphi - Create, а в С++ - имя класса (объекта, по-нашему, по Борланд Паскалевски). Задачей этого метода является построение объекта (название такое). Этот метод должен быть вызван самым первым. Конструктор может ничего не делать. Срабатывает один только его вызов.  Заметим, что constructor также обеспечивает работу эффективного механизма "изменяющихся" (виртуальных) методов.

Вывод: Нет никаких причин, почему бы не завести себе constructor, а также ...  destructor. Его роль противоположна constructor'у. Он умеет удалять объект. Заметим, что в Borland Pascal для destructor'a используют "обычное" имя Done, в Delphi - Destroy, а в С++ - имя класса с тильдой (~) впереди. Аналогично конструктору, деструктор может ничего не делать. Срабатывает его вызов. Все остальное - дополнительные действия.

Вывод 2: почему бы не завести себе деструктор (а также кошку, свечной заводик... :-)) )

Вывод 3: не бойтесь, больше никого и ничего обязательного нет в составе объектов. Все - только добровольное

[ в начало ]

Реализация

Предлагаемая мною реализация состоит из трех файлов:

  1. Test.pas - это тестирующая программа. Нужно сделать ее "Primary File ..."
  2. uRec.pas - там описана только хранимая единица. Я полагаю, что каждый ее должен сделать свою. Здесь же описаны полезные функции для работы с "ею". Я решил не помещать их в объект. Состав таких функций зависит от структуры хранимой единицы информации
  3. BaseObj.pas - базовый объект

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

ЗЫ: Вы можете присылать свои предложения о составе хранимой единицы. (Не знаю, как Вы, а я не сразу понял, почему пишется "ЗЫ")

[ в начало ]

Наши предложения и вопросы

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

Что если ее возобновить? Мы предлагаем не просто решать  задачи, а решать олимпиадные задачи (любых олимпиад), и не столько решать, сколько обмениваться опытом, алгоритмами решения, поиску более эффективных алгоритмов решения. Думаю, что в таком варианте рассылка окажется полезной. Вот например, как вывести сумму прописью. Видел несколько решений, может найдем получше?

А форма подписки - так вот она:

Рассылки@Mail.ru
Задача на Паскале

[ в начало ]

© Борис Сурин

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz