当前位置:  开发笔记 > 编程语言 > 正文

如何在不将其作为上帝对象的情况下编写控制器?

如何解决《如何在不将其作为上帝对象的情况下编写控制器?》经验,为你挑选了1个好方法。

在我的应用程序中,我有一个Controller由main方法启动的.控制器初始化钩子,数据库连接,UI,另一个连接和其他东西.它占据了程序的大部分状态(不,它不是Singleton).在另一个例子中,有一个用于机器人的控制器,用于处理解释和发出命令.两者都是相当大的文件.

我已经阅读了上帝的对象,但我真的不知道如何将它分开.如果我将机器人中的解释器和调度员分开,它将会形成一个可怕的调用链(类似于getBot().getParser().getOutput().sendMessage(recipient, message)).类似地,在第一个控制器中,如果我分开,你将只有包含字段的数据对象和一些别名实用程序方法.将它们拆分会让事情变得更糟.在你认为它不可维护之前,实际上并非如此.我甚至没有写Bot控制器,但我仍然知道发生了什么.

但问题是Bot类是2000行(如果我拿出Javadoc注释可能会更短)并且Bot大约是1000行.很多行=上帝的对象.但是对于项目的一个或两个核心类是否可以?



1> David Titare..:

"很多线条"并不意味着这个阶级根本就是一个神的对象,这对于弄清楚你是否应该重构一些东西来说是一个糟糕的可怕基准.有些事情非常复杂,需要一个复杂且固有的大对象.上帝对象的想法就是班级所做的.

例如,如果我做了一个可以的对象

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)拥有太多行为(业务代码).

如果您认为存在问题,可以尝试实现不同形式的中介,或者更糟糕的模式,例如依赖注入.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有