从C++到.NET:公共类型系统的设计空间

目录

本机枚举与托管枚举

单个类解决方案

五个类解决方案

六个类解决方案

自 2006 年 6 月介绍安装“从 C++ 到 .NET”的主题后,我就着手撰写一系列专栏,深入探讨如何使用 Visual C++ 2005 中的 C++/CLI 语言扩展,将有效的本机 C++ 应用程序移到 Microsoft .NET Framework 上。我所移动的示例应用程序是文本查询语言 (Text Query Language, TQL),这是在 1996 年针对我编写的书籍 C++ Primer 的第三版而开发的。

六月份,我开始了一系列专栏,介绍如何包装本机 TQL 应用程序,接着在 2006 年 8 月份,我仔细检查并整理了代码。上个月,我概要介绍了如何在 .NET Framework 中使用正则表达式。您可以通过从 C++ 到 .NET(2006 年 6 月)和从 C++ 到 .NET(2006 年 6 月)找到这些以前的专栏文章。

TQL 设计用于支持两种操作:

对于每个唯一字词,将用户指定的随机文本文件规范化为行号匹配项的映射。

根据该映射处理用户查询,以显示文本的匹配行。

设计文本规范化的目的是为了阐释集合类的重要作用。在本机实现中,它使用标准模板库 (Standard Template Library, STL)。在后续的某个专栏中,我将着眼于这一设计内容,以深入探讨 .NET 基类库 (BCL) 的泛型集合命名空间。设计文本查询支持的目的是为了阐述一种重要但很基本的类设计。而 C++/CLI 编程设计的这一方面正是我要在本专栏中着重介绍的内容。

通过 TQL,用户可以使用一系列表示关系的逻辑标记来查询文本文件,这些逻辑标记包括:&& 表示“与”;|| 表示“或”;而 ! 表示“非”。因此,若要找到 Holmes 的所有匹配项,只需键入“Holmes”(不包括引号)。如果您希望查找其中不出现 Holmes 的所有文本行,只需在 Holmes 的前面附加“非”运算符 (!Holmes)。如果您的目标是查找 Sherlock 或 Holmes 的所有匹配项,则需要使用“或”运算符将这两个字词连接起来 (Sherlock || Holmes)。最后,要找到 Sherlock 且后面紧跟 Holmes 的所有匹配项,则需要使用“与”运算符连接这两个字词 (Sherlock && Holmes)。

不可否认,在今天的搜索引擎世界中,这似乎很微不足道。但是,对于考察各种类设计策略而言,这种方法确实是对症下药。请记住,本机实现的历史已经有十多年了 - 我在此只是使用 C++/CLI 将其改写,以用于 .NET Framework 中。

这一设计的候选抽象概念是用户可能使用的四种类型的查询。起初,我们将它们表示为一系列枚举,如下所示:

enum EQueryType { // native enum
qWord = 1, qNot, qOr, qAnd
};
我之所以选择这种方法,原因有二。第一,您将需要此枚举以实施我的一种设计解决方案;第二,我希望提供有关使用 C++/CLI 实现枚举支持的简要教程。

本机枚举与托管枚举

不熟悉 C++/CLI 的编程人员所询问的第一个问题是我刚才介绍的本机枚举与类似如下的等效托管枚举之间有何差异:

class enum EQueryType : Byte { // managed enum
qWord = 1, qNot, qOr, qAnd
};

主要差异有三个。

第一个差异是大小管理的粒度。在本例中,我指定一个字节的存储空间足以表示每个枚举器值(共四个值)。此功能也已被扩展到 C++ 的本机支持中,而不仅仅在 Visual C++ 中(非标准扩展)。

第二个差异是枚举器的范围。在托管环境中,枚举可以保持自己的范围,因而,它可以采用与类封装其成员可见性的相同方式来封装其枚举器的可见性。当然,这对于本机枚举并不正确,因为枚举器全部分散到封闭范围内。当组合来自多个站点的模块时,这可能会成为一个问题。为防止枚举器污染全局命名空间,本机 C++ 的一个设计惯例是在类中嵌套枚举,如下所示:

class ios {
public:
enum iostates { read, write, append };
// ...
}

要访问这些枚举器中的任何一个,可以在枚举器前面加上类范围运算符,例如 ios::read。这对于托管枚举并不是好的设计惯例,因为它会导致两层封装,如 ios::iostates::read。因此,托管枚举通常在类的共享范围内定义,其作用是支持本机枚举,而不是在该类中提供支持。

第三个差异是:与整数相比,托管枚举与对象更为相似。这就允许正确地解析重载函数,如下所示:

void f( int );
void f( Object^ );
EQueryType et;
f( et ); // which one?

如果托管枚举被视为整型 - 与本机枚举一样 - 则此调用必须匹配 f(int)。然而,如果公共类型系统 (CTS) 中的后备枚举类属于从对象中派生的值类型,则其类型必须明确绑定到对象,而不绑定到整数。因此,可以得出结论,托管枚举属于一种对象,而不是一种整数。

我希望这点已很清楚,因为我没有时间更有力地就这一结论展开讨论。尽管这是一个合理的结论,但存在令人遗憾的副作用:没有将托管枚举或它的其中一个枚举器隐式转换为整数的机制,因此,每次用作算术值时都需要显式转换,这的确比较麻烦。

因此,TQL 应用程序具有四种需要处理的具体类型:字词 (Word)、与 (And)、或 (Or) 和非 (Not)。但是,需要多少个类呢?我的设计解决方案提供了 1、5 或 6 个类。下面我们逐步探讨设计方法,并了解哪些内容对您有启发作用。

时间: 2025-01-07 16:25:35

从C++到.NET:公共类型系统的设计空间的相关文章

移动设计空间节省之道

  一位优秀的厨子,必须熟练掌握切菜的各种刀法:直切.侧切.推切.拉切.转切-.设计如是,在节省空间之道上,同样有一些基础"刀法"可以帮助我们打造精致的app. 1. 聚 即聚拢.收纳,最朴实的节省空间的方式之一,可以轻松将归属一类的东西聚集起来放一块,办公用品.日常小工具.化妆品.衣服.家用医药-.能装的,都给它装下. 移动设计中也经常使用actionsheet.popover这些"容器"将各种菜单.通知.相关项收到一块. 2.藏 聚和藏有点类似,前者偏向归类,后

交互设计理论:简洁的设计并不一定是最好的

在电子产品的设计中,大家经常提到简洁是设计的重要元素.可是很多产品,不见得简洁就是第一要素.简洁的设计,必须是在对用户需求透彻理解,引导用户完成必要操作的基础之上,才提倡的一种去粗取精的设计减法.在平时生活中,我留心观察了身边的垃圾回收方式,想从垃圾分类回收的设计谈起,浅谈好的产品设计应具有的一些特点. 2010年3月1日,<北京晚报>刊登一篇题为<垃圾分类示范区遭遇分类尴尬>的文章.说该报长期关注的玄武区建功南里小区,被称为"中国第一个绿色社区",早在1997

宽带固定无线接入网MAC层设计

一.引言 宽带接入网被认为是信息高速公路的最后一公里,必将成为未来国家信息基础设施发展的重点.目前有几种宽带接入方式,如光纤接入.xDSL.宽带固定无线接入网等.与其它宽带接入方式相比,宽带固定无线接入网有许多优点,如建网快.低成本.易维修和可克服某些地理环境的限制等,已成为一种非常有前途的接入方式. 宽带固定无线接入网是指节点固定的无线通信系统,主要用来在用户终端和核心网之间传送数据[1].宽带固定无线接入网的拓扑结构如图1所示.宽带固定无线接入网是一种点到多点的结构,主要包括基站(BS).用

柯里化的前生今世(十):类型和类型系统

形式化方法 在计算机科学中,尤其在软件工程和硬件工程领域, 形式化方法(Formal method),是一种数学方法,用于软件和硬件系统的描述(specification).开发(development)和验证(verification).旨在能像其它工程学科一样,通过用数学进行分析,来提高设计的可靠性(reliability)和健壮性(robustness). 为了让系统表现的和规范(specification)一致,现代软件工程采用了一系列的形式化方法.其中包括一些强有力的框架,例如,霍尔逻

GNU通用公共授权(GNU General Public License)中英文版全文

中文版(原文:http://bergwolf.googlepages.com/gplv3_zh ) GNU 通用公共授权 第三版 2007 年6 月29 日 版权所有(C )2007 Free Software Foundation, Inc. (http://fsf.org) 允许所有人复制和发布本授权文件的完整版本 但不允许对它进行任何修改 导言 GNU 通用公共授权是一份针对软件和其他种类作品的自由的.公共的授权文件. 大多数软件授权申明被设计为剥夺您共享和修改软件的自由.相反地,GNU

基于云计算的电子政务公共平台国家标准研制启动

硅谷网9月3日讯 2013年8月30日,"基于云计算的电子政务公共平台"国家标准研讨会在南京中国电子科技集团公司第二十八研究所召开,会议启动了"基于云计算的电子政务公共平台"的服务管理规范.系统和数据技术接口规范.应用部署和应用迁移技术标准.数据管理技术标准.信息安全技术规范.服务安全技术规范.服务质量评价标准.运行保障管理标准等8项国家标准研制工作. 近年来,我国云计算技术和产业持续发展,应用和实践不断创新,成效逐步显现.理论和实践证明,运用云计算技术,充分发挥既

Leo|20页PPT剖析唯品会API网关设计与实践

刘璟宇Leo 唯品会资深研发工程师,在大型高性能分布式系统设计和开发方面有丰富的经验.目前在唯品会平台与架构部负责唯品会API网关和服务安全方面的设计.开发.运营工作. 内容解析 1. 为什么引入网关 唯品会是一家专门做特卖的网站,唯品会网站是一个巨大型的网站,每张页面背后,都有多个服务提供静态资源和动态数据. 这是唯品会网站上一张商品详情页面,内容是一款女式针织衫.页面里,除去静态页面.图片之外,有些动态内容:商品价格.促销提示语.产品介绍.商品库存等.每个部分都会从后端的一个或几个服务拉取数

神州数码发布自主研发的国内首个城市公共信息服务平台

摘要: 10月29日,神州数码发布自主研发的国内首个城市公共信息服务平台.作为中国智慧城市建设首个核心支撑系统,该平台立足我国城市发展现状,本着以人为中心的设计理念,以保障城市 10月29日,神州数码发布自主研发的国内首个城市公共信息服务平台.作为中国智慧城市建设首个核心支撑系统,该平台立足我国城市发展现状,本着"以人为中心"的设计理念,以保障城市的健康可持续发展为目标,充分利用云计算.大数据等新一代信息技术进行融合创新,为市民.企业和城市管理者提供了通畅的双向.多向信息沟通机制和便捷

基于云计算电子政务公共平台国标编制正式启动

7月1日消息,近日基于云计算http://www.aliyun.com/zixun/aggregation/14297.html">电子政务公共平台国家标准编制工作正式启动,包括总体标准.技术类标准.服务类标准.安全类标准.管理类标准等五大类共计18个标准. <国家电子政务"十二五"规划>把"建设完善电子政务公共平台"作为发展方向和应用重点之一,明确提出制定电子政务云计算标准规范.加快研究制定基于云计算的电子政务标准规范,主要包括系统架构