尝试让 main/form1 之外的类相互交互是否是一种不好的形式? [关闭]

2024-01-18

我试图学习在代码中使用类的正确方法,当它不是像一组客户、继承自动物的狗等显而易见的东西时。

我已将大部分代码分解为“功能”,例如Installer.cs, Downloader.cs, UiManager.cs。我能找到的让这些类与彼此的属性和方法交互的唯一方法是使它们全部静态,我在另一个问题中被告知这是错误的方法。

所以我的问题是三件事之一:

  1. 有一种方法可以让班级互相交谈,但我还不明白。

  2. 类永远不应该尝试相互交谈,而应该执行一次性操作,然后将某些内容返回给main/form1,然后主类可以使用它传递到另一个类以执行一次性操作。

  3. 类实际上只对创建大量实例有用,并且我需要完全了解一些其他结构,以便从主类中抽象出大量功能。

我能找到的所有教程和我观看的讲座似乎只是告诉你如何上课work,但不是何时以及如何在实际产品中使用它们。

编辑-一个更具体的例子:

假设我有一个字符串是整个应用程序的核心,并且需要被每个类查看和/或修改。如何在代码中移动这些信息,而不将所有内容都放在一个类中或使其静态?

我找不到让那根绳子继续存在的方法Form1而不将其设为静态(因为所有表单事件和函数都需要能够看到它才能将其传递给类)。

我看不到一种方法可以将字符串放入另一个类中,而不必使字符串和整个类静态,以便其他类可以看到它。

也许我在实际实例化类以及使对象相互交互时缺少一些东西。


我认为你所有的直觉都是对的。

  1. 不,没有。静态或实例。

  2. 这是一种设计选择(而且有很多选择)。我是一个务实的人,所以我认为生成 spaguethi 代码的设计模式是一个糟糕的设计模式选择。但是一个项目的糟糕设计模式对于另一个项目可能是一个好的设计模式。尝试阅读《Head First Design Pattern》一书。

  3. 是的,有接口和抽象类。

还有一些想法:

我认为不必避免使用静态方法或类。必须避免的是错误使用静态方法或类,就像错误使用语言中的所有内容一样。但是很难定义什么是静态的错误使用,并且因为静态方法或类特别危险,所以人们喜欢说完全避免使用 static 关键字。除非您结束应用程序,否则静态方法将保存在内存中,因此,如果您不在静态方法内释放连接,那么您的日子将会非常糟糕。

我有一个实用程序项目,在实用程序项目中我有一个数据类。数据类提供对数据库的访问。这是一个静态类。为什么?

首先,它是静态的,因为连接字符串来自 webconfig。所以我有一个静态构造函数(在应用程序启动并提到类时运行一次),它读取 webconfig 并将字符串存储在静态私有成员变量中。我认为这比每天读取 webconfig 文件并创建一个作用域变量 100 亿次要好得多。这些方法是静态的,因为它们足够简单,这意味着它们不需要大量配置即可工作,只需要几个参数,并且仅在数据访问项目中使用。我的所有网站用户都使用该方法的相同实例(静态方法),但每个人都使用具有不同参数的静态方法,因此他们从中得到不同的响应(他们共享管道,但他们喝不同的水)。只需要在方法内部格外小心地清理所有内容(处置每个作用域实例),因为如果不这样做,它们将保留在内存中。最后,我的业务是关于数据操作的,非静态数据类意味着比静态数据类使用更多的内存(两种模式中的 CPU 使用率几乎相同)。

public abstract class Data
{

    [...]

    static Data()
    {
        #if DEBUG
            _Connection = ConfigurationManager.AppSettings["debug"];
        #endif

        #if RELEASE
            _Connection = ConfigurationManager.AppSettings["release"];
        #endif

        [...]
    }

    [...]

}

最终我在以下情况下使用静态:

  1. 如果它足够简单(我可以控制各个方面);
  2. 如果它足够小(我使用扩展方法进行验证,并且它们是静态的)并且;
  3. 如果是重度使用的话。

除此之外,我使用图层来组织我的项目(poco + 工厂模式)。我有一个实用程序项目,然后是实体模型项目,然后是访问项目,然后是业务逻辑项目,然后是网站、api、管理器等。实用程序项目中的类不会相互交互,但实体模型项目中的类会相互交互(一个类可以在其中包含另一个类的实例)。实体模型项目不与实用程序项目交互,因为它们具有相同的级别,它们在另一个级别(在访问项目中)相互交互,但在数据操作项目中更直观。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试让 main/form1 之外的类相互交互是否是一种不好的形式? [关闭] 的相关文章

随机推荐

  • 将音频缓冲区从 44100 重新采样到 16000

    我有 data uri 格式的音频数据 然后我将此 data uri 转换为缓冲区 现在我需要新采样率的缓冲区数据 当前音频数据为 44 1khz 我需要 16khz 的数据 如果我记录了使用 RecordRTC API 录制音频 如果我以
  • 连接池 – 一个进程 – 多个线程

    我对连接池的理解是 如果连接字符串完全相同 则我们重用该连接而不是建立新连接 我的问题是我正在创建许多线程用于并行处理 在这个 虚拟 程序中 我创建了 500 个线程并让 ThreadPool 函数处理这些线程 步骤是 每个线程都会用 SQ
  • 在 PyCrypto AES MODE_CTR 中包含随机数和块计数

    一些背景信息 您可以跳过这部分以了解实际问题 这是我在 stackoverflow 上关于这个主题的第三个问题 为了完整起见 这些是其他问题AES 与 crypt js 和 PyCrypto https stackoverflow com
  • 生成简单的 CRUD 存储过程

    我正在开发一个项目 该项目遵守与 SQL 实现相关的某些公司标准 具体来说 可以访问所有 SQL Server 内容only通过存储过程 没有 ORM 或 LINQ 我们 80 或更多的需求可以通过基本的 CRUD CREATE READ
  • 将 SSL 与 Redis 和 Spring Data Redis 一起使用时“无法获取 Jedis 连接”

    我正在使用启用 SSL 的 Redis 来自 AWS 的 ElasticCache 并且在使用 Spring Data Redis 连接到它时遇到困难 请注意 如果我使用普通 Jedis 或 Jedis Pool 与 Spring 连接工作
  • 如何使用 Chrome 扩展程序更改网站的 CSS?

    我希望为个人和可能的个人朋友使用创建一个扩展 它只需更改我访问的网站上显示的一些颜色 我使用 Reddit 增强套件 它具有 夜间模式 选项 可以完全改变 Reddit 的颜色外观 我想知道如何编辑或注入 CSS 代码到该网站 以便网站中使
  • 无法从 Amazon Linux EC2 实例上的 Wordpress 连接到 RDS mysql 数据库

    我正进入 状态Error establishing a database connection尝试从我的 Wordpress 实例连接到 Amazon RDS 上的 mysql 时 Wordpress 位于我的 AWS Linux EC2
  • PHP读取和解析大文件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我即将读取一个大小为 200Mb 的
  • MySQL中如何比较两个查询结果是否相等?

    我是 MySQL 用户 我有两个疑问 我想比较他们的结果是否相等 我想用一个返回 true 或 false 的查询来完成此操作 因此我的两个查询很可能采用子查询的形式 我想避免返回两个查询的结果并在应用程序级别比较它们 以减少通信并提高性能
  • 如何在单击时切换两个图像

    我正在制作一个可折叠的树视图 我做到了这一切 我只需要我的 and 每当单击图标时就会进行切换 当我更改图标时我做了这部分 to 单击后 使用 jQuery 并使用以下代码 this attr src images expand gif 问
  • 如何在显示 ABPeoplePickerNavigationController 时指定组

    最初显示时如何指定组ABPeoplePickerNavigationController 所以它不会自动显示 所有联系人 是的 我必须让它发挥作用 将您的班级设置为人员选择器的代表 pp delegate self 然后实施 void na
  • 在 django 日期时间上使用 strftime 会在字符串中生成 UTC 时间

    我的模型之一中有以下代码 def shortDescription self return self name self class date strftime I M self class date是否具有时区意识DateTimeFiel
  • 在 C++ 模板化代码中找不到构造函数[重复]

    这个问题在这里已经有答案了 使用以下命令编译它时出现此错误 g main cpp Vec cpp Wall o main I tmp cciqbEQJ o In function main main cpp text 0x8b undefi
  • 如何以兼容模式运行Java?

    Java支持兼容模式运行吗 换句话说 如果我们在系统上安装了 JDK 8 是否可以将其配置为使用相同的安装在 7 或之前版本上运行我的应用程序 我可以举一个例子 比如 IE 11 可以根据兼容性选项切换为 IE 8 9 或 10 运行 我同
  • 在 C# 中将 double 转换为 int

    在我们的代码中 我们需要将 double 转换为 int double score 8 6 int i1 Convert ToInt32 score int i2 int score 谁能解释一下为什么i1 i2 我得到的结果是 i1 9
  • 为什么? “始终将用户定义的异常声明为最终的”

    我使用 Java 源代码分析器分析了我正在处理的代码 警告之一是 始终将用户定义的异常声明为最终的 还有许多其他警告没有多大意义 但这个警告让我有点困惑 我正在开发一个框架 并且有一个根通用异常 例如 FrameworkGenericExc
  • iOS 推送通知自定义声音重复?

    我正在处理推送通知 我已经为推送通知实现了自定义声音 如果推送通知自定义声音只有 5 秒长 那么我可以重复它直到达到最大声音限制 30 秒 吗 例如 我可以重复播放一个通知的声音 6 次吗 JSON 有效负载是 array alert gt
  • 替代 ClientLogin 进行身份验证

    由于 Google 将 ClientLogin API 列为已弃用 建议的替代方案是什么 就我而言 我需要一台服务器来使用我拥有的凭据进行身份验证和发布内容 OAuth 等替代方案在这种情况下不起作用 根据您的应用场景 认证方式有所不同 报
  • 你能在 Angular 中压缩 get 请求的内容吗?

    我正在使用 Angular 获取一些 JSON 如下所示 http url https www somemachine com getdata method GET params success function data status h
  • 尝试让 main/form1 之外的类相互交互是否是一种不好的形式? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi