একটি সম্ভাব্য বাস্তব-জগতের পরিস্থিতি যেখানে এটি ঘটবে, যখন হার্ড-ডিস্কের স্থান খুব সীমাবদ্ধ ছিল এমন সময়ে লেখা একটি ডাটাবেস লাইব্রেরি যখন একটি বছরের 'বছর' ক্ষেত্রটি সংরক্ষণ করার জন্য একক বাইট ব্যবহার করে (যেমন 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);
}
তারপরে, ওয়াই 2 কে এর কাছে, এই প্রয়োগকারী ফাইলটি নীচে পরিবর্তন করা হবে (বাকি সমস্ত কিছুই আউটচুড রেখে দেওয়া হবে):
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- নিরাপদ) সংস্করণটি ব্যবহার করার জন্য ক্লায়েন্টকে আপডেট করার প্রয়োজন হবে তখন কোনও কোড পরিবর্তন করার প্রয়োজন হবে না। আসলে, আপনাকে এমনকি পুনরায় সংকলন করতে হবে না: কেবলমাত্র আপডেট হওয়া অবজেক্ট লাইব্রেরিতে পুনরায় সংযোগ করা (যদি এটি হয় তবে) যথেষ্ট হতে পারে ।
structএকটি কালো বাক্স যা অজানা ইন্টার্নালগুলি সহ। যদি ক্লায়েন্ট ইন্টার্নালগুলি না জানে, এটি কখনই সরাসরি তাদের অ্যাক্সেস করতে পারে না এবং আপনি ইচ্ছামত এগুলি পরিবর্তন করতে পারেন। এটি ওওপিতে এনক্যাপসুলেশনের অনুরূপ। অভ্যন্তরীণগুলি ব্যক্তিগত হয় এবং আপনি কেবল সর্বজনীন পদ্ধতি ব্যবহার করে অবজেক্টটি পরিবর্তন করেন।