एक वास्तविक वास्तविक परिदृश्य जहां ऐसा होता है जब डेटाबेस लाइब्रेरी, उन दिनों में लिखी जाती है जब हार्ड-डिस्क स्थान बहुत सीमित था, एक तारीख के 'वर्ष' क्षेत्र को संग्रहीत करने के लिए एक एकल बाइट का उपयोग करता था (जैसे 11-NOV-1973 73वर्ष के लिए होगा )। लेकिन, जब वर्ष 2000 आया, तो यह अब पर्याप्त नहीं होगा, और वर्ष को तब एक छोटे (16-बिट) पूर्णांक के रूप में संग्रहीत किया जाना था। इस लाइब्रेरी के लिए प्रासंगिक (बहुत सरलीकृत) हेडर यह हो सकता है:
// dbEntry.h
typedef struct _dbEntry dbEntry;
dbEntry* CreateDBE(int day, int month, int year, int otherData);
void DeleteDBE(dbEntry* entry);
int GetYear(dbEntry* entry);
और एक 'ग्राहक' कार्यक्रम होगा:
#include <stdio.h>
#include "dbEntry.h"
int main()
{
int dataBlob = 42;
dbEntry* test = CreateDBE(17, 11, 2019, dataBlob);
//...
int year = GetYear(test);
printf("Year = %d\n", year);
//...
DeleteDBE(test);
return 0;
}
'मूल' कार्यान्वयन:
#include <stdlib.h>
#include "dbEntry.h"
struct _dbEntry {
unsigned char d;
unsigned char m;
unsigned char y; // Fails at Y2K!
int dummyData;
};
dbEntry* CreateDBE(int day, int month, int year, int otherData)
{
dbEntry* local = malloc(sizeof(dbEntry));
local->d = (unsigned char)(day);
local->m = (unsigned char)(month);
local->y = (unsigned char)(year % 100);
local->dummyData = otherData;
return local;
}
void DeleteDBE(dbEntry* entry)
{
free(entry);
}
int GetYear(dbEntry* entry)
{
return (int)(entry->y);
}
फिर, Y2K के दृष्टिकोण पर, यह कार्यान्वयन फ़ाइल निम्नानुसार बदल जाएगी (बाकी सब कुछ अछूता रहा):
struct _dbEntry {
unsigned char d;
unsigned char m;
unsigned short y; // Can now differentiate 1969 from 2069
int dummyData;
};
dbEntry* CreateDBE(int day, int month, int year, int otherData)
{
dbEntry* local = malloc(sizeof(dbEntry));
local->d = (unsigned char)(day);
local->m = (unsigned char)(month);
local->y = (unsigned short)(year);
local->dummyData = otherData;
return local;
}
जब क्लाइंट को नए (Y2K-safe) संस्करण का उपयोग करने के लिए अद्यतन करने की आवश्यकता होती है, तो कोई कोड परिवर्तन की आवश्यकता नहीं होगी। वास्तव में, आपको पुन: संकलित करने की भी आवश्यकता नहीं हो सकती है : बस अपडेट की गई ऑब्जेक्ट लाइब्रेरी को फिर से लिंक करना (यदि ऐसा है तो) पर्याप्त हो सकता है ।
structअज्ञात इंटर्ल्स वाला एक ब्लैक बॉक्स है। यदि क्लाइंट को इंटर्नल का पता नहीं है, तो यह कभी भी सीधे उन तक नहीं पहुंच सकता है और आप उन्हें इच्छानुसार बदल सकते हैं। यह ओओपी में एनकैप्सुलेशन के समान है। इंटर्नल्स निजी हैं और आप केवल सार्वजनिक तरीकों का उपयोग करके वस्तु को बदलते हैं।