摘要摘要(TM)
你得到一些东西。
- 原型继承和克隆
- 动态添加新属性
- 同一类的不同版本(规范级别)的对象共存。
- 属于较新版本(规范级别)的对象将具有额外的“可选”属性。
- 新旧属性的内省
- 验证规则的自省(以下讨论)
有一个致命的缺点。
- 编译器不会为您检查拼写错误的字符串。
- 自动重构工具不会为您重命名属性键名称-除非您为这些花哨的名称付费。
事实是,您可以使用um,内省来进行内省。通常会发生以下情况:
- 启用反射。
- 将大型自省库添加到您的项目中。
- 使用属性或注释标记各种对象方法和属性。
- 让自省库发挥作用。
换句话说,如果您不需要与FP进行交互,则不必听Rich Hickey的建议。
最后但并非最不重要(也是最漂亮的),尽管将其String
用作属性键最直接,但您不必使用String
s。许多遗留系统(包括Android™)在整个框架中广泛使用整数ID来引用类,属性,资源等。
Android是Google Inc.的商标。
您也可以使两个世界都开心。
对于Java世界,照常实现getter和setter。
对于FP世界,实施
Object getPropertyByName(String name)
void setPropertyByName(String name, Object value) throws IllegalPropertyChangeException
List<String> getPropertyNames()
Class<?> getPropertyValueClass(String name)
在这些函数中,是的,代码很丑陋,但是有一些IDE插件可以使用...呃,一个可以读取代码的智能插件来为您解决。
Java方面将像往常一样具有出色的性能。他们将永远不会使用代码的丑陋部分。您甚至可能要对Javadoc隐藏它。
FP方面可以编写所需的任何“ leet”代码,并且通常不会因为代码太慢而对您大喊大叫。
通常,在软件开发中,通常使用地图(属性包)代替对象。它不是函数编程或任何特定类型的语言所独有的。对于任何给定的语言,它可能都不是惯用的方法,但是在某些情况下需要使用它。
特别是,序列化/反序列化通常需要类似的技术。
关于“作为对象的地图”的一些一般想法。
- 您仍然必须提供用于验证“作为对象映射”的功能。区别在于“作为对象映射”允许更灵活(限制更少)的验证标准。
- 您可以轻松地将其他字段添加到“作为对象映射”。
- 为了提供对有效对象的最低要求的规范,您将需要:
- 列出地图中预期的“最低要求”键组
- 对于每个需要验证其值的密钥,请提供一个值验证功能
- 如果存在需要检查多个键值的验证规则,请同样提供。
- 有什么好处?以这种方式提供规范是自省的:您可以编写程序来查询最少需要的一组键,并获取每个键的验证功能。
- 在OOP中,所有这些都以“封装”的名义汇总到一个黑匣子中。代替机器可读的验证逻辑,调用者只能阅读人类可读的“ API文档”(幸运的是,它存在)。