Основы программирования (947332), страница 62
Текст из файла (страница 62)
Библиотека интерфейсных компонентов содержитклассы, реализующие обобщенные объекты, вид и поведение которых, связанные с решением конкретной задачи, не определены. Для того чтобы уточнить вид компонентов интерфейса, обычно достаточно их соответствующимобразом инициализировать. Конкретизацию поведения компонентов в реальной задаче выполняют за счет наследования классов реальной задачи от библиотечных.На рис. 12.13 представлена полная диаграмма классов программы, накоторой показано наследование интерфейсных классов от описанных в библиотеке и уточнены их ассоциации с классом TBase.Класс TIName будет использован для реализации объекта Ввод именифайла.
Он переопределяет метод Error класса TInput, задавая свой вариантпроверки правильности введенной информации.Класс TMain строится для реализации объекта Главное меню. Он переопределяет метод Enter, конкретизируя поведение программы при выборепунктов главного меню. Количество пунктов меню регулируется соответствующей инициализацией поля nalt. Добавляемое поле may логического типабудет использовано для контроля открытия файла.Классы TAdd и TFind будут использованы для реализации форм Добавление и Поиск. Очевидно, что они должны переопределять абстрактный метод Enter прародителя - класса TMenu.
Кроме этого в классе TFind необходимо переопределить метод ввода, который должен обеспечить ввод информации не из всех полей, а только из поля фамилии и поля имени, и добавить метод Show для вывода найденных данных (телефона и, при поиске по неполным данным, имени или фамилии) в окно поиска.377Часть 2, Объектно-ориентированное программированиетт."ТГILTINameTMainTFormТError()TAddEnter()mayEnter(), Init()2_TFindEnter(), Input(), Show()V ФормируетОткрывает •XBaseЛ ОбрабатываетРис.
12.13. Диаграмма классов программы «Записная книжка»Для реализации объекта Сообщение об отсутствии данных нового класса создавать не нужно, используем непосредственно класс TMessage.После объявления наследуемых классов перед описанием переопределенных методов необходимо объявить объекты-переменные, так как методыбудут обращаться к этим переменным для программирования требуемыхдействий.Ниже представлен полный текст программы.Program Memory;Uses crt,WmJnput,Message,Menu,Form,Base;{объявление классов - потомков библиотечных классов}Туре TMain-Object (ТМепи) {главное меню}тау:Ьоо1еап;{признак открытия файла}Procedure Enter; virtual;end;Type TIName=Object(TInput){ввод имени файла}Function Error:boolean; virtual; {проверка имени файла}end;Type TAdd=Object(TForm){форма для добавления записей}Procedure Enter; virtual; {завершение ввода одной записи}end;37812, Разработка библиотеки интерфейсных компонентовТуре TFind=ObJect(TForm){форма для поиска телефонов}Procedure Input; virtual; {ввод данных поиска}Procedure Enter; virtual; {поиск одной записи}Procedure Show;{вывод результата поиска в окна}end;{объявление объектов-переменных}Var M:TMain;{объект Главное меню}N:TIName;{объект Ввод имени файла}A:TAdd;{объект Добавление записей}F:TFind;{объект Поиск записей}ND:TMessage;{объект Сообщение об отсутствии данных}B:TBase;{объект Файл}{описание дополнительных методов}Procedure TMain.Enter; {обработка выбора пунктов главного меню}Begincase проз ofl:beginN.Draw;{выводим окно ввода}NJnput;{вводим имя файла, проверяя его допустимость}B,Open(N.inpJext); {если файл существует, то открываем,иначе - создаем}may:=true; {устанавливаем признак открытия файла }end;2:if may then {если определен файл данных }A.Run;{осуществляем добавление записей}Зц/тау then{если определен файл данных }FRun;{осуществляем поиск записей}end;End;Function TIName.Error; {проверка имени файла}Var L'integer;Begin l:=Pos(\ \ inp.Text);if 1=0 then l:=length(inp.Text);if(l>0) and e<==8) then Error:=faheelse Error:=true;End;Procedure TAdd.Enter; {обработка пунктов меню добавления}Begincasenpos ofl:beginInput; {вводим фамилию, имя и телефон}B,Add(masinpf]J.
inp. text, masinp[2]. inp, text,masinp[3J.inp.text); {записываем в файл}379Часть 2. Объектно-ориентированное программированиеend;end; {case}End;Procedure TFindEnter; {обработка пунктов меню поиска}Begin case npos of]:beginInput; {вводим фамилию и имя }ifB,Find(masinp[l]AnpJexUmasinp[2]Anp.text) then Showelse ND.Run; {выводим сообщение об отсутствии данных }end;2:beginifB.FindNext then Showelse ND.Run; {выводим сообщение об отсутствии данных }end;end;End;Procedure TFindJnput; {ввод данных для поиска информации}BeginClear;{очищаем поля ввода}masinp[l].Input; {вводим фамилию}masinp[2],Input; (вводим имя}End;Procedure TFind.Show; {вывод найденной информации в окно}BeginClear;masinpfJJ,inpJext:=B,family; masinpflJ.Draw; {выводим фамилию}masinpf2], inp. text: =Я name; masinp[2J, Draw; {выводим имя}masinpf3JjnpJext:=BJelefon; masinp[3J,Draw; {выводим телефон}End;{описание констант для инициализации полей-массивов}Const menul:array[l.J]ofTWin=((xl:I0;yl:14;x2:23;y2:18;attr:113;xt:3;yt:2;text:'Создать / открытькниэюку*),(xl:26;yl:14;x2:39;y2:18;attr:113;xt:4;yt:2;text: 'Записатьтелефон'),(xl:42;yl:14;x2:55;y2:18;attr:113;xt:5;yt:2;text: 'Найтителефон'),(xl:58;yl:14;x2:71;y2:18;attr:113;xt:4;yt:2;text: 'Завершитьработу'));menu2:array[L.2] ofTWin^((xl:28;yl:18;x2:38;y2:21;attr:113;xt:2;yt:2;text: 'Добавить'),(xl:42;yl:18;x2:52;y2:2I;attr:113;xt:2;yt:2;text: 'Выход'));38012.
Разработка библиотеки интерфейсных компонентовтепиЗ: array[1.. 3] of TWin=((xl:23:yl:18;x2:33;y2:21;attr:113;xt:2;yt:2:text: 'Найти'),(xl:35:yl:18;x2:45;y2:21;attr:113;xt:2;yt:2:text: 'Следующий'),(xl:47;yl:18;x2:57:y2:21:attr:113;xt:2:yt:2;textrBbixod')):inpp:arrayfJ..3J ofTInput=((xl:22;yl:8:x2:32;y2:8;attr:94;xt:l;yt:l;text:'Фамилия';Inp:(xl:34;yl:8;x2:54;y2:8;attr:112;xt:l;yt:l;textr')),(xl:22;yl:10;x2:32;y2:10;attr:94;xt:l;yt:l;text:'Имя ';Inp:(xl:34:yl:10;x2:54:y2:10;attr:112;xt:l;yt:l;text:")),(xl:22;yl:12;x2:32;y2:12;attr:94;xt:l;yt:l;text:'Телефон';Inp:(xl:34;yl:12;x2:54;y2:12;attr:112;xt:l;yt:l;text:")));{основная программа}Begin{инициализируем объекты}M.Imt(5,5,76,20,30,5,3, 'Записная книж:ка',4,тепи1);A.Init(20,2,60,22,94,5,3, 'Добавление записей',2,menu2,3,inpp);N.Init(30,8,50,19,94,3,3, 'Введите имя файла:',35,12,45,12,112,1,1,' ');FJnit(20,2,60,22,94,5,3, 'Поиск записей',3, тепиЗ, 3, inpp);NDJnit(30,6,50,14,30,6,2, 'Нет данных',34,11,46,12,71,2,1, 'Продоллсить');{начинаем работу}М.тау:'=false; {устанавливаем признак «файл не открыт»}M,Run;{передаем управление Главному меню}if may then B.Closef;{закрываем файл}{очищаем экран}TextBackGround(O);TextColor(l);Window(l,1,80,25);Clrscr;End.К основным достоинствам объектно-ориентированного подхода следуетотнести:• уменьшение количества параметров подпрограмм;• увеличение объема повторно используемых кодов;• возможность унификации программных элементов (в том числе интерфейсных);• относительную простоту распределения разработки сложных программных продуктов между несколькими программистами.Рассмотрим эти достоинства подробнее.Уменьшение количества параметров подпрограмм связано с тем, что привызове методов мы не должны указывать поля объекта.
В свою очередь, чем381Часть 2. Объектно-ориентированное программированиеменьше параметров, тем меньше вероятность ошибки при вызове подпрограммы, а ведь именно такие ошибки обычно выявляются при сборке программ из модулей, т.е. на последнем самом сложном этапе отладки программы.Увеличение объема повторно используемых кодов вызвано появлениемвозможности использования уже суш.ествующих классов, приспособив их ксвоим целям без изменения текстов уже написанных программ. Методы, которые нас не устраивают, мы просто заменяем при наследовании, сохраняявозможность вызвать их из заменяющего метода и даже из программы.Возможность унификации программных элементов также являетсяследствием появления средств построения новых классов на базе существующих. Работать с такими элементами удобно, так как деталей реализации их,как правило, можно не знать.Поскольку независимость объектов существенно выше, чем подзадач,уменьшается количество вопросов, которые должны быть учтены при ведении разработки несколькими программистами.Однако у объектно-ориентированного подхода есть и недостатки.
И кним в первую очередь относят некоторое увеличение размера программы засчет большого числа небольших подпрограмм, которые вряд ли появилисьбы при использовании структурного подхода. Соответственно объектно-ориентированные программы медленнее работают, так как каждый вызов подпрограммы требует времени.Существует и еще один недостаток ~ сложность обработки нештатныхситуаций, таких как деление на нуль и т. п. Дело в том, что ситуации такогорода обнаруживаются обычно не в том месте и часто даже не во время работы того объекта, где определяются некорректные данные и соответственновозможна их корректировка. Этот недостаток исправлен в более развитыхобъектных моделях, например в Delphi Pascal, за счет реализации механизмаисключений.Задания для самопроверкиЗадание 1.
Разработайте программу, которая организует хранение в файле информации о печатных изданиях. Для каждого издания определены: наименование,периодичность, тираж, типография. Программа должна в диалоговом режиме корректировать информацию в файле и давать ответы на каждый из перечисленных вопросов:1) вывести наименования всех ежедневных изданий, печатаемых указанной типографией;2) определить наименование издания данной периодичности с наибольшим тиражом;3) определить наименования всех изданий, печатаемых типографией, на которую приходится максимальный суммарный тираж.38212.
Разработка библиотеки интерфейсных компонентовПри проектировании интерфейса используйте разработанные в настоящей главе классы интерфейсных элементов.Задание 2. Разработайте программу, которая организует хранение в файле информации о товарах на складе. По каждому товару необходимо хранить: наименование, дату изготовления, сведения об изготовителе, дату поступления, количествоединиц хранения. Программа должна в диалоговом режиме корректировать информацию в файле при его отгрузке или постуУ1лении и давать ответы на каждый из перечисленных вопросов:1) вывести список товаров на складе на текущий момент времени;2) выполнить поиск товаров по наименованию;3) вывести список товаров, отсортированный по дате поступления.При проектировании интерфейса используйте разработанные в настоящей главе классы интерфейсных элементов.Задание 3. Предложите собственную библиотеку интерфейсных элементов дляреализации интерфейса программы заданий 1и 2.ПриложениеП1.