6

我正在尝试学习在我的代码中使用类的正确方法,当它不像一组客户、从动物继承的狗等那样明显时。

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

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

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

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

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

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

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

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

我看不到在Form1不使其成为静态的情况下让该字符串存在的方法(因为所有表单事件和函数都需要能够看到它才能将其传递给一个类)。

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

也许我在实际实例化类和使对象相互交互方面缺少一些东西。

4

2 回答 2

3

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

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

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

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

还有一些想法:

我不认为必须避免使用静态方法或类。必须避免的是错误使用静态方法或类,例如错误使用语言中的所有内容。但是很难定义什么是对 static 的误用,而且由于静态方法或类特别危险,人们喜欢说完全避免使用 static 关键字。除非您结束应用程序,否则静态方法将在内存中,因此如果您不在静态方法中处理连接,您将度过非常糟糕的一天。

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

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

于 2012-09-06T18:39:57.457 回答
1

类在有引用时相互交谈,为了让 A 将消息传递给 B,A 需要对 B 的引用(实例或静态引用)

类可以相互通信,也可以将信息返回给另一个控制整个过程的类(这实际上是一种设计模式)

为了从主类(或任何类)中抽象信息,你有接口和抽象类

四人组的设计模式书在这种情况下是必读的。另外要记住的是设计的简单性,有时试图适应设计模式只是因为最终可能会创建更多的 spaguethi 代码。根据经验,总是尝试将演示功能与逻辑分开,并将类视为彼此交谈和执行工作的人(这有点奇怪,但有时它可以帮助我这样想)

于 2012-09-06T18:50:19.460 回答