在我的应用程序中,我有一个Controller
由main方法启动的.控制器初始化钩子,数据库连接,UI,另一个连接和其他东西.它占据了程序的大部分状态(不,它不是Singleton).在另一个例子中,有一个用于机器人的控制器,用于处理解释和发出命令.两者都是相当大的文件.
我已经阅读了上帝的对象,但我真的不知道如何将它分开.如果我将机器人中的解释器和调度员分开,它将会形成一个可怕的调用链(类似于getBot().getParser().getOutput().sendMessage(recipient, message)
).类似地,在第一个控制器中,如果我分开,你将只有包含字段的数据对象和一些别名实用程序方法.将它们拆分会让事情变得更糟.在你认为它不可维护之前,实际上并非如此.我甚至没有写Bot控制器,但我仍然知道发生了什么.
但问题是Bot类是2000行(如果我拿出Javadoc注释可能会更短)并且Bot大约是1000行.很多行=上帝的对象.但是对于项目的一个或两个核心类是否可以?
"很多线条"并不意味着这个阶级根本就是一个神的对象,这对于弄清楚你是否应该重构一些东西来说是一个糟糕的可怕基准.有些事情非常复杂,需要一个复杂且固有的大对象.上帝对象的想法就是班级所做的.
例如,如果我做了一个可以的对象
DoMyTaxes() GiveMeHugs() LogThisError() StartGameLoop()
该对象将被限定为神对象,即使它可能只有100行代码.基本思想是以上所有内容完全不相关(在业务逻辑的频谱末端),所以为什么它们都将成为同一个对象的一部分.如果我决定让拥抱持续更长时间,我最终可能会搞砸我的税.输入IRS.
但是,如果您正在使用物理模拟器,那么Classical()
该类将具有方法/对象,例如:
Space() Time() Velocity() Speed() Mass() Acceleration() Gravity() Force() Impulse() Torque() Momentum() AngularMomentum() Inertia() MomentOfInertia() ReferenceFrame() Energy() KineticEnergy() PotentialEnergy() MechanicalWork() VirtualWork() DAlembertsPrinciple()
(由维基百科提供)
这个对象不是神的对象.这是一个复杂的对象.所有涉及牛顿物理学的东西都经历过它,但它不是上帝的对象......它只是一个非常大的对象.以上可能最终成为数千行代码.
该Quantum()
对象会更复杂,不用说.
重申一下,这个想法是关于程序的行为,而不是数据流:
您不关心单个对象是否包含大量应用程序的数据,或者大多数流程是否必须通过单个对象.对可维护性产生更大影响的是单个God Class(tm)拥有太多行为(业务代码).
如果您认为存在问题,可以尝试实现不同形式的中介,或者更糟糕的模式,例如依赖注入.