用鸭子类型语言模拟静态类型的各个方面

2023-12-31

在我目前的工作中,我正在构建一套严重依赖于对象的 Perl 脚本。 (使用 Perl 的bless()在哈希上尽可能接近 OO)

现在,由于缺乏更好的表达方式,我公司的大多数程序员都不是很聪明。更糟糕的是,他们不喜欢阅读文档,并且似乎在理解其他人的代码时遇到问题。牛仔编码就是这里的游戏。每当他们遇到问题并试图解决它时,他们都会想出一个可怕的解决方案,但实际上解决不了任何问题,而且通常会使情况变得更糟。

坦率地说,这导致我不信任他们用鸭子类型语言编写的代码。举个例子,我看到太多问题,他们没有因滥用对象而得到明确的错误。例如,如果输入A有会员foo,他们做了类似的事情,instance->goo,他们不会立即发现问题。它将返回一个空/未定义的值,他们可能会浪费一个小时来查找原因。然后最终改变了其他东西,因为他们没有正确识别原始问题。

因此,我正在集思广益,寻找一种方法来保留我的脚本语言(其快速发展是一个优势),但在未正确使用对象时给出明确的错误消息。我意识到,由于没有编译阶段或静态类型,因此错误必须在运行时出现。我对此很满意,只要用户得到一个非常明确的通知,说“这个对象没有 X”

作为我的解决方案的一部分,我不希望他们在尝试使用方法/变量之前检查它是否存在。

尽管我的工作是用 Perl 进行的,但我认为这可能与语言无关。


如果您有任何添加要使用的模块的想法,请尝试Moose http://www.iinteractive.com/moose/。它提供了现代编程环境中所需的几乎所有功能,甚至更多。它进行类型检查、优秀的继承、具有自省功能,并且具有MooseX::声明 http://search.cpan.org/perldoc?MooseX::Declare,Perl 类最好的接口之一。看一看:

use MooseX::Declare;

class BankAccount {
    has 'balance' => ( isa => 'Num', is => 'rw', default => 0 );

    method deposit (Num $amount) {
        $self->balance( $self->balance + $amount );
    }

    method withdraw (Num $amount) {
        my $current_balance = $self->balance();
        ( $current_balance >= $amount )
            || confess "Account overdrawn";
        $self->balance( $current_balance - $amount );
    }
}

class CheckingAccount extends BankAccount {
    has 'overdraft_account' => ( isa => 'BankAccount', is => 'rw' );

    before withdraw (Num $amount) {
        my $overdraft_amount = $amount - $self->balance();
        if ( $self->overdraft_account && $overdraft_amount > 0 ) {
            $self->overdraft_account->withdraw($overdraft_amount);
            $self->deposit($overdraft_amount);
        }
    }
}

我自己觉得这很酷。 :) 它是 Perl 对象系统之上的一层,所以它可以与你已经拥有的东西一起工作(基本上)。

使用 Moose,您可以非常轻松地创建子类型,这样您就可以确保您的输入有效。懒惰的程序员同意:让子类型在 Moose 中工作只需要做很少的事情,所以做起来比不做更容易! (从食谱4 http://search.cpan.org/~flora/Moose/lib/Moose/Cookbook/Basics/Recipe4.pod)

subtype 'USState'
    => as Str
    => where {
           (    exists $STATES->{code2state}{ uc($_) }
             || exists $STATES->{state2code}{ uc($_) } );
       };

还有 Tada,USState 现在是您可以使用的类型!没有大惊小怪,没有混乱,只有少量的代码。如果不正确,它会抛出一个错误,并且类的所有使用者所要做的就是传递一个包含该字符串的标量。如果没问题(应该是......对吗?:))他们像平常一样使用它,并且你的类受到保护免受垃圾影响。那多好啊!

Moose 有很多像这样很棒的东西。

相信我。一探究竟。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用鸭子类型语言模拟静态类型的各个方面 的相关文章

随机推荐

  • Ajax.BeginForm 让我抓狂

    ASP NET MVC3 我有一个最初在 div 内呈现的部分视图 以下是部分代码 model Venue Models Validation CustomerRequestModel Scripts jquery 1 4 4 min js
  • 如何使用 Jmeter Correlation 从下拉列表中选择随机帐户

    我在正则表达式的帮助下使用关联设计了我的脚本 这里我的场景是登录 进入产品搜索屏幕 随机选择一个帐户并选择产品模板并下订单 在这里 我通过为每个组选择提供的帐户来完成关联并为 5 个用户运行脚本 但我想为每个用户选择不同的帐户 第一次登录时
  • 如何为 H2OFrame 对象一次强制多个列为因子?

    我正在尝试遵循有关问题的建议 同时将多个列强制为因子 https stackoverflow com questions 33180058 coerce multiple columns to factors at once 但它不适用于H
  • WPF中如何发现ScrollViewer滚动到最后?

    我有一个ScrollViewer我的自定义控件中的实例 我需要 scorollview 是否滚动到末尾的要求 有什么办法吗 您可以通过以下方式检查 scrollViewer ScrollChanged OnScrollChanged pri
  • 在加载上下文中加载非托管静态 dll

    我有本机非托管 dll 它是静态的 如果我想并行运行它 每次需要库做一些工作时都必须加载它 在 NET 中 我会使用 AppDomain 并在需要时加载此 dll 但在 NET Core 中 AppDomain 已经消失 暂时 我查看了 A
  • 路由关注和多态模型:如何共享控制器和视图?

    给定路线 Example Application routes draw do concern commentable do resources comments end resources articles concerns commen
  • GeoPandas 中的格式/圆形数字图例标签

    我正在寻找一种方法来格式化 舍入这些地图中的数字图例标签 plot GeoPandas 中的函数 例如 gdf plot column pop2010 scheme QUANTILES k 4 这给了我一个有很多小数位的图例 我希望图例标签
  • 将应用程序渲染到主体时,语义 UI 侧边栏会使用 ReactJS 抛出控制台错误

    有什么方法可以在不使用 HTML 正文中的 id 标签的情况下将 Semantic UI 侧边栏渲染到 React 应用程序中 我想避免必须将 React 组件渲染到 HTML 正文中的 tagis 例如不使用 div div 我正在使用
  • 将 Scala 类作为参数传递?

    我希望将一个类作为参数传递给 Scala 函数 如下所示 def sampleFunc c Class List Any 附带问题 参数中的类型应该是 Class 还是 Class 我传递 Class 类型的原因是检查对象是否属于特定类型
  • 如何将 UIImageView 设置为圆角以适应宽高比模式

    我通常使用以下代码来设置圆角 imageView layer cornerRadius 10 当 imageView 设置为 Aspect Fill 时 它会起作用 但是当imageView设置为Aspect Fit模式时 imageVie
  • 在 Node.js 上使用 aes-ecb 加密二进制数据

    我尝试在 Node js 上进行加密 但糟糕的是我无法获得与在线网站相同的结果 我想用二进制密钥加密一些二进制数据 我使用教程节点站点 https nodejs org api crypto html crypto class cipher
  • nginx - 从上游服务器读取自定义标头

    我使用 nginx 作为反向代理 并尝试从上游服务器 Apache 的响应中读取自定义标头 但没有成功 Apache 的响应如下 HTTP 1 0 200 OK Date Fri 14 Sep 2012 20 18 29 GMT Serve
  • ListView 适配器和焦点状态

    我有一些列表视图 这是项目视图的代码
  • Matplotlib 图未使用 ipywidgets 滑块更新

    我有以下代码来生成一个简单的图表 matplotlib notebook from ipywidgets import import numpy as np import matplotlib pyplot as plt x np lins
  • 无法自动选择 Xcode 项目

    当我在正确的目录中输入 pod install 时 我总是得到这个 分析依赖关系 Could not automatically select an Xcode project Specify one in your Podfile lik
  • SQL 计算所有行而不是计算单个行

    我有一个从数据库请求数据的 SQL 语句 SELECT ID To Poster Content Time ifnull Aura 0 as Aura FROM SELECT FROM SELECT DISTINCT FROM messag
  • WCF 票证基础身份验证

    我正在编写使用 wsHttpBinding 绑定的 WCF 服务 该服务不是托管在 IIS 中而是托管在 Windows 服务中 我希望在服务中有一个 Login user pass 方法 如果用户有效 它将向客户端提供一张票证 谁能帮助我
  • Swift 4 Decodable:嵌套数组的结构

    鉴于以下 JSON 文档 我想创建一个struct有四个属性 filmCount Int year Int category 字符串 以及actor 演员阵列 filmCount 5 year 2018 category Other act
  • 将循环缓冲区就地移动/对齐/旋转为零

    我正在使用循环缓冲区将数据推送到列表的任一端 完成后 我想对齐缓冲区 以便列表中的第一个元素位于位置零 并且可以像常规数组一样使用 而无需任何花哨的索引开销 所以我有我的循环list有能力N 它有n从任意索引开始的元素f 移动 旋转所有元素
  • 用鸭子类型语言模拟静态类型的各个方面

    在我目前的工作中 我正在构建一套严重依赖于对象的 Perl 脚本 使用 Perl 的bless 在哈希上尽可能接近 OO 现在 由于缺乏更好的表达方式 我公司的大多数程序员都不是很聪明 更糟糕的是 他们不喜欢阅读文档 并且似乎在理解其他人的