SUMTEC -- There's a thing in my bloglet.

But it's not only one. It's many. It's the same as other things but it exactly likes nothing else...

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  263 随笔 :: 19 文章 :: 3009 评论 :: 74万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

话说上一回,Jack说还有一个小概念,什么概念呢?

Jack:是这样的,我看了一下你的代码,我想问一下你的MyTreeQueueCollection为什么要实现一个IMyTreeQueueCollection的接口呢?

Sumtec:我们也听说过要面向抽象,我希望这里是抽象的,其他使用到MyTreeCollection的地方就尽可能用IMyTreeQueueCollection接口。

Jack:哦,是这样吗?我也觉得广优是一个不错的算法,所以我打算在数据库查询中也使用广优这个算法,你觉得如何?

Sumtec:听起来好像牛头不对马嘴,我想你的意思是不是接口跟抽象没有关系?

Jack:呵呵,先说说我以前刚接触“接口”这个概念的时候吧。那个时候我觉得这是一个很神奇的东西,觉得所有地方都应该用到它,可是没有多久就发现,这样做非常的累,而且也没有效果。后来呢,听说接口就是为了更好的进行抽象与隔离,我又试图在需要抽象或者隔离的地方用接口,但是还是觉得有点毛病。

Sumtec:嗯,我也有这方面的困惑,不知道什么地方该用接口,什么地方不该用。

Jack:首先要记住一点,你也许永远也不需要它。这个它除了是接口,还可以是任何东西。如果你在写程序的时候没有遇到你必须要用到技术,那就不要使用,即使你可能将会用到它。有可能会表示有可能不会,随便乱用不需要的技术可能会付出代价的。

Sumtec:嗯,这么说来,这里用接口似乎没有什么必要,所以不需要使用,对吗?

Jack:对,并且其次,再类上面实现一个接口的目的,实际上不是为了“抽象”或者“隔离”,尽管它的作用确实是抽象和隔离。你看一下.NET类库里面的Hashtable,它上面有些什么接口呢?有IDictionary,有ICloneable等等,但就是没有IHashtable,为什么?

Sumtec:我也不知道,我原来以为如果有IHashtable会更好,因为这样我可以提供一个完全不同的哈希表实现方式了,而不需要从Hashtable继承了。不过听你说起来,好像不应该这么做。

Jack:至少我觉得不应该。在我看来,接口至少应该是提供一种服务。你看,哈希表能够提供字典的服务,能够提供克隆自身的服务等等。

Sumtec:那为什么不能够说IHashtable提供的是哈希表服务呢?

Jack:你所说的哈希表服务,从更高的抽象角度来说,实际上就是一种字典服务。我想字典服务的定义已经完全包含了“哈希表服务”了,不是吗?或者你觉得在字典服务的基础上,还需要提供些什么才能够满足哈希表服务的要求呢?

Sumtec:……明白了。

Jack:有的时候甚至提供一个服务并不是非要用接口不可的,你看看System.Security.CryptoGraphy里面的HashAlgorithm,这个可以算是一种密码学散列服务吧?可是他并没有被抽象成一个接口。

Sumtec:咦?对哦。

Jack:实际上抽象和隔离,甚至提供一种服务等等,都有很多手段去实现。当然,如果你明确是提供一种服务的话,那么用接口应该是比较适合的。关于这个话题,我想说两天两夜也说不完。

Sumtec:听了这些,感觉似乎有点明白了。不过我担心写起来的时候又分不清楚什么是服务了……

Jack:没关系,你尽量就可以了。人学会新的知识的时候,总会有使用它的欲望,甚至会见到什么都要尝试去用它,压抑这种欲望是非常困难的。而且你没有用过,怎么知道到底应该怎么用呢?

Sumtec:嗯,那好,我想先试一下,你看对不对。比如说,有一个MyTreeCollection,它……

Jack:慢着,你的思路还是没有转过来。你怎么知道就必须要有这么一个MyTreeCollection呢?你应该先确定有一个游戏,游戏需要玩家、棋盘、棋子、规则等等,从这个方向去看。等你完成了这一步了,再往下看玩家需要什么,棋盘需要什么,棋子需要什么。还记得上一次我给你演示的那个什么代码也不写,却能够运行吗?你先去做一下,有问题了再来找我,我有点事情要出去了,不好意思啊。

Sumtec:哪里哪里,是我麻烦了你半天了,不好意思的是我才对。那好,我先走了,88

Sumtec回去之后忙活了半天,终于完成了第一个“可以运行的”版本。这一个版本的思路是怎么出来的,稍后再聊。

(待续)

posted on   Sumtec  阅读(3564)  评论(6编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示