C# 苹果还是水果的C级?

C# 苹果还是水果的C级?,c#,winforms,oop,class,C#,Winforms,Oop,Class,我试图在C#Winforms中实现OOP,但我想知道一些事情 假设我正在使用Tcp协议制作一个聊天系统。我至少需要以下信息: -一个骗子; -TCP客户; -解析/处理数据包的东西; -数据包加密系统 我的问题是,我是否将课程命名为: 服务器 客户 加密 打包工 或者我做两个类,叫做: -发送接收;(服务器和客户端) -包装控制。(数据包处理程序和加密类) 还是我完全错了 有什么标准来选择你在哪门课上放的东西吗-链接也很受欢迎 谢谢您的时间。您可能想看看这篇文章或找到一些设计指南行。首先你应

我试图在C#Winforms中实现OOP,但我想知道一些事情

假设我正在使用Tcp协议制作一个聊天系统。我至少需要以下信息: -一个骗子; -TCP客户; -解析/处理数据包的东西; -数据包加密系统

我的问题是,我是否将课程命名为:

  • 服务器
  • 客户
  • 加密
  • 打包工
或者我做两个类,叫做: -发送接收;(服务器和客户端) -包装控制。(数据包处理程序和加密类)

还是我完全错了

有什么标准来选择你在哪门课上放的东西吗-链接也很受欢迎


谢谢您的时间。

您可能想看看这篇文章或找到一些设计指南行。首先你应该要求“责任”,然后试着把它们分配给班级。试着编写测试,你会发现更小的单元(单一职责)更容易测试。如果您需要一个处理不同事情的单元,它可能由其他单元组成(它是较小单元之间的调节器)。

我将从一个连接类开始,它可以侦听端口或连接到ip地址/端口。向该类添加任何需要的代码以使其工作

接下来,我将创建两个独立的类Server和Client。(可能是两个独立的项目)。这些将设置您需要的任何代码来通信和接收连接类中的事件


在此之后,我将向Connection类添加一些加密,或者用EncryptedConnection类包装它,或者将ConnectionClass扩展为一个子类。

首先,我反对谈论“C#Winforms中的OOP”。OOP是OOP,与语言无关


至于在班级之间划清界限,试着让每个班级只承担一项责任。我肯定会有一个单独的加密类。我不确定您想要ServerClass和pHandlerClass做什么,但是如果它只是从input流中提取数据,调用解密类并将其发送到某个业务类以呈现到GUI,那么听起来它可能在一个类中。一个“处理程序类”

首先,您可以通过在类名中不使用class这个词来缩短类名,这将有助于使事情更清楚


我学到的一种方法是命名系统中的所有东西,并尝试命名只有一个职责的对象——因此服务器、客户端、数据包、加密模式。。。混合责任是一种很容易混淆事物的好方法,而单一责任对象更容易测试。

SOLID是在软件开发过程中指导您的核心原则(如果您想要创建可维护和可扩展的产品)

首先是“气味”告诉你出了问题——重复。例如,如果要在客户端和服务器类中复制发送和接收逻辑。因此,正确的方法是将该逻辑提取到单独的类中。 下一个“气味”——复杂性。如果很难理解代码的某些部分,那么您应该考虑如何简化它(例如,提取子类的类、提取方法,甚至只是重命名变量)

当你们决定班级的责任时,尽量避免使用“和”这个词,因为这很可能是一种违反SRP(单一责任原则)的“味道”。例如,此类用于发送包并对其进行加密。顺便说一句,有一种叫做“crc卡”的很酷的东西,它可能会帮助你做好类的设计

但是你应该一直思考——你真的需要所有这些东西吗(YAGNI——你不会需要它的)——如果你在为你的爷爷奶奶写聊天软件,你需要这种很酷的维护和可扩展性吗

关于你的情况——在理想世界中,我可能会这样做:


客户端、服务器、频道(聊天频道抽象,可以是TcpChannel、MSMQChannel等),还有可能是SecureChannel-基本频道功能的简单装饰器

你不应该在类名的末尾加上Class这个词。@Jannis我在这里,我想我可以通过说这只是为了澄清它们的功能来避免这种评论。我想我应该加上“它们是什么。”。你在考虑实现细节的同时,也在考虑一个好的设计。将你的思维方式改为“设计”一个系统,而不是“构建”一个系统。按照“this”是“Server”,而不是“this”是“Server Class”。。。直接映射到您所表示的“真实”对象。@Tim Barrass听起来很有趣,您是否愿意用一个例子来详细说明这一点?我知道你的意思,但如果可能的话,我真的很想看一个例子。很抱歉,这是为了防止有人想举个例子。ServerClass将包括TcpListener,因为它有点像服务器。pHandlerClass将包含数据包解析系统,或确定应该触发哪个方法的系统。谢谢你的提示,非常有用。看起来真的很好,谢谢你的链接。我一会儿就看。我想你是对的,我只是需要写很多测试来掌握它的窍门。我只是想说清楚,所以我的第一个例子是正确的选择?