写点什么

LINQ 框架设计指南

  • 2008-03-18
  • 本文字数:1106 字

    阅读完需:约 4 分钟

如今,LINQ 的版本发布已经尘埃落定,是时候思考如何使用它了。Keith Farmer 甚至谈到了使用 LINQ 以消除子类。不过,在我们了解这些之前,还是先看看微软的官方指南吧。

根据框架设计指南的精神,微软发布了基于 LINQ 构建框架的设计指南。LINQ 框架设计指南涵盖了诸如 API 的设计与行为等主题。与很多公司制定的编码指南不同,它并没有包含设计的细枝末节,例如命名模式与格式,除非它们牵涉到公有的 API 库。

大多数框架设计指南最终都能够找到与 FxCOP 集成的方式。FxCOP 是一个代码分析工具,它被微软和其它公司用来确保编码的一致性。 在概括的介绍之后,该文档介绍了扩展方法(Extension Methods)和泛型委托 Func、Action 以及 Expression。在指南给出的标准警告中,有一个与命名空间冲突无关的指导——它要求在普通方法能够实现的情况下,不要滥用扩展方法。当两个库都公开了相同类型的扩展方法时,会发生方法名称的冲突。一旦发生,只能导入一个库,另一个库则必须使用完整的名称才能被引用。

在扩展 LINQ 一节中,对于如何命名泛型类型有一个颇有助益的建议。在类型名为 S 以指代包含元素项的集合时,名为 T 的泛型类型总是指代集合的元素项(items)。虽然这不是强制性的,但至少有助于阅读内建方法(built-in methods)。

对于性能,指南提出的一个建议是,如果性能牵涉到计算集合的元素总数,则实现 ICollection 有助于提高性能。当你只能实现 IEnumerable 时,就必须遍历整个集合才能得到集合的元素总数。

现在,再回头看看 Keith Farmer 提到的避免子类的方法:

我过去一直在考虑的一件事情是削减类的职责,使其只具备基本的定义:恰如其分的属性定义,与属性对应的方法,以及构造器和类型转换器。

然后使用扩展方法定义适当的操作,而不需要维护类作为自身实体的概念,这样就没有必要创建子类型了(即使子类型是可行的)。

例如,一个 Node 不需要知道 Graph 的操作也能够工作良好,也可以认为 Graph 不需要了解 IsNetworkRouter 的内容。

在这种情况下,类似于 Traverse(GraphLink) 这样的方法就属于 Graph 中很好的方法定义,而类似于 FindLeastWorkRoute(Node, Node) 这样的方法,由于它依赖于 GraphLink 的特定子类型的实现细节(即它具有一个关联的 Work 衡量标准),那么在我看来,这样的方法最好定义为一个扩展方法。

如果仅仅是为了实现应用程序特定的逻辑,而去创建一个自定义子类型,就会扰乱我们关注的类(例如,Graph 就胜过同时定义 Graph 和 GraphLink),而通过扩展方法就可以避免这样的情况。

这在.NET 编程环境下是有意义的吗?它是否遵循了微软的设计原则呢?或者对它而言,有多少是与这些指南相关的呢?

查看英文原文: LINQ Framework Design Guidelines

2008-03-18 21:372118
用户头像

发布了 109 篇内容, 共 41.1 次阅读, 收获喜欢 14 次。

关注

评论

发布
暂无评论
发现更多内容

安全可信 | 首批!天翼云边缘安全加速平台AccessOne通过信通院“软件自研创新能力”专项评估

天翼云开发者社区

云计算 云服务

NFTScan 成为 Coin98 官方 NFT 数据合作伙伴!

NFT Research

NFT\

视频编码耗时长、编码帧发送失败…DVPP视频编码问题典型案例分析

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

「悦数图数据库」正式登陆西部数据交易中心

悦数图数据库

图数据库 数据交易 数据要素

iOS App 上架流程图文教学

雪奈椰子

了解模型的元学习:Learning to Learn优化策略和Meta-Learner LSTM

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

DBA 抓包神器 tshark 测评

爱可生开源社区

MySQL 网络协议 TCP协议 抓包工具

全球企业KVM贡献榜公布,腾讯云再添1项核心突破

说山水

TS中, Array.reduce提示没有与此调用匹配的重载?

林十二XII

inBuilder今日分享丨RESTful API动态发布技术

inBuilder低代码平台

重磅!龙蜥社区联合 3 家理事单位发布人才培养计划,推出“龙蜥+”合作模式

OpenAnolis小助手

开源 生态 龙蜥社区 理事单位 人才培养计划

消保评级提升指南!保险公司如何高效开展消保工作?

中关村科金

解决方案

Kafka单机搭建(信任认证/口令认证)

Shen-Xmas

kafka zookeeper 测试 搭建 单机

智能坐席助手如何助力保险集团实现客户服务闭环管理?

中关村科金

企业服务 坐席助手

2023年三个最佳的免费PostgreSQL GUI工具

wljslmz

6 月 优质更文活动

分享|基于实时图技术的信用卡申请反欺诈应用

悦数图数据库

金融 图数据库 知识图谱 反欺诈

MySql性能调优:实用的实践与策略

xfgg

MySQL 6 月 优质更文活动

英特尔发布全新量子芯片Tunnel Falls,硅自选量子比特有望更快实现量产

E科讯

软件测试/测试开发丨Pytest结合数据驱动-Excel

测试人

程序员 软件测试 Excel 数据驱动 pytest

毕业季618双节狂欢!来华为阅读享品质阅听,0元读好书

最新动态

数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年5月刊

墨天轮

MySQL 数据库 oracle postgresql opengauss

如何在 Linux 上使用 `find` 和 `locate` 进行文件搜索?

wljslmz

6 月 优质更文活动

生态伙伴 | 华秋硬创联合湾加速,共同加速企业发展

华秋电子

Python初学者友好丨详解参数传递类型

华为云开发者联盟

Python 人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

风景如旧

风景壁纸

FP&A转型,企业全面预算管理发展的催化剂

智达方通

全面预算管理 企业全面预算管理

HMI和SCADA的定义 两者有什么不同

2D3D前端可视化开发

组态软件 工业自动化 SCADA 工业组态 HMI

亚毫秒 GC 暂停到底有多香?JDK17+ZGC 初体验|得物技术

得物技术

ZGC GC jdk17

主流文件共享平台的传输加密秘密

镭速

LINQ框架设计指南_.NET_Jonathan Allen_InfoQ精选文章