您的位置 首页 > 德语词汇

newtype是什么意思、读音,一种新的设计模式:newtype

各位老铁们好,相信很多人对newtype是什么意思、读音都不是特别的了解,因此呢,今天就来为大家分享下关于newtype是什么意思、读音以及一种新的设计模式:newtype的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

设计模式是在编写代码时在各种不同情况下出现的模式。在本文中,我将讨论Newtype设计模式。具体来说,我将以Rust编程语言为背景来讨论它,以及如何解决在Rust中使用Newtype模式时出现的一些问题。

Rust的设计模式

newtype是什么意思、读音,一种新的设计模式:newtype

编程设计模式是指在编写代码时在各种不同情况下出现的模式,这并不是说有了设计模式你就不需要自己去思考问题,而是设计模式给你提供了一个工具箱,帮助你去思考解决方案。

不同的编程语言有不同的表达方式。关于设计模式的经典书籍《设计模式,ElementsofReusableObject-OrientedSoftware》,围绕面向对象的C++和Smalltalk为例介绍各种模式。虽然这些模式中的大部分仍然适用于其他面向对象的编程语言,但它们可能需要进行调整才能使它们很好地工作。

Rust是一门有趣的编程语言,因为该语言的设计借鉴了面向对象、过程式和函数式编程语言的思想。这意味着有不同的模式是有用的,现有的模式可能会以一种新的方式更好地表达。

在这篇文章中,我将解释一个我在Rust代码中发现有用的模式:Newtype模式。

问题描述:基本数据类型是非描述性的

想象一下,我们正在编写一个大型代码库。像许多项目一样,项目包括一些用户信息,所以有一个结构,如下。

pubstructPerson{pubname:String,pubphone_number:String,pubid_number:String,pubage:u32}

几个月后,在代码库的另一个角落看到一些代码,这可能从数据库中删除一个人,函数参数如下:

pubfnload_person(person:String)->Result<Person>;

汗……那个参数是什么字段?这个人的身份证ID吗?还是他的名字?

还有年龄字段可能也会让人迷糊,比如说,你会如何实现这个函数?

pubfntime_to_retirement(current_age:u32)->u32;

是以年为单位的年龄?一般情况下,时间戳都是以秒为单位存储的,所以可能是传递一个以秒为单位的年龄?

Newtype设计模式

Newtype模式是这样场景,一个结构体里面有很多基本类型。

让我们看看如何将它应用到person例子中。

你首先要定义Newtype。设计模式只是一个值,包裹在一个结构中。

pubstructName(String);pubstructPhoneNumber(String);pubstructIdNumber(String);pubstructYears(u32);

如果你没见过这样的结构体,字段没有命名,这个结构体叫tuplestruct。Newtype是它的一个特例,只有一个字段。

然后你可以开始在你的Person结构中使用你的新类型。

pubstructPerson{pubname:Name,pubphone_number:PhoneNumber,pubid_number:IdNumber,pubage:Years}

好处显而易见,我们的load_person函数更加清晰。比如类型是IdNumber而不是String,你就知道我们要传入这个人的ID号。

pubfnload_person(person:IdNumber)->Result<Person>;

年龄字段现在也更清晰了,Years类型使得我们的年龄很明显是以年为单位,而不是以秒为单位。

pubfntime_to_retirement(current_age:Years)->Years;

字符串是Newtypes的常见用例,因为你可以用它们来增加对字符串格式化的验证。例如有些国家身份证号有特定的格式,因此可以更方便对其进行验证。

pubstructPhoneNumber(String);implPhoneNumber{pubfnnew(s:String)->PhoneNumber{PhoneNumber(s)}pubfnas_str(&self)->&str{//Wedidn'tnametheinnertype,soitfollowsthesame//namingconventionastuples.Inotherwords,theinner//fieldiscalled`0`.&self.0}}fnmain{letnum=PhoneNumber::new("555-1234".to_string);println!("{}",num.as_str)}

构建及parse身份证号例子

//cargo-deps:derive_more="0.99"externcratederive_more;usederive_more::{Display,Deref};#[derive(Display,Debug,Deref,PartialEq)]pubstructIdNumber(String);usestd::str::FromStr;implFromStrforIdNumber{typeErr=IdNumberParseError;fnfrom_str(s:&str)->Result<Self,Self::Err>{ifs.len!=13{Err(IdNumberParseError::InvalidFormat)}else{Ok(IdNumber(s.to_string))}}}#[derive(Display,Debug,PartialEq)]pubenumIdNumberParseError{InvalidFormat}implstd::error::ErrorforIdNumberParseError{}fnmain{letid=IdNumber::from_str("12345");assert_eq!(id,Err(IdNumberParseError::InvalidFormat));letid=IdNumber::from_str("1234567890123").unwrap;println!("MyIDNumberis{}",id);}

很简单吧,是不是又轻松get到了一种新的设计模式?有什么感想欢迎留言。

https://www.worthe-it.co.za/blog/2020-10-31-newtype-pattern-in-rust.html

本文由高可用架构翻译,技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。

改变互联网的构建方式

关于newtype是什么意思、读音和一种新的设计模式:newtype的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023