Delphi 不将小型(ish)类拆分为单独文件的优点?

Delphi 不将小型(ish)类拆分为单独文件的优点?,delphi,Delphi,我有一个“UObject”单元。它有几个不同类型的对象扩展了TCollection/TCollectionItem。有一段时间,将所有这些小类都分组在一个文件中可能是非常有意义的,因为事情很小,它们有点相关,然后你就不用担心太多的文件了 但是随着时间的推移,越来越多的方法被添加到这些集合中,使得管理变得更加困难,因此我考虑将UObject单元拆分为多个更小的单元,以使其更易于维护 但在此之前,我想知道是否有什么需要注意的地方。这是我应该毫不放弃地去做的事情吗?或者有什么原因我可能(也许在某些情况

我有一个“UObject”单元。它有几个不同类型的对象扩展了TCollection/TCollectionItem。有一段时间,将所有这些小类都分组在一个文件中可能是非常有意义的,因为事情很小,它们有点相关,然后你就不用担心太多的文件了

但是随着时间的推移,越来越多的方法被添加到这些集合中,使得管理变得更加困难,因此我考虑将UObject单元拆分为多个更小的单元,以使其更易于维护


但在此之前,我想知道是否有什么需要注意的地方。这是我应该毫不放弃地去做的事情吗?或者有什么原因我可能(也许在某些情况下)不想将一个单元的不相关部分分解成多个单元?这会给未来带来什么问题?我仍在试图理解来自Java世界的单元的细微差别,在Java世界中,在一个文件中包含多个类通常不是一个选项。

主要问题是循环依赖性。假设您有以下类:

type
  TClass2 = class;

  TClass1 = class
    FObj1 = TClass2;
  end;

  TClass2 = class
    FObj2 = TClass1;
  end;
如本文所述,循环依赖关系将这些类绑定在同一个文件中。这是因为循环依赖关系只能通过前向声明实现。转发声明不能应用于多个文件

您可能遇到的另一个问题是私有和受保护的成员可见性。在同一个文件中,该文件中定义的私有成员和受保护成员始终对该文件中的其他代码可见。这是Delphi的一个特性,即正常可见性规则的一个特殊例外

当您将类移动到不同的文件时,您可能会发现编译失败,因为其他类中的私有和受保护成员不再可见


与Java相比,关于类/文件关系的Delphi习惯用法有所不同。紧密协作的类通常在同一个文件中定义。另一方面,如果类A在不了解类B的情况下很好地存在,那么这两个类通常可以放在不同的文件中

根据您的Delphi版本,您可以放弃所有集合,转而使用泛型。您可以保留稍微修改过的collectionitem,并将其放入TList(或类似列表)中

一旦您这样做,您将发现您将丢失大多数小型类(即
t集合
)。我会把剩下的分成不同的单元

在使用TCollection时,我发现这主要是因为泛型还不可用

一个小例子:

TMyCollectionItem = class(TCollectionItem)
  // Declarations
end;

TMyCollection = class(TCollection)
  // Declarations
end;

var
  MyCollection: TMyCollection;

/***************************/
// would become the following
/***************************/

TMyItem = class
  // Less declarations, as the typical TCollectionItem overrides are no longer required.
end;

var
  MyCollection: TList<TMyItem>;
TMyCollectionItem=class(TCollectionItem)
//声明
结束;
TMyCollection=class(TCollection)
//声明
结束;
变量
MyCollection:TMyCollection;
/***************************/
//将成为以下内容
/***************************/
TMyItem=类
//更少的声明,因为不再需要典型的TCollectionItem重写。
结束;
变量
MyCollection:TList;

我发现这清理了我的很多代码。

您可能会失去对受保护过程/属性的直接/简单访问权。。。如果on类从另一个.TCollection+TCollectionItem使用此项。。。这听起来很像我自己多年来使用的一些业务对象类集。我会选择单独的单元。闻起来好多了。Delphi类中的同一个单元是自动的朋友(在C++意义上)彼此。如果您不需要这样做,那么分离单元保证您不会仅仅因为疏忽而访问私有/受保护的成员。接口更干净。。。您的类之间不需要/不需要的依赖性更少。我认为在组织良好的项目中,成员可见性不应该是一个问题。私有成员不应由其他类可见/引用,受保护成员只应由子类可见/引用。从这个角度来看,将大型单元拆分为更小的单元只会有助于避免不合理的引用。我个人更喜欢每个单元一个类的模型,但集合类、参数类和帮助类除外。是的,这就是最初为Delphi 5-7编写的代码的情况,如果您有适用于TCollection的方法,它已经被移植到Xe4(例如,对于基于各种条件搜索集合或清除所有列表项中的某些标志等,这些是否会最终成为使用TList的类的随机方法?您可以为此添加匿名排序方法,甚至类帮助器,但请注意范围,因为只会使用最新的帮助器。您可以当然,uld也源于TList并在那里添加支持方法。这仍然比旧的TCollection更好。