Kemungkinan skenario dunia nyata di mana ini akan terjadi adalah ketika pustaka database, yang ditulis pada hari-hari ketika ruang hard disk sangat terbatas, menggunakan byte tunggal untuk menyimpan bidang 'tahun' tanggal (misalnya 11-NOV-1973 akan 73untuk tahun ini). Tetapi, ketika Tahun 2000 datang, ini tidak lagi memadai, dan tahun itu kemudian disimpan sebagai bilangan bulat pendek (16-bit). Header yang relevan (sangat disederhanakan) untuk pustaka ini bisa berupa ini:
// dbEntry.h
typedef struct _dbEntry dbEntry;
dbEntry* CreateDBE(int day, int month, int year, int otherData);
void DeleteDBE(dbEntry* entry);
int GetYear(dbEntry* entry);
Dan program 'klien' adalah:
#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;
}
Implementasi 'asli':
#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);
}
Kemudian, pada pendekatan Y2K, file implementasi ini akan diubah sebagai berikut (semua yang lainnya tidak tersentuh):
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;
}
Ketika klien perlu diperbarui untuk menggunakan versi baru (Y2K-aman), tidak ada perubahan kode yang diperlukan. Bahkan, Anda bahkan mungkin tidak perlu mengkompilasi ulang: cukup dengan menautkan kembali ke pustaka objek yang diperbarui (jika memang seperti itu) sudah cukup.
structini adalah kotak hitam dengan internal yang tidak diketahui. Jika klien tidak mengetahui internal, ia tidak akan pernah bisa mengaksesnya secara langsung dan Anda dapat mengubahnya sesuka hati. Ini mirip dengan enkapsulasi dalam OOP. Internal bersifat pribadi dan Anda hanya mengubah objek menggunakan metode publik.