Програмування С, С++теорія та практика (частина 2)
2.3 Порівняння функціонального та об’єктного підходу
Згадаємо програмну реалізацію концепції дати з використанням функціонального підходу (див. Розділ 1.13.2. „Масиви структур”). Тоді для представлення дати ми створили відповідну структуру Баіа та окремо описали набір відповідних функцій, які будуть виконувати операції з типом даних Баіа.
£урегіе£ з'Ьгис'Ь Ба£е {
іп£ Й; /* день */ іп£ т; /* місяць */ іп£ у; /* рік */
} Ба£е;
VОій. ргіп^_йа^е (Ба£е &Й) ;
VОій. іпі'Ь_гіа'Ье(Ба'Ье &й,іп^ йй,іп^ тт,іп^ уу); іп£ 1еаруеаг(іп£ уу);
VОій. айй_уеаг(Ба^е &й,іп^ уу) ;
VОій. агій_топ'ЬЬ(Ба'Ье &й,іп^ тт) ;
VОій айй_йау(Ба^е &й,іп^ йй);
Як видно, при використанні функціонального підходу немає явного зв’язка між типом даних і функціями. Дані відіграють пасивну роль по відношенню до функцій, тому що виникає необхідність передачі в кожну функцію змінної структури типу Баїа. У головній програмі слід забезпечити виклики усіх функцій відповідними фактичними параметрами:
VОій таіп ^оігі)
{
Ба£е йа^е1,йа^е2; /* оголошення змінних
типу Ба£а*/
іпі'Ь_гіа'Ье(гіа'Ье1,15,12,2002); /* ініціалізація змінної Йа^е1*/
айй_йау(йа^е1,16); /* додаємо до Йа^е1 16 днів */
ргіп'Ь_гіа'Ье(гіа'Ье1) ; /* виводимо на екран значення
Йа^е1 */
іпі'Ь_гіа'Ье(гіа'Ье2,1,1,2003); /* ініціалізація змінної гіа£е2*/
айй_топ^Ь(йа^е2,10); /* додаємо до Йа^е1 10 місяців
*/
ргіп'Ь_гіа'Ье(гіа'Ье2) ; /* виводимо на екран значення
гіа£е2 */
}
Тепер розглянемо альтернативний - об'єктний підхід до організації даних задачі. Нашою ціллю є створення програмного аналогу сутності деякого об'єкту під назвою дата, який, окрім звичайних властивостей, як день, місяць, рік, буде містити методи (дії), які можна виконувати над цим об'єктом, тобто встановлювати та змінювати дату, визначати, чи є даний рік високосним тощо. Виявляється, у мові Сі++ можна встановити тісний зв'язок між даними та функціями, що їх обробляють, оголосивши останні в якості окремих
елементів структури таким чином, що новий структурований тип набуде нових, активних властивостей: з'Ьгис'Ь Ба£е {
іп£ Й; // день іп£ т; // місяць іп£ у; // рік Vоій ргіп£ () ;
Ба^е(іп^ йй,іп£ тт,іп^ уу); іп£ 1еаруеаг();
Vоій айй_йау (іп£ йй) ;
Vоій ай^топ'ЬЬ (іп£ тт) ;
Vоій айй_уеаг (іп£ уу) ;
};
Фактично у структуру Баґе ми додали ті ж самі функції, змінивши число їхніх параметрів, зробивши їх активними елементами структури! Функції, що оголошені всередині структури, будуть називатися функціями-членами і їх можна викликати тільки для змінної відповідного типу, використовуючи стандартний метод доступу до членів структури. В такому випадку відпадає необхідність передачі змінних типу Баґа у головній функції, так як дані та функції об’єднані в єдиному об’єкті структурного типу Баґа:
Vоій таіп ^оій)
{
Ба£е Йа£е1(15,12,2002) ,йа£е2 (1,1,2003) ;
/* ініціалізація Йа£е1 та Йа£е2 */ йа'Ье1.айй_йау(16); /* додаємо до Йа£а1 16 днів*/ гіа'Ье1.ргіп'Ь() ; /* виводимо на екран значення Йа£е1 */
йа'Ье2.айй_топ'ЬЬ(10); /* додаємо до Йа£а2 10 місяців */ йа'Ье2.ргіп'Ь() ; /* виводимо на екран значення Йа£е2 */
}
При реалізації функції можна використовувати члени даної структури без явної вказівки імені об’єкта. Наводимо програму, в якій реалізується концепція дати з використанням об’єктно-орієнтованого підходу.
#іпс1ийе<з'Ьйіо.Ь>
#іпс1ийе<сопіо.Ь> з'Ьгис'Ь Ба£е {
іп£ Й; // день іп£ т; // місяць іп£ у; // рік Vоій ргіп£();
Ба^е(іпї йй,іп£ тт,іпї уу); іп£ Іеаруеаг();
VОій айй_йау (іп£ йй) ;
VОій айй_топ^Ь (іп£ тт) ;
VОій айй_уеаг(іп£ уу);
} ;
VОій Ба^е::ргіп^()
/* виведення на екран дати */
{
ргіп'Ь£("%й.%й.%й\п",й,т,у) ;
}
Ба'Ье::Ба'Ье(іп'Ь йй,іп£ тт,іпї уу)
/* ініціалізація структури типу Ба^е */
{
й=йй;
т=тт;
у=уу;
}
іп£ Ба^е::1еаруеаг()
/* визначення, чи високосний рік */
{
і£ ((у%4==0&&у%100!=0)||(у%400==0)) ге^игп 1; еІзе ге^игп 0;
}
VОій Ба^е::айй_уеаг(іпї уу)
/* додати уу років до дати */
{
у+=уу;
}
VОій Ба^е::айй_топ^Ь(іпї тт)
/* додати тт місяців до дати */
{
т+=тт; і£ (т>12)
{
у+=т/12; т=т%12 ;
}
}
VОій Ба'Ье::айй_йау(іп'Ь йй)
/* додати йй днів до дати */
{
іп£ йауз[]={31,28,31,30,31,30,31,31,30,31,30,31};
й+=йй;
і£ (1еаруеаг()) Йауз[1]=2 9; мЬі1е ((й>йауз[т-1]) )
{
і£ (1еаруеаг()) Йауз[1]=29; е1зе Йауз[1]=28;
й-=йауз[т-1];
т++ ;
і£ (т>12)
{
у+=т%12; т=т/12 ;
}
}
}
VОій таіп ^оігі)
{
Ба£е Йа^е1(15,12,2002) ,гіа£е2 (1,1,2003) ;
йа^е1.айй_йау(16);
Йа^е1.ргіп^();
Йа^е2.айй_топ^Ь(10);
Йа^е2.ргіп£();
}
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
