Задача массива случайных геометрических фигур на java

Я новичок в Java, в настоящее время работаю над этой задачей стажировки:

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

Треугольник на рисунке, площадь: 8,56, гипотенуза: 6,20, цвет: красный

Чертежный квадрат, площадь: 27,27, длина стороны: 5,22, цвет: синий

... и так далее. Необходимо описать задачу, используя принципы ООП.

Что мне нужно, так это общие советы, как сделать мой код чище и лучше, а также некоторая помощь со случайной частью массива. Вот код, который я написал сейчас:

Форма интерфейса:

public interface Shape {
    void draw();

    double getArea();

    ColorEnum getColor();
}

ColorEnum enum class:

public enum ColorEnum {
    RED,
    ORANGE,
    YELLOW,
    GREEN,
    BLUE,
    INDIGO,
    VIOLET
}

Класс квадрата:

    import java.awt.*;

public class Square implements Shape {
    private double side;
    private Color color;

    public Square(Color color, double side) {
        this.color = color;
        this.side = side;
    }

    @Override
    public void draw() {
        System.out.println("Drawing square, area: " + String.format("%.2f", getArea()) + ", side length: " + String.format("%.2f", getSide()) + ", color: " + getColor());
    }

    @Override
    public double getArea() {
        return side * side;
    }

    @Override
    public Color getColor() {
        return color;
    }

    public double getSide() {
        return side;
    }
}

Класс треугольника:

public class Triangle implements Shape {
    private double side1, side2, side3;
    private ColorEnum color;

    public Triangle(ColorEnum color, double side1, double side2, double side3) {
        this.color = color;
        this.side1 = side1;
        this.side2 = side2;
        this.side3 = side3;
    }

    @Override
    public void draw() {
        System.out.println("Drawing triangle, area: " + String.format("%.2f", getArea()) + ", hypotenuse: " + String.format("%.2f", getHypotenuse()) + ", color: " + getColor().name().toLowerCase());
    }

    @Override
    public double getArea() {
        double p = (side1 + side2 + side3) / 2;
        double s = Math.sqrt((p * (p - side1) * (p - side2) * (p - side3)));
        return s;
    }

    @Override
    public ColorEnum getColor() {
        return color;
    }

    public double getHypotenuse() {
        double hypotenuse = 0;
        double[] arr = {side1, side2, side3};

        for (double i : arr) {
            if (hypotenuse < i) hypotenuse = i;
        }
        return hypotenuse;
    }
}

Класс круга:

public class Circle implements Shape {
    private double radius;
    private ColorEnum color;

    public Circle(ColorEnum color, double radius) {
        this.color = color;
        this.radius = radius;
    }

    @Override
    public void draw() {
        System.out.println("Drawing circle, area: " + String.format("%.2f", getArea()) + ", radius: " + String.format("%.2f", getRadius()) + ", color: " + getColor().name().toLowerCase());
    }

    @Override
    public double getArea() {
        return Math.PI * Math.pow(radius, 2);
    }

    @Override
    public ColorEnum getColor() {
        return color;
    }

    public double getRadius() {
        return radius;
    }
}

Класс трапеции:

public class Trapeze implements Shape {
    private double base1, base2, height;
    private ColorEnum color;

    public Trapeze(ColorEnum color, double base1, double base2, double height) {
        this.color = color;
        this.base1 = base1;
        this.base2 = base2;
        this.height = height;
    }

    @Override
    public void draw() {
        System.out.println("Drawing trapeze, area: " + String.format("%.2f", getArea()) + ", height: " + String.format("%.2f", getHeight()) + ", color: " + getColor().name().toLowerCase());
    }

    @Override
    public double getArea() {
        return (base1 + base2) / 2 * height;
    }

    @Override
    public ColorEnum getColor() {
        return color;
    }

    public double getHeight() {
        return height;
    }
}

Теперь вернемся к случайной части массива. Мне нужно случайное количество фигур со случайными параметрами. Как красиво реализовать такие вещи? Стоит ли использовать заводской узор? Я случайно нашел одну реализацию на GitHub, подскажите, хорошо ли она? https://github.com/Ligren/QaTestLab/blob/master/QaTestLab/src/Test/ShapeDrawing.java и https://github.com/Ligren/QaTestLab/blob/master/QaTestLab/src/Test/Start.java

уточните свой вопрос. Что касается случайного, вы можете использовать math.random для генерации случайных чисел в выбранном вами радиусе и использовать сгенерированные числа для необходимых вам входных данных.

Sir. Hedgehog 01.11.2018 12:34

Сэр. Еж, часть довольно простая, например, я могу создать массив произвольной длины, затем заполнить его случайной формой с помощью switch-case, также использовать switch-case для параметров формы, но я просто хочу, чтобы он был хорош с точки зрения ООП , потому что я считаю, что это очень важное требование от задачи.

Wonderio619 01.11.2018 12:45

просто попробуйте с random и посмотрите, работает ли он. если что-то работает, не трогайте это: p, кроме шуток, просто попробуйте, и если, в конце концов, вам не нравится то, что вы видите, вы можете сделать репост. насколько я понял, ваша проблема заключалась в том, как делать рандомизаторы. что должно делать math.random.

Sir. Hedgehog 01.11.2018 12:49
1. Нет необходимости определять цветовой класс. Лучше используйте стандартный цветовой класс. 2. Чтобы сделать это простым и единообразным, вы можете использовать один и тот же конструктор для всех фигур и позволить форме определять количество точек: Cicle определяется двумя точками, треугольник - 3, трапеция - 4. Обратите внимание, что квадрат является подклассом трапеции. 3. Вам необходимо переопределить toString каждой формы для вывода требуемого описания, например «треугольник, площадь: 8,56, гипотенуза: 6,20, цвет: красный». (кстати: класс Circle размещен дважды).
c0der 01.11.2018 13:53

Кстати: класс Circle публикуется дважды - исправлена ​​опечатка с копированием и вставкой. Итак, мне нужно вставить строку из метода draw () в toString ()? Тогда метод draw () будет бесполезен? Или он должен содержать что-то вроде this.toString?

Wonderio619 01.11.2018 14:17

И как я могу просто отобразить цвет с помощью класса Color? Я вижу, что случайные цвета создаются следующим образом - новый цвет (Start.rand.nextInt (256), Start.rand.nextInt (256), Start.rand.nextInt (256)), поэтому как «преобразовать» этот цвет в простой "красный", "черный" и т. д.?

Wonderio619 01.11.2018 14:40

Да ладно, я думаю, было бы неплохо использовать массив цветов, например, colors = new Color [4]; // Инициализируем значения массива colors [0] = Color.red; цвета [1] = Color.blue; цвета [2] = Color.yellow; colors [3] = Color.green

Wonderio619 01.11.2018 15:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
316
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, я выполнил эту задачу, и работодатель ее одобрил :) Вы можете проверить финальную версию на GitHub: https://github.com/Wonderio619/QATestTask

Другие вопросы по теме