写点什么

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:372019
用户头像

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

关注

评论

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

Mobileye的创新科技与方案将助力自动驾驶汽车畅行世界、惠及大众

E科讯

对于我们程序员来说,基本面是什么呢?

Java架构师迁哥

sync.singleflight 到底怎么用才对?

cyningsun

并发 Concurrency singleflight Cache Miss Go 语言

testing

创业失败启示录|校园微生活(故事篇 2)

阿萌

创业 28天写作 创业失败启示录 青城 人生故事

波场链智能合约软件开发|波场链智能合约APP系统开发

系统开发

安卓开发详解!Flutter全方位深入探索,吊打面试官系列!

欢喜学安卓

android 程序员 面试 移动开发

求职阿里Java 技术岗位的经历,三轮技术面+HR面,面试也不过如此

Java架构之路

Java 程序员 架构 面试 编程语言

量化自动交易系统开发,量化炒币

薇電13242772558

数字货币 策略模式

Java 程序经验小结:避免使用float和double表示精确数据

后台技术汇

28天写作

从根上理解高性能、高并发(四):深入操作系统,彻底理解同步与异步

JackJiang

网络编程 高并发 高性能 即时通讯

第九周作业

dll

WireMock 使用

hungxy

测试 WireMock

week8-homework

J

LeetCode题解:236. 二叉树的最近公共祖先,存储父节点,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

SpringCloud 从入门到精通 09--- 支付服务集群

Felix

程序员的五年:双非学历,两年进入苏宁,五年跳槽到阿里,建议收藏!

996小迁

Java 架构 面试 JVM Spring全家桶

面向对象之魔术方法· 第1篇《__init__方法,__new__方法》

清菡软件测试

测试

华为云张昆:支持全场景全业务,GaussDB加速企业数字化转型

华为云开发者联盟

数据库

Spring中@Import的作用

张健

用技术的方式,在UI设计稿中设置随机码,保证高清

行者AI

Python

Dubbo 版 Swagger 来啦!Dubbo-Api-Docs 发布

阿里巴巴云原生

Java 云原生 dubbo 大前端 中间件

Alluxio Day 2021 线上直播

腾讯云大数据

大数据

毕业三年,从小公司到大厂,先后四面阿里、小米、美团等,终于收到offer!

Java架构之路

Java 程序员 架构 面试 编程语言

连续三年蝉联第一,Flink 荣膺全球最活跃的 Apache 开源项目

Apache Flink

Apache flink

真是太刺激了!美团CTO五轮面试,Java岗高级工程师一二三四五面面经(已拿到offer)

Java架构之路

Java 程序员 架构 面试 编程语言

脱不花:怎样成为高效学习的人 学习笔记

魔曦

SpringCloud 从入门到精通 08--- Eureka集群

Felix

即构推出低延迟直播产品L3,可将直播延迟降到1s

ZEGO即构

阿里开发7年大牛:闭关60天学懂NDK+Flutter,大厂面试题汇总

欢喜学安卓

android 程序员 面试 移动开发

【设计模式】断路器模式

soolaugust

设计模式 28天写作

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