Я новичок в 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
Сэр. Еж, часть довольно простая, например, я могу создать массив произвольной длины, затем заполнить его случайной формой с помощью switch-case, также использовать switch-case для параметров формы, но я просто хочу, чтобы он был хорош с точки зрения ООП , потому что я считаю, что это очень важное требование от задачи.
просто попробуйте с random и посмотрите, работает ли он. если что-то работает, не трогайте это: p, кроме шуток, просто попробуйте, и если, в конце концов, вам не нравится то, что вы видите, вы можете сделать репост. насколько я понял, ваша проблема заключалась в том, как делать рандомизаторы. что должно делать math.random.
toString каждой формы для вывода требуемого описания, например «треугольник, площадь: 8,56, гипотенуза: 6,20, цвет: красный». (кстати: класс Circle размещен дважды).
Кстати: класс Circle публикуется дважды - исправлена опечатка с копированием и вставкой. Итак, мне нужно вставить строку из метода draw () в toString ()? Тогда метод draw () будет бесполезен? Или он должен содержать что-то вроде this.toString?
И как я могу просто отобразить цвет с помощью класса Color? Я вижу, что случайные цвета создаются следующим образом - новый цвет (Start.rand.nextInt (256), Start.rand.nextInt (256), Start.rand.nextInt (256)), поэтому как «преобразовать» этот цвет в простой "красный", "черный" и т. д.?
Да ладно, я думаю, было бы неплохо использовать массив цветов, например, colors = new Color [4]; // Инициализируем значения массива colors [0] = Color.red; цвета [1] = Color.blue; цвета [2] = Color.yellow; colors [3] = Color.green




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