知识卡片

去对象化有代价

普通读书笔记卡 · 1710.c

内容

用整数ID替代对象引用可以绕开每个对象的头部开销,把状态集中进数组,但会牺牲面向对象API、封装和可读性。发散:极端性能设计常把“对象”退化为句柄,适合基础设施底层而非普通业务代码。

参考来源

- 位置:《你真的会写代码吗-2021》第4章《宝贵的内存:空间效率》"4.3 弃用对象(Memory3)"及"4.3.1 无对象的API"(源文件:_epub-src/OEBPS/Text/0014.xhtml) - 结论依据:原文明确"为了显著减少空间使用,不能为每个容器持有一个对象,但客户端仍然需要某种方法来识别一个特定容器。解决办法是给客户端提供一个句柄……让客户端使用一个整型ID(容器的句柄)来标识每个容器",并指出这打破了原有的面向对象API(如`Container.getAmount(id)`取代`c.getAmount()`)。 - 原始内容:为了显著减少空间使用,不能为每个容器持有一个对象,但客户端仍然需要某种方法来识别一个特定容器。解决办法是给客户端提供一个句柄(handle)……为了节省空间,可以不为每个容器提供一个对象,而是让客户端使用一个整型ID(容器的句柄)来标识每个容器……我们打破了第1章中定义的API,使用整数ID而不是容器对象来标识容器。本章的所有实现也都牺牲了可读性,并因此牺牲了可维护性。