C# 单一责任原则-对所有类使用单一访问点是否不好?

C# 单一责任原则-对所有类使用单一访问点是否不好?,c#,unity3d,architecture,solid-principles,C#,Unity3d,Architecture,Solid Principles,我正在做一个游戏,在这个游戏中我有单位。我以前只有一个叫做Unit的大班,它几乎做了所有的事情,这很糟糕 所以我把它分成几个类,unitselective,UnitAnimator,UnitDetection,UnitAi,UnitHealth,UnitDataContainer,等等 现在,我使用一个状态机,我希望状态是非常通用的,所以它们只需要一个参数(Unit Unit),然后我就可以使用它在状态中做任何我想做的事情。但是现在我有了大量的类来管理一个单元的行为,那么我该把什么传递给我的状态

我正在做一个游戏,在这个游戏中我有单位。我以前只有一个叫做
Unit
的大班,它几乎做了所有的事情,这很糟糕

所以我把它分成几个类,
unitselective
UnitAnimator
UnitDetection
UnitAi
UnitHealth
UnitDataContainer
,等等

现在,我使用一个状态机,我希望状态是非常通用的,所以它们只需要一个参数
(Unit Unit)
,然后我就可以使用它在状态中做任何我想做的事情。但是现在我有了大量的类来管理一个单元的行为,那么我该把什么传递给我的状态呢?如果我想在需要
UnitAnimator
UnitHealth
的州做点什么呢


因此,对于我的问题,创建一个类
单元
,它只包含对上面所有其他类的引用,这样我就可以将该
单元
传递到我的状态机,并在其中执行我想执行的任何操作吗?

我不太确定在您的上下文中,单元是什么,但是,如何让您的
Unit*
类实现一个公共接口(因为它们可能都是单元,并且由于它们的名称,我假设它们有一些共同的行为),然后将
Unit
接口的参数传递给您的州?如果这样做,您可以使用避免条件代码的多态性来实现该行为

“创建一个只包含对上面所有其他类的引用的类单元是不是不好……”

您的方法基本上是
Mediator
模式,在该模式中,您封装了一组对象的交互方式,防止对象之间显式地相互引用(在您的情况下,
单元
类将保存所有通信对象的引用)。这是一种不错的方法,因为您将特定类彼此解耦,但是您必须记住,
单元
类将需要与所有不同的类非常密切,并且变得非常复杂(使其难以维护)


从我的角度来看,最好的解决方案是从一个公共接口派生所有的
Unit*
类,这样您的状态机就可以多态地调用适当的操作,但我知道这并不总是可能的,因此,使用
单元
中介对象是另一种可能的解决方案。

它可能是一个主观的主题,但您的问题提醒我,如果您使用的是Unity,这正是它包含组件的原因:@Milney不确定您的意思。当然,我可以让这里的每个类都成为一个组件,但是每次我想做一些事情的时候,我都会被stucck调用GetComponent,这很糟糕…@Green_Que-为什么这么糟糕?它将单元类(或游戏对象)与其行为分离,从而允许动态更改这些行为,这意味着交互代码不需要预先知道行为是否存在。它实际上就是为了解决这个问题而设计的,并成功地应用于许多大型游戏中。如果你按照自己的方式去做,你就会被困在通过变量引用它们的过程中,这意味着你不能动态地改变行为的数量或形状?@Milney你的意思是我将GameObject或Transform传递到我的状态,而只需在状态中使用一次GetComponent?事实上,这并不是最糟糕的想法,因为我可以将需要的组件缓存在状态的oneter中,然后在OnUpdate中使用它。这也意味着我可以对任何游戏对象使用相同的状态机,而不仅仅是单位。