Bunun gerçekleşebileceği olası gerçek dünya senaryosu, sabit disk alanının çok sınırlı olduğu günlerde yazılmış bir veritabanı kitaplığının bir tarihin 'yıl' alanını depolamak için tek bir bayt kullanmasıdır (örn. 11-NOV-1973) 73yıl için olurdu ). Ancak, 2000 Yılı geldiğinde, bu artık yeterli olmayacaktı ve yılın o zaman kısa (16 bit) bir tamsayı olarak saklanması gerekiyordu. Bu kütüphane için ilgili (çok basitleştirilmiş) başlık şu olabilir:
// dbEntry.h
typedef struct _dbEntry dbEntry;
dbEntry* CreateDBE(int day, int month, int year, int otherData);
void DeleteDBE(dbEntry* entry);
int GetYear(dbEntry* entry);
Ve bir 'müşteri' programı:
#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;
}
'Orijinal' uygulama:
#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);
}
Daha sonra, Y2K yaklaşımında, bu uygulama dosyası aşağıdaki gibi değiştirilecektir (diğer her şey el değmeden bırakılır):
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;
}
İstemcinin yeni (Y2K güvenli) sürümü kullanacak şekilde güncellenmesi gerektiğinde, kod değişikliği gerekmez. Aslında, olabilir hatta yeniden derleme gerekmez: sadece bağlama yeniden (o kadar buysa) güncellendi nesne kitaplığına olabilir yeterli.
structkısmı bilinmeyen bir kara kutudur. İstemci dahili bilgileri bilmiyorsa, bunlara asla doğrudan erişemez ve bunları istediğiniz zaman değiştirebilirsiniz. Bu, OOP'deki kapsüllemeye benzer. İç kısımlar özeldir ve nesneyi yalnızca genel yöntemleri kullanarak değiştirirsiniz.