6

旧标题:每个单元有多少个班级是可取的?

我的问题是针对德尔福的。我认为在 Java 和 C# 世界中,每个类通常有一个文件是一种相当普遍的做法。我认为这也是在 Delphi 中遵循的一个很好的规则,因为在 Delphi 中,如果一个单元中有多个类,则私有成员并不是真正私有的。

所以我很惊讶地听到两个不同的高级(可能比我更有经验)程序员告诉我我的代码划分太多了。其中一位告诉我不要羞于在一个单元中安排 5-6 个班级。

我不知道的“每个模块一个类”规则是否存在一些问题,可以保证和解释这些程序员的反应?

4

3 回答 3

2

这取决于。没有确切的规则可以遵循。通常,您需要按逻辑、公共依赖或更好地理解业务功能来将类分组。

例如,如果你有很多小的helperadiacent互补类,那么有理由将它们全部放在一个单元中。就像 Borland 在 DB.pas 单元中所做的那样。那里的所有通用数据库内容:TDataSet、TDataSource、TField 等...

表单,即 TForm 后代 Borland 推荐每个单元一个,因为 dfm 资源加载等...

通常当你写“使用 FOO;”时 意味着编译器包含来自 FOO 的所有内容。您可以访问类、常量、类型等......所以,划分但保持理性是好的

在最新版本的 Delphi 中,单元被视为命名空间。您可以更好地组织代码。

于 2012-07-21T15:04:40.320 回答
2

不知道你说的模块是什么意思。

Java 要求每个文件有一个公共类,并且类名必须与文件名匹配。没有如果,ands,或buts。您可以在该文件中包含其他包私有或私有方法,但只有一个公共类。

如果“模块”对您来说意味着“包”,那么我会说一个包中有多个类是很常见的。没有规范;看看JDK本身就知道了。java.utiljava.langjava.sql和中有许多类javax.swing

除了这两个,我不知道你或所谓的“高级程序员”指的是什么。我同意任何事情都可以做得过分,不应该盲目遵循教条规则。

但是分解是一门计算机科学——不,是解决问题的——基础。忽视它比过度使用它更常见。

于 2012-07-21T14:39:58.733 回答
0

一个单元一个班太严格了。有时类是相关的,因此它们可以合并为一个单元。

受保护变量和私有变量的后门问题可以通过使用 strict 指令来解决:

type
  TClass1 = class 
  private
    FField1 : Integer;
  strict private
    FField2 : Integer;
  end;

  TClass2 = class 
  public
    procedure MessWithClass1;
  end;



implementation
  procedure TClass2.MessWithClass1;
  var
    c1 : TClass1;
  begin
    c1.FField1 := 1;
    c1.FField2 := 2;   // Fails!
  end;     
于 2012-07-21T15:06:38.603 回答