Разработка класса таким способом, которым это не становится “Объектом бога”

Я разрабатываю приложение, которое позволит мне тянуть некоторые функции на диаграмме. Каждая функция будет оттянута из ряда точек, которые я передам этому графическому классу.

Существуют различные виды точек, все наследовавшиеся классу MyPoint. Для некоторых точек это будет просто печатать их на экране, как они, другие могут быть проигнорированы, другие добавили, таким образом, существует некоторая логика, связанная с ними, которые могут стать сложными.

То, как на самом деле потянуть диаграмму, не является основным вопросом здесь. То, что беспокоит меня, - то, как сделать логику кода таким образом, что этот класс GraphicMaker не становится так называемым Объектом Бога.

Было бы легко сделать что-то вроде этого:

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
            }
        }
    }
}

Как Вы сделали бы что-то вроде этого? У меня есть чувство, что корректный путь состоял бы в том, чтобы поместить логику рисунка на каждый Точечный объект (таким образом, каждый дочерний класс от Точки будет знать, как потянуть себя), но две проблемы возникают:

  1. Будут виды точек, которые должны знать все другие точки, которые существуют в классе GraphicObject, чтобы знать, как привлечь себя.
  2. Я могу сделать много методов/свойств от Графической общественности класса, так, чтобы все точки имели ссылку на Графический класс и могли сделать всю их логику, как они хотят, но разве который не является большой ценой для оплаты за то, что не желал иметь класс Бога?
5
задан devoured elysium 7 April 2010 в 02:48
поделиться

2 ответа

Я бы сделал, как вы предложили, и возложил бы каждую точку на саму отрисовку, передав ей массив других точек:

interface ICanDraw {
    void Draw(ArrayList<Point> allPoints);
}

public abstract class Point : ICanDraw {
    ...
}

public PoniePoint : Point {
    public void Draw(ArrayList<Point> allPoints) {
        // do drawing logic here
    }
}

Для вашего GraphicMaker:

public void DoDrawing() {
    foreach (Point point in points) {
        point.Draw(points);
    }
}

(Моя Java немного заржавела, поэтому она может не на 100% синтаксически правильная Java, но я думаю, что она передает мое предложение).

4
ответ дан 14 December 2019 в 08:46
поделиться

Вы правы, что каждый подкласс Point должен иметь свой собственный метод рисования, заменяющий метод в базовом классе Point.

Метод рисования должен принимать ссылку на графический объект, который должен иметь общедоступные методы / свойства для всего, что необходимо использовать в методах рисования точек, включая список точек, если это одна из вещей, некоторые из методы рисования нужны.

Почему вы беспокоитесь о том, чтобы сделать общедоступными методы в классе графики? Когда код разрастается, несколько дополнительных видимых методов гораздо менее запутывают, чем один огромный метод, который делает все.

3
ответ дан 14 December 2019 в 08:46
поделиться