第 23 章 元编程 元编程
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
软件就像熵:它难以把握,没有重量,遵循热力学第二定律;也就是说,它总是在增加。
诺曼-奥古斯丁
23.0 引言
元编程是指编程语言 能够在运行时操作、生成和修改代码。它令人着迷。一旦你发现了它,你就会发现它是解决所有问题的工具。但它并不是灵丹妙药(参见配方 4.1 "创建小对象"),也不是免费的。认为自己在创造某种魔法是不应该使用它的主要原因。
元编程就像设计模式,有着类似的兴奋状态:
-
你要了解它。
-
你并不完全理解。
-
你要仔细研究。
-
你掌握了它。
-
几乎随处可见。
-
你滥用它(参见配方 12.5 "消除设计模式滥用"),以为它是你的全新灵丹妙药(参见配方 4.1 "创建小对象")。
-
你要学会避免。
23.1 删除元编程用法
问题
你使用了元编程。
解决方案
改变元编程的使用方式,倾向于直接解决问题。
讨论
当你使用元编程时,你谈论的是金属语言和元模型。这涉及到通过在问题领域的对象之上发言来提高抽象层次。 这个额外的层次允许你用更高层次的语言来推理和思考现实实体之间的关系。这样,您就打破了观察现实所必须使用的双射,因为在现实世界中没有模型或元模型,只有您正在谈论的业务实体。 当你在现实生活中处理业务问题时,你很难证明对元实体的引用是合理的,因为这样的元实体并不存在(见图 23-1),这意味着你并没有忠实于在你的对象和现实之间使用双射的唯一规则。
图 23-1. 现实世界中不存在元模型
在现实世界中,你将很难证明这些额外对象和不存在的职责的存在是合理的。 最重要的设计原则之一是开放-封闭原则,它是 Solidity 设计定义的一部分(参见配方 19.1 "打破深度继承")。这条黄金法则规定,模型必须开放以便扩展,封闭以便修改。
这条规则仍然有效,您应该在模型中尽量强调这一点。然而,在许多实现中,您会发现使这些模型开放的方法是使用子类化来打开大门。
作为一种扩展实现,这种机制乍看起来非常强大,但却会产生耦合。通过链接定义从哪里获取可能的情况,一个类及其子类的无辜引用就会出现,而这正是可能发生动态变化的部分(扩展)。
下面是多态解析器层次结构的示例:
publicabstractclassParser{publicabstractbooleancanHandle(Stringdata);publicabstractvoidhandle();}publicclassXMLParserextendsParser{publicstaticbooleancanHandle(Stringdata){returndata.startsWith("<xml>");}publicvoidhandle(){System.out.println("Handling XML data...");}}publicclassJSONParserextendsParser{publicstaticbooleancanHandle(Stringdata){try{newJSONObject ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access