话说上一回,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回去之后忙活了半天,终于完成了第一个“可以运行的”版本。这一个版本的思路是怎么出来的,稍后再聊。
(待续)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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——大语言模型本地部署的极速利器