Проектирование файлов интерфейсов классов
Это шаг 3 этапа проектирования. Файл интерфейса класса содержит элементы-данные (поведение объекта класса) и элементы-функции (состояние объекта класса). Объект класса инкапсулирует поведение, если он умеет выполнять некоторые действия (элементы-функции), но подробности, как это делается, остаются скрытыми за фасадом интерфейса. Эта идея была сформулирована специалистом по информатике Дэвидом Парнасом в виде правил, которые называются принципами Парнаса:
Правило 1. Разработчик программы должен предоставлять пользователю информацию, которая нужна для использования приложения, и ничего кроме этого.
Правило 2. Разработчик программы должен знать только требуемое поведение объекта и ничего кроме этого.
Следствие принципа отделения интерфейса от реализации состоит в том, что программист может экспериментировать с различными алгоритмами, не затрагивая остальные классы. На этом шаге дается четкое описание классов, их элементов-данных и прототипов элементов-функций с типами параметров, опуская их реализацию.
|
|
Файл интерфейса базового класса
Спроектируем базовый класс Cindex. Поместим структуру tip_index в часть private, т.к. она используется только элементами-функциями данного класса, а элементы-функции - в часть public, т.к. они используются в классах CAkt, CCena.
Спроектируем прототипы элементов-функций класса ind:
- void init_ind(int, CString); - инициализирует элемент индексного массива; принимает номер записи и значение ключа;
- void init_kol(int); - инициализирует кол-во элементов массива;
- int dob_ind(CString); - поиск номера добавляемой записи; принимает значение ключа записи, возвращает номер записи;
- int poisk_ind(CString, int, int&); - поиск номера искомой записи; принимает значение ключа записи, индекс элемента начала поиска; возвращает номер записи и индекс элемента;
- void cor_ind(int, CString); - корректирует элемент индексного массива; принимает индекс элемента и ключ записи.
//Файл заголовков Index.h
#ifndef index_h
#define index_h
#include <string.h>
const int max_mass=1000;
class Cindex //определение базового класса
{
public:
int kol; //о бщее кличество записей файла
int fact_kol; // количество заполненных записей
private:
{
CString kluch;
int nomer;
} index[max_mass];
public:
CIndex();
~CIndex();
int razm_zap;
void init_ind(int,CString);
void init_kol(int);
int dob_ind(CString);
int poisk_ind(CString,int,int&);
void cor_ind(int,CString);
};
#endif
Файлы интерфейсов производных классов
Рассмотрим производные классы akt и cena. Элементы-функции Init(), Sozdanie(), Zamena(), Udalenie(), Zapiszap(), ChtenieZap() будут вызываться через объект класса, и,согласно правилам доступа, должны быть расположены в части public.
А почему выбран атрибут наследования public? Если выбрать private, то элементы-функции класса ind становятся в классах akt и cena - private. Доступ к ним в этих классах еще есть, но они становятся закрытыми для дальнейшего наследования. А ведь функция sozdanie(), выполняющая обработку двух файлов, должна использовать элементы класса ind. Поэтому, надо public.
|
|
//Файл Akt.h
#ifndef akt_h
#define akt_h
#include "Index.h"
class CAkt: public CIndex
{
public:
CString Tabn; // 10 байтов
CString Razrjad; // 10 байтов
CString VidRab; // 5 байтов
CString Objem; // 10 байтов
public:
void ZapisZap(int nomer);// запись записи в файл
void ChtenieZap(int nomer);// чтение записи из файла
void Sozdanie();// добавление новой записи
void Init(); // создание индексного массива
void Udalenie(int nomer);// удаление записи
void Zamena(int nomer);// замена записи
CAkt();
virtual ~CAkt();
};
#endif
//Файл Cena.h
#ifndef cena_h
#define cena_h
#include "Index.h"
class CCena: public CIndex
{
public:
CString Vid; //5 байтов
CString Rascenka; //10 байтов
public:
void Udalenie(int nomer);
void Zamena(int nomer);
void Init();
void Sozdanie();
void ChtenieZap(int nomer);
void ZapisZap(int nomer);
CCena();
virtual ~CCena();
};
#endif