在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本节书摘来自华章出版社《Effective Ruby:改善Ruby程序的48条建议》一书中的第2章,第2.5节,作者 [美]彼得 J.琼斯(Peter J. Jones),更多章节内容可以访问云栖社区“华章计算机”公众号查看 第10条:推荐使用Struct而非Hash存储结构化数据哈希表是Ruby程序员经常使用的一种有用的、通用的数据结构。Hash类提供了使用哈希表的简单的接口,与数组一样,它是Ruby的重要部分之一,该类有自己专用的语法来创建新的实例。当需要使用键值对时,Hash类绝对是首选。 这里没什么特殊的。CSV文件中的每一行都被翻译为一个哈希并随后插入数组。完成initialize方法后,你将获得一个固定格式的哈希数组,即所有的哈希对象都包含相同的键,不过值是不同的。本质上讲,这个哈希数组表示的是一些对象的集合,不能通过getter方法访问其属性,要访问其属性,你得通过哈希索引操作符来完成。这可能是个小问题,不过它会对AnnualWeather类的接口产生重大影响。 计算每个月的平均温度非常简单。即使如此,如果@readings数组中的每个对象都能响应一个mean方法计算平均值,将会把那段逻辑从这个方法中抽象出去。将这个方法塞进每个哈希里是可以做到的,但是在本例中会不必要地使代码难以理解。(毕竟我们不是在写JavaScript代码。) 如你所见,将Struct::new方法的返回值赋给一个常量是常见的实践。这允许你像类一样使用这个常量,并利用它创建对象。这个单行的代码也让你能清楚地知道这个新类产生的对象提供了哪些方法。这是对特殊的哈希的重大改进。让我们看看这个变化对mean方法的影响。 mean方法不需要改变太多,但现在它看起来更有面向对象编程的感觉了。通过getter方法访问属性high和low也有一点副作用。如果把属性名拼错,会引发一个NoMethodError异常。使用哈希时不会有这个问题,因为在哈希中试图访问非法的键只会返回nil而不会引发异常,不过这往往意味着在之后的代码中,你将被卷入一个更难发现的TypeError异常。 当你觉得创建一个新类过于笨重时,Struct就非常有用了。哈希只能定义一堆相同格式的无关的键,Struct却能让你定义实例方法和类方法。当你想为对象增加一些简单操作时,这完美极了。它们的公共接口也是类型良好的,更适合于AnnualWeather类的使用者。通过为@readings数组开启attr_reader方法,可以解决之前对通过AnnualWeather向外暴露一个哈希数组的顾虑。我不得不说这是一个大的改进。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论