首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

代码的坏味道(二)——为什么建议使用模型来替换枚举?

为什么建议使用对象来替换枚举? 在设计模型时,我们经常会使用枚举来定义类型,比如说,一个员工类 Employee,他有职级,比如P6/P7。...这里就出现了「代码的坏味道」 新的枚举值出现怎么办? 显然,添加一个新的枚举值是非常痛苦的,特别通过 switch 来控制流程,需要每一处都修改枚举,这也不符合开闭原则。...而且,即使不修改,默认的防御性手段也会让那个新的枚举值将会抛出一个异常。 为什么会出现这种问题? 是因为我们定义的枚举是简单类型,无状态。...这个时候,需要用重新去审视模型,这也是为什么 DDD 是用来解决「大泥球」代码的利器。...你看,哪天 P8 被裁了,calculateIndemnity 是一致的算法。 当然,并不是强求你把所有的枚举都替换成类模型来定义,这不是绝对的。还是要按照具体的业务逻辑来处理。

13830

TypeScript 中枚举类型的理解?应用场景有哪些

一、是什么 枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说,枚举就是一个对象的所有可能取值的集合 在日常生活中也很常见,例如表示星期的...标识符N[=整型常数], }枚举变量; 二、使用 枚举的使用是通过enum关键字进行定义,形式如下: enum xxx { ... } 声明关键字为枚举类型的方式如下: // 声明d为枚举类型Direction...= 'Right' } console.log(Direction['Right'], Direction.Up); // Right Up 如果设定了一个变量为字符串之后,后续的字段也需要赋值字符串...即将数字枚举和字符串枚举结合起来混合起来使用,如下: enum BooleanLikeHeterogeneousEnum { No = 0, Yes = "YES", } 通常情况下我们很少会使用异构枚举...,后端返回的字段使用 0 - 6 标记对应的日期,这时候就可以使用枚举可提高代码可读性,如下: enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; console.log

8010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java 中枚举类的使用

    在日常写项目时,很多数据字典常量都需要定义和使用,同时在 Java 面试中,枚举也是一个绕不开的话题,这篇文章就来详细介绍一下枚举的定义以及使用。 01  【什么是枚举类?】...枚举类的定义就是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内,使用枚举可以很方便地定义数据常量、以及我们的使用。 02  【为什么需要枚举类?】...举个简单的例子来说明一下~ (1)出于类型安全考虑,没用枚举类之前,常用静态常量来表示。...使用时,只需封装内部数据类型并限制数据字段。 此外,还可以为不同的枚举变量调用不同的处理方法(这可以通过实现枚举类的抽象方法来实现)。...03  【枚举类的定义和使用】 下面就定义一个试题类型的枚举类来帮助大家理解:

    1.6K20

    如何使用msprobe通过密码喷射和枚举来查找微软预置软件中的敏感信息

    关于msprobe  msprobe是一款针对微软预置软件的安全研究工具,该工具可以帮助广大研究人员利用密码喷射和信息枚举技术来寻找微软预置软件中隐藏的所有资源和敏感信息。...该工具可以使用与目标顶级域名关联的常见子域名列表作为检测源,并通过各种方法来尝试识别和发现目标设备中微软预置软件的有效实例。  ...支持的产品  该工具使用了四种不同的功能模块,对应的是能够扫描、识别和发下你下列微软预置软件产品: Exchange RD Web ADFS Skype企业版  工具安装  该工具基于Python开发,...因此我们首先需要在本地设备上安装并配置好Python环境。...rdp 搜索微软RD Web服务器 skype 搜索微软Skype服务器  工具使用样例  使用顶级域名搜索相关的ADFS服务器: msprobe adfs acme.com 使用顶级域名配合

    1.2K20

    使用 Zod 掌握 TypeScript 中的模式验证

    实现项目中的模式验证:使用 Zod 在这篇文章中,我们将带您了解如何利用 Zod 在项目中实现模式验证。Zod 是一个功能强大的开源 TypeScript 库,旨在声明模式并执行验证。...我们将深入探讨选择 Zod 进行模式验证背后的原因,提供实际示例来说明其用法,甚至与替代库进行比较。 引言 作为软件工程师,我们经常需要处理数据验证和类型安全。...zod 安装完成后,您就可以开始使用 Zod 来定义和验证数据模式。...使用 Zod 定义模式 Zod 中的一个核心概念是 z 对象,它可以让您轻松定义数据模式。...其他库如 Joi 和 Yup 也有各自的优势,尤其是在您在 JavaScript 环境中工作或需要其他用例的验证时。评估选项并选择与项目需求最符合的选项是一个明智的做法。

    1K10

    边缘计算:需要改变什么来增加它的使用

    但是,如果你开始试图弄清楚如何移动到边缘架构,你很可能会发现,实际上利用边缘计算比谈论为什么你应该这样做的原因要困难得多。 事实上,许多企业在采用边缘计算方面仍存在许多障碍。...公共云供应商正在努力通过提供AWSSnowball等服务来应对这一挑战,这些服务旨在让客户更轻松地将云工作负载迁移到本地站点。但是这些解决方案仍然需要花费大量资金,并且不一定适合小型组织的预算。...这仍然是一个悬而未决的问题。 您可以尝试使用公共云供应商提供的边缘管理服务,但它们往往只支持特定类型的边缘工作负载或设备。您还可以使用Kubernetes这样的平台,它擅长管理分布式工作负载。...但是边缘编排不是Kubernetes的主要用例,您需要投入一些时间和精力来设置它来完成这项工作。 简而言之,仍然没有简单、快速的解决方案来协调边缘工作负载。...这可能意味着企业在边缘方面需要妥协。他们可能必须根据位于这些地区的用户数量,战略性地考虑哪些地区将从边缘部署中受益最大,哪些地区将不得不适应传统架构。

    39420

    为什么说模型需要 token 来思考,token 就像是⼤模型的时间

    模型需要token来思考,因为在大型语言模型(如GPT系列)中,token是处理和生成文本的基本单位。...这些模型通过接收一系列的token(可以是单词、字符或者其他形式的数据片段),根据这些输入的token来预测下一个token或者生成文本。...在这个过程中,每个token都可以被看作是模型进行信息处理、推理和生成回应的一个时间步骤。...因此,token在模型的“思考”过程中起到了决定性的作用,它们就像是模型处理信息和进行推理的“时间”,每个token都是模型在特定时间点上的思考和处理的结果。...这种方式使得模型能够基于累积的token序列进行复杂的语言理解和生成任务。

    13500

    如何使用 TypeScript 中的 as const 创建只读对象

    // 这会导致错误,因为 person 是只读的 console.log(person.name); // 输出 "Alice" 在这个例子中,我们使用 as const 创建了一个名为 person...const; deepReadonlyObject.a.b.c = 2; // 这会导致错误,因为所有属性都是只读的 在第一个例子中,deepObject 的属性仍然可以修改。...在第二个例子中,deepReadonlyObject 的所有属性,包括嵌套属性,都是只读的,无法修改。 实际应用场景 配置文件:使用 as const 定义配置文件,确保配置项不被意外修改。...例如,确保组件属性在使用过程中不会被修改。...如果你想了解更多关于 TypeScript 的高级特性和实战技巧,欢迎关注我的公众号「前端达人」。在这里,我们一起探索前端开发的无限可能,共同提升技术水平!

    11110

    VueJs中的shallowRef与shallowReactive的使用比较

    01 shallowRef()函数 如果传入基本数据类型,那么shallowRef与ref的作用基本没有什么区别,也就是浅层的ref的内部值将会原样的存储和暴露,并不会被深层递归地转为响应式 但如果是对象的话...,那么就存在区别了的,shallowRef不处理对象类型的数据 其实,它就是只处理基本数据类型的响应式,不进行对象的响应式处理 性能优化,应用场景:如果有一个对象数据,后续功能不会修改该对象中的属性,而是生的对象来替换...,也就是只处理第一层对象的数据,在往下嵌套的数据,操作数据是不起作用的 只考虑对象第一层的数据响应式,在第一层嵌套下的数据不考虑 与reactive()不同,没有深层及的转换,一个浅层响应式对象里只有根级别的属性是响应式的...,属性的值会被原样存储和暴露,这意味着值为ref的属性不会被自动解构的 性能优化:具体应用场景: 如果有一个对象数据,数据结构比较深,复杂,但变化时只需要外层属性变化,那么就可以使用shallowReactive...与shallowRef在某些特殊的应用场景下,是可以提升性能的,前者针对对象,用于浅层作用的响应式数据处理,而后者只处理基本数据类型的响应式,不进行对象的响应式处理

    1.2K30

    视频中为什么需要这么多的颜色空间?

    我们经常会用到不同的色彩空间:非线性 RGB、线性 RGB、YUV、XYZ……为什么需要这么多的色彩空间呢?...由于人类视觉感知系统不是以线性方式工作的,因此必须使用非线性曲线来对 ADC 生成的线性数据进行变换,从而使得拍摄的图像色调与我们的视觉系统的工作方式相匹配。...而 XYZ(CIE 1931 XYZ color space)[16] 具备设备无关、线性操作的特性。 在 FFmpeg 中,主要使用 colorspace 滤镜 来完成不同色域空间的转换。...[25] 因此,显示屏(监视器、电视机、屏幕等等)仅使用 RGB 模型,并以不同的方式来组织,并显示最终的图像。...signalstats计算色调、饱和度的算法如下所示: 如果需要得到视频的标准 HSL信息,可以使用作者开发的 vf_hsl 滤镜[31]。

    1K50

    为什么需要消息队列,及使用消息队列的好处?

    性能,这个不必多说了,消息队列的吞吐量上去了,整个系统的内部通信效率也会有提高。 二、为什么需要消息队列?...3)任务处理类的系统,先把用户发起的任务请求接收过来存到消息队列中,然后后端开启多个应用程序从队列中取任务进行处理。 三、使用消息队列有什么好处?...3.1、提高系统响应速度 使用了消息队列,生产者一方,把消息往队列里一扔,就可以立马返回,响应用户了。无需等待处理结果。 处理结果可以让用户稍后自己来取,如医院取化验单。...所以,这种情景下,一个介于逻辑节点和db节点之间的缓存节点就是理所当然的事情了。这个缓存节点其实很多时候也可以看作是一个更复杂的消息队列节点。 四、为什么需要分布式?...4.1、多系统协作需要分布式 消息队列中的数据需要在多个系统间共享数据才能发挥价值。所以必须提供分布式通信机制、协同机制。

    54720

    TypeScript 中的基础类型:原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型

    TypeScript 强大的类型系统使得开发者能够更轻松地编写可维护、可扩展的代码。本文将详细介绍 TypeScript 中的基础类型,包括原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型。...原始类型在 TypeScript 中,有以下几种原始类型:数字类型数字类型用于表示整数或浮点数。可以使用 number 关键字来声明数字变量。...可以使用 enum 关键字来声明枚举类型。...例如:enum Color { Red, Green, Blue,}let color: Color = Color.Green;在枚举类型中,每个枚举成员都有一个与它关联的数字值,默认从 0 开始...也可以手动指定枚举成员的数值。联合类型联合类型用于表示一个变量可以是多种类型之一。可以使用 类型1 | 类型2 | ... 的语法来声明联合类型。

    78330

    vueJs中toRaw与markRaw函数的使用比较

    这是一个可以用临时读取而不引起代理访问/跟踪开销,或是写入而不触发更改的特殊方法,在官方文档里,是不建议保存对原始对象的持久引用 使用场景:用于读取响应式对象的普通对象,对这个普通对象的所有操作,不会引起页面的更新...,如果没有把整个对象对外暴露出去,模板中使用新增的变量是不生效的(针对setup函数形式) 02 markRaw()函数 接收一个原始数据,标记一个对象,使它永远不会再成为响应式对象,也就是数据在逻辑中即使修改变化了.../只读转换,并在状态关系谱中嵌入原始,非代理的对象 如果把一个嵌套的,没有标记的原始对象设置成一个响应式对象,然后再次访问它,你获取到的是代理的版本,这可能会导致对象身份风险 即执行一个依赖于对象身份的操作...,但却同时使用了同一对象的原始版本和代理版本 const foo = markRaw({ nested: {} }) const bar = reactive({ // 尽管 `foo` 被标记为了原始对象...,将一个响应式数据变为非响应式数据 而toRaw只针对响应式对象类型的数据起作用,如果涉及到将一个响应式数据转变为非响应式数据,只用于纯数据的渲染,不引起页面的更新,就可以使用toRaw或markRaw

    1.3K10

    13个需要知道的方法:使用 JavaScript 来操作 DOM

    它表示文档的结构,并将页面连接到编程语言。它的结构是一个逻辑树。每个分支结束于一个节点,每个节点包含子节点、对象。DOM API非常庞大,在本文中,咱们只讨论比较常用有有用的那些API。...document.querySelectorAll 方法返回与指定的选择器组匹配的文档中的元素列表 (使用深度优先的先序遍历文档的节点)。返回的对象是 NodeList 。...请注意,返回的节点不再是DOM的一部分,而是仍存在于内存中。 如果处理不当,可能会导致内存泄漏。...HTML或XML,并将结果节点插入到DOM树中的指定位置。...它不会重新解析它正在使用的元素,因此它不会破坏元素内的现有元素。这避免了额外的序列化步骤,使其比直接innerHTML操作更快。

    66720

    美国人的简易衣架为什么需要工业机器人来做?

    也许你的第一反应是这样的:美国人民做个衣架都那么高大上,真“壕”!其实背后的原因却没那么简单。 老衣架厂的挑战 成立于1943年的M&B衣架厂是这个行业中历史最悠久的企业,已经有74年的历史了。...然而,随着全球化发展,亚洲竞争对手凭借廉价的劳动力,给这家老厂带来很大的生存压力。 “我们必须用更少的钱来制作更多的衣架!” 于是M&B开始寻求与机器人合作。...在工厂里,一个由六台机器人组成的机器人工作组从事着起重和包装的工作,并借助视觉感应系统对衣架进行快速收集、检验及分类。而工人们现在只需要负责流程监督。...在生产线下游,另一台机器人负责码垛,将工人从危险而辛苦的体力劳动中彻底解放出来。 ?...迈向光明未来的一大步 通过巧妙地使用机器人自动化, M&B获得了更快的生产效率,同时提高了包装精度,减少了浪费。

    66250

    vueJs中readonly与shallowReadonly函数的使用比较

    01 readonly()函数 让一个响应式数据变为只读的,接收一个响应式数据,经过readonly加工处理一下,那么新赋值的数据都不允许修改 接受一个对象 (不论是响应式还是普通的) 或是一个 ref...,返回一个原值的只读代理 页面没有更新有两种情况 [1]....02 shallowReadonly()函数 接收一个响应式数据,经过shallowreadonly的处理,变成一个只读的,只考虑对象的第一层数据,不可以修改,但是第一层嵌套里的深层数据却支持修改 让一个响应式数据变为只读能力...+ 总结 readonly与shallowReadonly都是让响应式数据只具备读的能力,后者是浅层次的只读,也就是只对数据对象第一层起作用,深层次的嵌套,当时用shallowReadonl()处理时...,深层次数据支持被修改 在不希望数据被修改,或当数据是从别的地方取过来,不希望影响源数据时,使用readonly()或shallowReadonly()就很有用 至于数据能不能修改是由写代码的开发者决定的

    91220

    比较Go、Rust、Scala、Java、Kotlin、Python、Typescript 和 Elm中的编译器错误

    开发人员的生产力受多种因素影响。我们比较了 Go、Rust、Python、Typescript、Scala 和 Java 中的编译器消息。...Typescript 非常非常简短的错误消息,不显示有问题的源代码行,仅与 IDE 配合使用,措辞良好 Go 与 Typescript 相似,不显示有问题的源代码行,仅与 IDE 配合使用,措辞良好...建议使用现有方法进行帮助。具有冗长、可选的错误解释。可能是最好的 Elm 以开发人员为中心的冗长错误消息。建议使用现有方法来解决拼写错误。错误消息还包含一个提示,以了解/减轻错误情况。...我非常喜欢的一种语言(非常好的工具链),如果它没有为结构体使用借用检查器,而是使用可选的 GC,而不是用 Arc(喜欢 move 和 &mut 用于方法调用,每种语言都应该有这个,但我离题了)来修补所有内容...使用错误参数调用方法 要比较的第二件事是,我们使用 int, String 而不是 String, int 调用方法。 使用 Java,我们再次得到一条简短的错误消息。

    15010
    领券