代码与哲学:论抽象的本质
从柏拉图到面向对象
柏拉图说,现实世界是理念世界的投影。程序员说,对象是类的实例。
这两种说法惊人地相似。当我们写下 class Dog 的时候,我们在做什么?我们在定义一个”理念”——关于狗的本质属性和行为。而每一个 new Dog() 都是这个理念在内存中的一次”投影”。
抽象的代价
但抽象是有代价的。每一次抽象都在丢失信息,就像地图永远不会是领土本身。
// 理念:完美的狗
interface PlatonicDog {
bark(): string;
fetch(item: unknown): Promise<unknown>;
}
// 现实:总有例外
class RealDog implements PlatonicDog {
bark() {
return Math.random() > 0.5 ? "woof" : "..."; // 有时候不想叫
}
async fetch(item: unknown) {
if (Math.random() > 0.7) return null; // 有时候不想捡
return item;
}
}
也许好的代码和好的哲学一样:知道在哪里停止抽象,在哪里拥抱混沌。