c#设计一个类,使其不会成为“上帝对象”
我正在设计一个应用程序,可以在图形上绘制一些函数。每个函数都将从我将传递给这个图形类的一组点中绘制
有不同类型的点,都是从MyPoint类继承的。对于某些点,只需在屏幕上按原样打印,其他点可以忽略,其他点可以添加,因此与它们相关的某种逻辑可能会变得复杂
如何实际绘制图形不是这里的主要问题。困扰我的是如何使代码逻辑,这样GraphicMaker类就不会成为所谓的God对象
制作这样的东西很容易:
class GraphicMaker {
ArrayList<Point> points = new ArrayList<Point>();
public void AddPoint(Point point) {
points.add(point);
}
public void DoDrawing() {
foreach (Point point in points) {
if (point is PointA) {
//some logic here
else if (point is PointXYZ) {
//...etc
}
}
}
}
你会怎么做这样的事?我有一种感觉,正确的方法是将绘图逻辑放在每个Point对象上(这样Point的每个子类都会知道如何绘制自己),但会出现两个问题:
- 有些点需要知道GraphicObject类中存在的所有其他点,才能知道如何绘制它们自己李>
- 我可以公开Graphic类中的很多方法/属性,这样所有的点都有一个Graphic类的引用,并且可以按照他们的意愿进行所有的逻辑,但是不想拥有一个God类,这不是一个很大的代价吗李>
# 1 楼答案
Point的每个子类都应该有自己的绘图方法,覆盖基点类中的绘图方法,这是正确的
绘图方法应参考图形对象,图形对象应具有点绘图方法中需要使用的任何内容的公共方法/属性,包括点列表(如果这是某些绘图方法需要的内容之一)
你为什么担心在图形课上公开方法?一旦代码增长,几个额外的可见方法比一个完成所有事情的巨大方法要简单得多
# 2 楼答案
我会按照你的建议做,让每个点负责绘制自己,并将其他点的数组传递给它:
对于GraphicMaker:
(我的Java有点生疏,所以这可能不是100%语法正确的Java,但我认为它传达了我的建议)