สถานการณ์ในโลกแห่งความเป็นจริงที่เป็นไปได้ซึ่งจะเกิดขึ้นคือเมื่อห้องสมุดฐานข้อมูลเขียนในวันที่เนื้อที่บนฮาร์ดดิสก์มี จำกัด มากใช้ไบต์เดียวเพื่อเก็บฟิลด์ 'ปี' ของวันที่ (เช่น 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กล่องสีดำที่มีตัวระบุไม่ทราบ หากลูกค้าไม่รู้จัก internals จะไม่สามารถเข้าถึงพวกเขาได้โดยตรงและคุณสามารถเปลี่ยนพวกเขาได้ตามต้องการ คล้ายกับ encapsulation ใน OOP internals เป็นแบบส่วนตัวและคุณเปลี่ยนวัตถุโดยใช้วิธีสาธารณะเท่านั้น