ejs 遍历更多嵌套对象_如果每个对象都是一个数组怎么办? 没有更多的NullPointerExceptions!...

ejs 遍历更多嵌套对象

为NULL还是不为NULL? 编程语言设计人员不可避免地必须决定他们是否支持NULL。 而且事实证明,他们很难做到这一点。 NULL在任何语言中都不是直观的,因为NULL是该语言的公理,而不是可以从较低级公理派生的规则。 以Java为例,其中:

// This yields true:
null == null

// These throw an exception (or cannot be compiled)
null.toString();
int value = (Integer) null;

好像没有其他选择。 例如,SQL实现了一种更具表现力但可能不太直观的三值逻辑 ,大多数开发人员有时都会以微妙的方式犯错。

同时,SQL不知道“ NULL”结果,只有“ NULL”列值。 从集合论的角度来看,只有空集合 ,没有NULL集。

其他语言允许通过特殊运算符取消对null的引用,从而使编译器在后台为您生成乏味的null检查。 Groovy的一个例子就是它的null安全解引用运算符 。 正如在有关Scala等效项的讨论中可以看到的那样,该解决方案远没有被普遍接受。 Scala使用Option ,Java 8将使用Optional (或@Nullable )来模仿。

让我们考虑一个更广泛的解决方案

对我来说,可空性不是一等公民。 我个人不喜欢这样的事实,即Scala的Option [T]类型通过引入通用包装器类型(即使它似乎通过可穿越的trait实现了类似的数组功能)也污染了我的类型系统。 我不想区分Option [T]和T的类型。当从反射API角度进行类型推理时,尤其如此,Scala(和Java)的传统将永远阻止我在运行时访问T的类型。 。

但是,更糟糕的是,在大多数情况下,在我的应用程序中,我实际上并不想区分“选项”引用和“某些”引用。 哎呀,我什至不想在拥有1个参考和数十个参考之间进行区分。 jQuery非常正确。 jQuery之所以如此流行的主要原因之一是,因为您所做的一切,都是对一组包装的DOM元素进行的。 API从不区分匹配1或100 div。 查看以下代码:

// This clearly operates on a single object or none
$('div#unique-id').html('new content')
                  .click(function() { ... });

// This possibly operates on several objects or none
$('div.any-class').html('new content')
                  .click(function() { ... });

这是可能的,因为JavaScript允许您覆盖JavaScript数组类型的原型,至少在jQuery库的范围内,通常对数组进行修改。 它能变得更棒吗? .html()和.click()是整个数组上执行的操作,无论匹配中的元素是零,一还是100。 在一切都像数组(或ArrayList)的情况下,一种更类型安全的语言会是什么样? 考虑以下模型:

class Customer {
  String firstNames;  // Read as String[] firstNames
  String lastName;    // Read as String[] lastName
  Order orders;       // Read as Order[] orders
}

class Order {
  int value;          // Read as int[] value
  boolean shipped() { // Read as boolean[] shipped
  }
}

不要大声说(只是)。 假设这不会导致内存或计算开销。 让我们继续考虑它的优点。 因此,我想查看客户的订单是否已发货。 简单:

Customer customer = // ...
boolean shipped = customer.orders.shipped();

看起来还不算壮观(尚未)。 但是请注意一个客户可以有多个订单的事实,上面的检查实际上是要查看是否所有订单都已发货。 我真的不想编写循环,我发现很明显我想对每个订单执行出厂()检查。 考虑:

// The length pseudo-field would still be
// present on orders
customer.orders.length;

// In fact, the length pseudo-field is also
// present on customer, in case there are several
customer.length;

// Let's add an order to the customer:
customer.orders.add(new Order());

// Let's reset order
customer.orders.clear();

// Let's calculate the sum of all values
// OO-style:
customer.orders.value.sum();
// Functional style:
sum(customer.orders.value);

当然会有一些警告,上面选择的方法名称可能不是最好的方法。 但是,能够以相同的语法方式处理单个引用(可为空或不可为空)或数组引用(空,单值,多值)只是纯粹的语法上的麻烦。 空检查将由长度检查代替,但是大多数情况下,您甚至不必执行这些检查,因为在数组中的每个元素上始终会调用每种方法。 当前的单引用和多引用语义将通过命名约定来记录。 显然,命名为“ orders”表示可以使用多重引用,而命名为“ customer”的客户则表示不可能使用多重引用。

正如用户所评论的那样,该技术通常称为数组编程 ,是在Matlab或R中实现的。

说服了吗

我很好奇您的想法!


翻译自: https://www.javacodegeeks.com/2013/08/what-if-every-object-was-an-array-no-more-nullpointerexceptions.html

ejs 遍历更多嵌套对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值