我试图在C#Winforms中了解OOP,但我对此感到疑惑。
假设我正在使用Tcp协议建立聊天系统。我至少需要以下内容: - TcpListener; - 一个TcpClient; - 解析/处理数据包的东西; - 数据包加密系统。
我的问题是,我是否上课:
或者我做了2个课程: - SendReceive; (服务器和客户端) - PacketControl。 (数据包处理程序和加密类)
或者我只是把它弄错了?
是否有任何标准可以选择您在哪个班级中选择的内容? - 也欢迎链接。
感谢您的时间。
答案 0 :(得分:4)
您可能需要查看the solid principles或本文以查找一些设计指南。首先,你应该要求“责任”,然后尝试将它们分配给班级。尝试编写测试,你会发现较小的单位(单一责任)更容易测试。如果你需要一个处理不同事物的单位,它可能由其他单位组成(那时它是较小单位之间的主持人)。
答案 1 :(得分:0)
我从一个可以侦听端口或连接到ip地址/端口的Connection类开始。添加该类所需的任何代码以使其工作。
接下来,我将创建两个单独的类Server和Client。 (可能是两个单独的项目)。这些将设置您需要进行通信所需的任何代码,并从Connection类接收事件。
在此之后,我将向Connection类添加一些ecryption,方法是将其包装为EncryptedConnection类或将ConnectionClass扩展为子类。
答案 2 :(得分:0)
首先,我反对谈论“C#Winforms中的OOP”。无论语言如何,OOP都是OOP。
至于在哪些类之间画线,请尝试让每个类只有一个责任。我肯定会有一个单独的加密类。我不确定你想要ServerClass和pHandlerClass做什么,但是如果它只是从输入流中处理数据,调用解密类并将其发送到某个业务类以呈现给GUI,听起来它可能是在一堂课。一个“处理程序类”。
答案 3 :(得分:0)
首先,你可以通过不使用单词Class来缩短你的类名,这有助于使事情更清晰。
我教过的一种方法是命名系统中的所有内容,并尝试命名只有一个责任的对象 - 因此服务器,客户端,数据包,加密方案......混合职责是一种很好的获取方式事情很容易混淆,单一责任对象更容易测试。
答案 4 :(得分:0)
SOLID 是在软件开发过程中应该指导您的核心原则(如果您想创建可维护和可扩展的产品)。
首先'闻到'告诉你出了问题 - 重复。例如。如果您将在客户端和服务器类中复制发送和接收逻辑。因此,正确的方法是将该逻辑提取到单独的类/类中。 接下来'闻到' - 复杂性。如果很难理解代码的某些部分 - 那么你应该考虑如何简化它(例如,提取子类的类,提取方法甚至只是重命名变量)。
当你确定课程的责任时,尽量避免使用'AND'这个词,因为很可能是打破 SRP (单一责任原则)的“气味”。例如。此类用于发送包和加密它们。 BTW有一个很酷的东西,叫做“ crc cards ”,它可以帮助你做好课程的设计。
但你总是应该想 - 你真的需要所有的东西( YAGNI - 你不需要它) - 如果你正在为你写聊天,你需要那么酷的维护和可扩展性吗?奶奶和爷爷。
关于你的案例 - 在理想的世界里,我可能会做这样的事情:
客户端,服务器,频道(聊天频道抽象,可能是TcpChannel,MSMQChannel等),也可能是SecureChannel - 基本频道功能的简单装饰