Optymalizacja

0

Program ma za zadanie obliczenia obwodu trojkata z wprowadzonych dlugosci bokow i ewentualnej obslugi wyjatku w przypadku gdy nie da sie utworzyc trojkata.
Moje pytanie brzmi, czy dalo by sie kod jakoś sensownie zoptymalizowac?


import java.util.Scanner;

public class TriangleApp {
    public static void main(String[] args) throws CannotBuildTriangleException {

        Scanner scanner = new Scanner(System.in);

        System.out.println("Podaj pierwszy bok: ");
        int first = scanner.nextInt();

        System.out.println("Podaj drugi bok: ");
        int second = scanner.nextInt();

        System.out.println("Podaj trzeci bok: ");
        int third = scanner.nextInt();

        cannot(first,second,third);

        TriangleCalculation calculator = new TriangleCalculation();
        calculator.calculateTriangleCircuit(first, second, third);

    }

    private static void cannot(int first, int second, int third) throws CannotBuildTriangleException {
        if (first >= second + third || second >= first + third || third >= first + second){
            throw new CannotBuildTriangleException(first,second,third);
        }
    }
}


/////////////////////



public class TriangleCalculation {
    public void calculateTriangleCircuit(int first, int second, int third) {

        double wynik = first + second + third;
        System.out.println("Obwod trojkata wynosi: " + wynik);

    }
}


///////////////////////////////


public class CannotBuildTriangleException extends Exception {

    public CannotBuildTriangleException(int first, int second, int third) {
        super("Cannot make triangle with " + first + ", " + second + ", " + third + " side lengths!");
    }
}

2

Co rozumiesz poprzez zoptymalizować? Jaką miarę chcesz poprawić? Czytelność, wydajność?

0

Pewnie jakbyś spróbował przetestować ten kod to napotkałbyś na pierwsze problemy, które doprowadziłyby Cię do lepszego designu. Zwróć uwagę na odpowiedzialność klas i ich zależności do "platformy" typu System.out.println

1

Skoro prosisz o polepszenie czytelności, to ode mnie parę propozycji:

  1. Metoda cannot - według mnie czytelniejsza byłaby nazwa checkTrianglePossibility czy jakoś tak
  2. W powyższej metodzie, wyekstraktowałbym first >= second + third || second >= first + third || third >= first + second do osobnej booleanowskiej metody, nazwanej np cannotBuildTriangle
  3. W klasie TriangleCalculation, metoda calculateTriangleCircuit fajniej jakby zwracała wyliczoną długość, a dopiero w miejscu jej wywołania byśmy wyprintowali na konsolę
  4. To już minor - nazwa exceptiona bardziej mi pasuje już do message, niż do nazwy exceptiona. Ja bym exception nazwał TriangleBuildException

A tak to spoko ;)

1

IMO kalkulator powinien robić walidację, żeby nie zwrócić bezsensownej liczby wynikajacej z prostego sumowania

1
Charles_Ray napisał(a):

IMO kalkulator powinien robić walidację, żeby nie zwrócić bezsensownej liczby wynikajacej z prostego sumowania

Masz rację. Może nawet fajnie by było stworzyć klasę Triangle

0
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("Podaj pierwszy bok: ");
        int first = scanner.nextInt();

        System.out.println("Podaj drugi bok: ");
        int second = scanner.nextInt();

        System.out.println("Podaj trzeci bok: ");
        int third = scanner.nextInt();

        System.out.println(
                new Triangle(first, second, third).perimeter()
        );
    }
}

class Triangle {
    private final int first;
    private final int second;
    private final int third;

    Triangle(int first, int second, int third) {
        if (first >= second + third || second >= first + third || third >= first + second) {
            throw new CannotBuildTriangleException(first, second, third);
        }

        this.first = first;
        this.second = second;
        this.third = third;
    }

    int perimeter() {
        return first + second + third;
    }
}

class CannotBuildTriangleException extends IllegalArgumentException {
    CannotBuildTriangleException(int first, int second, int third) {
        super("Cannot make triangle with " + first + ", " + second + ", " + third + " side lengths!");
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1