Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Java - правильность написания кода

Показать результаты: что лучше учить
awt 1 25.00%
swing 1 25.00%
javaFX 2 50.00%
Всего проголосовало: 4. Вы не можете голосовать в этой теме

Ответить
Настройки темы
Java - правильность написания кода

Аватара для nomad____1

Пользователь


Сообщения: 79
Благодарности: 1


Конфигурация

Профиль | Отправить PM | Цитировать


Здравствуйте. Интересует правильно ли я пишу код. Выучил ООП и сейчас перехожу к изучению awt, swing и javaFX. Быстро накидал простенькую прожку. Хотелось знать мнение по поводу составления кода .
главный класс

Код: Выделить весь код
package square;

import square.Triangle;

public class Square {

    public static void main(String[] args) {
        Triangle triangle = new Triangle(3, 4, 5);
        triangle.squareOut();
    }
}

клас с методамы и конструктором

Код: Выделить весь код
package square;

public class Triangle {

    private int aSide;
    private int bSide;
    private int cSide;
    private double square;
    private double perimeter;

    public Triangle(int aSide, int bSide, int cSide) {
        this.aSide = aSide;
        this.bSide = bSide;
        this.cSide = cSide;
    }

    private void print(String str) {
        System.out.println(str);
    }

    public void square() {
        perimeter = (aSide + bSide + cSide) / 2;
        square = Math.sqrt(perimeter * (perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide));
    }

    public void squareOut() {
        this.square();
        print("Площадь треугольника равна " + square);
    }
}

Отправлено: 11:28, 24-04-2015

 

Аватара для nomad____1

Пользователь


Сообщения: 79
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата lxa85:
А вдруг нет? Вдруг "мелкие" не катят?!! »
Если треугольник прямоугольный, то самой длинной стороной будет гипотенуза. Значит две остальные - катеты. То есть хочу сделать проверку и найти самую длинную сторону. Что бы разделить на "воображаемые" катеты и гипотенузу. А дальше по теореме Пифагора. Квадрат гипотенузы равняется суме квадратов катетов. И это только для ПРЯМОУГОЛЬНОГО треугольника! Поднести в квадрат нашу самую большую сторону и получить суму квадратов двух других. И сравнить их. Если совпадут то прямоугольный, а если нет то он не прямоугольный. Такой способ проверки я выбрал потому что на даном этапе моя программа использует теорему Герона (площадь вычисляется по длине сторон). А если треугольник прямоугольный то площадь будет равна половине их произведения (опять же надо две самые короткие стороны потому что между ними прямой угол).
---
Цитата lxa85:
Нет. Я сказал написать проверку в процедуре установки параметров, а не в процедуре вычисления площади.
Напомню, речь шла про сеттеры, гетторы и ввод "флага валидности" треугольника. »
Я понял) Простите просто "процедура" это как я понял "Метод". То есть в конструкторе (метод) через который устанавливаются значения, прописать проверку на принадлежность фигуры к треугольникам с точки зрения классической планиметрии. Но это неправильно так как "засорять" особо конструкторы не следует. Или создать отдельный метод с типом boolean, который возвращал значение лож и правда.

P.S.
ПРОГРАММУ ПЕРЕПИШУ И СЕГОДНЯ БУДЕТ НОВЫЙ КОД

Последний раз редактировалось nomad____1, 26-04-2015 в 22:16.


Отправлено: 20:16, 26-04-2015 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата lxa85:
Iska, а вот интересно. Допустим у нас некая выпуклая фигура, на плоскости которой я могу нарисовать треугольник со сторонами 1:1:6. И ... наверно собственно все. По данным сторонам я не смогу сказать какая это фигура? Допустим шар, сфера.
Наверно нет.
Получится у меня должны (пусть катеты) две стороны лежать на прямых плоскостях, а гипотенуза в 6 ед. должна быть свернута в гармошку.
Так что ли? »
В свёрнутом в очень широкий и низкий конус пространстве, полагаю: катеты исходят из вершины конуса, а гипотенуза «обёрнута» вокруг основания, не?

Отправлено: 21:08, 26-04-2015 | #12


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


nomad____1, разница и игра слов процедура/метод от меня ускользают.
Будете приводить код, выделите пожалуйста, чтобы мы говорили об одном и том же.
----
nomad____1,
Цитата lxa85:
А вдруг нет? Вдруг "мелкие" не катят?! »
Это была шутка Игра слова катет и катят.
Iska, вообще подходит. Можно будет взять конус в довольно большом промежутке параметров и рассечь наклонной плоскостью. Это даст эллипс в сечении и останется только достроить треугольник до заданного.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:54, 26-04-2015 | #13


Аватара для User001

Ветеран


Сообщения: 740
Благодарности: 116

Профиль | Отправить PM | Цитировать


Цитата nomad____1:
если я правильно понял то 0 это дефолтное значение »
Нет.
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:04, 27-04-2015 | #14


Аватара для nomad____1

Пользователь


Сообщения: 79
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата User001:
Цитата nomad____1:
если я правильно понял то 0 это дефолтное значение »
Нет
. »
Если ни один параметр не подходит то выбирается дефолтное значение. В даном случае если дорабатывать программу то возможное появление вариантов 4,5.....n , а 0 значение я оставил пустым. То есть 0 не входит в диапазон выбора. Таким способом будет выполнятся дефолт. Потому что в даном случае любое значение переменной больше 3 будет приводить к дефолтному значению. А как по мне это некрасиво. Что где то там есть далеко-далеко дефолт под каким то числом. А при дополнении программы возможно придется число увеличивать. А так под рукою. Нулевое значение = пустое значение = умолчание (дефолт).
P.S.
Благодарю за поправку. Я ничего не доказываю просто объяснил точку зрения "почему я сделать так"... еще вчера после вашего сообщения все операторы выбора были заменены на строковые значения для большей информативности. Параметр "error" не был описан и по нему выполняется дефолтное значение.
P.P.S.
Начал изучать графический интерфейс. Скоро "упакую" эту прожку как конфетку и добавлю немного функционала. А пока надо ее довести до нормального вида.

Последний раз редактировалось nomad____1, 27-04-2015 в 09:30.


Отправлено: 09:21, 27-04-2015 | #15


Аватара для nomad____1

Пользователь


Сообщения: 79
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата lxa85:
nomad____1, разница и игра слов процедура/метод от меня ускользают.
Будете приводить код, выделите пожалуйста, чтобы мы говорили об одном и том же.
»
И от меня тоже....
Может быть это???

Код: Выделить весь код
//    
//      Проверка "на дурака" введенных значений, проверка планарности треугольника, проверка на прямоугольность
//   
    private void triangleTest() {
        //       Проверка нет ли стороны с отрицательным значением или равным нулю 
        if (aSide <= 0 || bSide <= 0 || cSide <= 0) {
            otvet = "minusovoe";
        } else {
            //      Проверка планарности треугольника 
            if (((aSide + bSide) > cSide && (aSide + cSide) > bSide) && (bSide + cSide) > aSide) {
                testTriangl = true;
            } else {
                //      Данные числа не могут соответствовать длине сторон треугольника  
                otvet = "nesootvetstvie";
                testTriangl = false;
            }
        }
//         Проверка на прямоугольность
        if (testTriangl == true) {
            float masivStoron[] = {aSide, bSide, cSide};
            Arrays.sort(masivStoron);
            if ((masivStoron[2] * masivStoron[2]) == (masivStoron[0] * masivStoron[0] + masivStoron[1] * masivStoron[1])) {
                rightTriangle = true;
            }
        }
    }

Цитата lxa85:
Это была шутка Игра слова катет и катят. »
Простите. Я не хотел обидеть. Без злости и задней мысли все пишу. Я просто так раскрываю свою точку зрения. Еще раз прошу прощения если показался дерзким или где то хамил.

А вот и полностью сам код!
Главный класс

Код: Выделить весь код
package square;

public class Square {

    public static void main(String[] args) {
        Triangl triangle = new Triangl(3, 4, 5);
        triangle.valueOut();
    }
}

Класс с методами

Код: Выделить весь код
package square;

import java.util.Arrays;

public class Triangl {

    private float aSide;
    private float bSide;
    private float cSide;
    private double square;
    private double perimeter;
    private String otvet;
    private boolean testTriangl;
    private boolean rightTriangle;
    private float masivStoron[];

    public Triangl(int aSide, int bSide, int cSide) {
        this.masivStoron = new float[]{aSide, bSide, cSide};
        this.aSide = aSide;
        this.bSide = bSide;
        this.cSide = cSide;
    }

//Собственный метод вывода
    private void print(String str) {
        System.out.println(str);
    }

//    
//      Проверка "на дурака" введенных значений, проверка планарности треугольника, проверка на прямоугольность
//   
    private void triangleTest() {
        //       Проверка нет ли стороны с отрицательным значением или равным нулю 
        if (aSide <= 0 || bSide <= 0 || cSide <= 0) {
            otvet = "minusovoe";
        } else {
            //      Проверка планарности треугольника 
            if (((aSide + bSide) > cSide && (aSide + cSide) > bSide) && (bSide + cSide) > aSide) {
                testTriangl = true;
            } else {
                //      Данные числа не могут соответствовать длине сторон треугольника  
                otvet = "nesootvetstvie";
                testTriangl = false;
            }
        }
//         Проверка на прямоугольность
        if (testTriangl == true) {
            float masivStoron[] = {aSide, bSide, cSide};
            Arrays.sort(masivStoron);
            if ((masivStoron[2] * masivStoron[2]) == (masivStoron[0] * masivStoron[0] + masivStoron[1] * masivStoron[1])) {
                rightTriangle = true;
            }
        }
    }
//    
//    Вычисление площади
//

    private void square() {
        if (testTriangl == true) {
            if (rightTriangle == true) {
                square = masivStoron[0] * masivStoron[1] / 2;
            } else {
                if (testTriangl == true) {
                    perimeter = (aSide + bSide + cSide) / 2;
                    square = Math.sqrt(perimeter * (perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide));
                }
            }
            otvet = "uspeshno";
        }
    }
//
//      Вывод ответа    
//    

    public void valueOut() {
        this.triangleTest();
        this.square();
        switch (otvet) {
            case "minusovoe":
                print("Длина не может быть отрицательным числом");
                break;
            case "uspeshno":
                print("Треугольник -" + testTriangl + "\nПрямоугольный -" + rightTriangle);
                System.out.printf("Площадь треугольника равна %.2f кв.ед\n", square);
                break;
            case "nesootvetstvie":
                print("У треугольника не может быть сторон с такими значениями");
                break;
            default:
                print("\tхм... что то не так с программой... ");
        }
    }
}

Отправлено: 14:45, 28-04-2015 | #16


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата nomad____1:
Простите. Я не хотел обидеть. »
а я и не обижался


Код: Выделить весь код
    private void square() {
        if (testTriangl == true) {
            if (rightTriangle == true) {
                square = masivStoron[0] * masivStoron[1] / 2;
            } else {
                if (testTriangl == true) {
                    perimeter = (aSide + bSide + cSide) / 2;
                    square = Math.sqrt(perimeter * (perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide));
                }
            }
            otvet = "uspeshno";
        }
    }
Двойная проверка условия testTriangle.

Код: Выделить весь код
    public void valueOut() {
        this.triangleTest();
        this.square();
        switch (otvet) {
            case "minusovoe":
                print("Длина не может быть отрицательным числом");
                break;
            case "uspeshno":
                print("Треугольник -" + testTriangl + "\nПрямоугольный -" + rightTriangle);
                System.out.printf("Площадь треугольника равна %.2f кв.ед\n", square);
                break;
            case "nesootvetstvie":
                print("У треугольника не может быть сторон с такими значениями");
                break;
            default:
                print("\tхм... что то не так с программой... ");
        }
    }
Забудьте вы про то, что класс должен что то писать в консоль! Не его это задача. Соотв. что за глупая переменная otvet ? У нее от силы 4 значения, а ей аж строковая переменная отдана.
Класс как результат вычисления square должен отдавать либо результат вычисления площади, либо отрицательное число с ошибкой.
Анализ ошибки на стороне "пользователя" класса.
Если уж хотите что-нибудь писать, пишите в стандартный поток ошибок. А заодно узнайте, что это за звери - стандартный поток ввода, стандартный поток вывода, стандартный поток ошибок. Заодно прочитайте про волшебную вещь перенаправления потоков.

Анализ планарности треугольника происходит каждый раз при вычислении площади. Что ИМХО не есть правильно.
Выставление флагов планарности и прямоугольности ИМХО должно выставляться в процессе задания параметров треугольника. (Сеттеры и геттеры)

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:25, 28-04-2015 | #17


Аватара для nomad____1

Пользователь


Сообщения: 79
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата lxa85:
Забудьте вы про то, что класс должен что то писать в консоль! Не его это задача. Соотв. что за глупая переменная otvet ? У нее от силы 4 значения, а ей аж строковая переменная отдана.
Класс как результат вычисления square должен отдавать либо результат вычисления площади, либо отрицательное число с ошибкой.
Анализ ошибки на стороне "пользователя" класса.
Если уж хотите что-нибудь писать, пишите в стандартный поток ошибок. А заодно узнайте, что это за звери - стандартный поток ввода, стандартный поток вывода, стандартный поток ошибок. Заодно прочитайте про волшебную вещь перенаправления потоков.
Анализ планарности треугольника происходит каждый раз при вычислении площади. Что ИМХО не есть правильно.
Выставление флагов планарности и прямоугольности ИМХО должно выставляться в процессе задания параметров треугольника. (Сеттеры и геттеры)
»
Благодарю. Понял. Перепишу. Почему именно в консоль? Да потому что я только выучил в яве основы ООП. А точнее я учил ее три дня по пол часа когда выложил первый код. Я только еще на старте. До многопоточности еще далеко. С типом метода int, float, boolean и т.д. у меня немножко проблемы. До конца не могу понять. Так что когда разберусь перепишу и выложу. А тем временем поучу свинги что бы не в консольку вводить и выводить) У меня просто сумасшедший план. За месяц выучить ООП (уже почти полностью прошел и более менее разобрался), основы свингов, авт и ява FX, основы баз данных. Очень хочу чем поскорее устроится на стажировку (желательно оплачиваемую). Анриал? Я думаю ДА))))

Цитата lxa85:
Анализ планарности треугольника происходит каждый раз при вычислении площади. Что ИМХО не есть правильно.
Выставление флагов планарности и прямоугольности ИМХО должно выставляться в процессе задания параметров треугольника. (Сеттеры и геттеры)
»
Просто я использовал Конструктов вместо сеттеров и геттеров для установки параметров.

Цитата lxa85:
Двойная проверка условия testTriangle. »
Что то недоглядел

Цитата lxa85:
Если уж хотите что-нибудь писать, пишите в стандартный поток ошибок. А заодно узнайте, что это за звери - стандартный поток ввода, стандартный поток вывода, стандартный поток ошибок. Заодно прочитайте про волшебную вещь перенаправления потоков. »
За это огромнейшее спасибо!!!. Обязательно прочту.

-------
________________________________________________________
Ты - то что ты ешь. Ешь людей - будь человеком


Отправлено: 19:18, 28-04-2015 | #18


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


nomad____1, Конструктор - он конструирует. Он выполняется один раз при создании объекта. Объект создали, далее конструктор мы не дергаем.
А вот установку параметров (св-тв) объекта - это другая, более интересная и захватывающая история.
Св-ва (поля) планарности и "прямоугольности" объекта Triangle надо сделать закрытыми (private), чтобы я не мог влиять на них извне.

Ситуация.
Я ввожу треугольник (1, 1, 6). Процедура установки параметров отрабатывает ситуацию и сбрасывает флаг планарности.
Процедура вычисления площади, написанная как
if planarity {square = ...} else {...};
отдаст ошибку. При этом я пологая, что для вычисления площади я не буду каждый раз "рассчитывать" условия планарности.
Тогда я принудительно говорю объекту, что он планарен (triangle.planarity = true) и все, здравствуй не верная площадь.
Поэтому признаки должны быть скрытыми (private)
Модификация признаков - в процессе установки сторон треугольника. (Setter

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:04, 28-04-2015 | #19


Аватара для User001

Ветеран


Сообщения: 740
Благодарности: 116

Профиль | Отправить PM | Цитировать


Цитата nomad____1:
До многопоточности еще далеко. »
lxa85 имел ввиду потоки ввода / вывода.
Цитата nomad____1:
Triangl»
Букву жалко?
Цитата lxa85:
case "minusovoe": »
Цитата lxa85:
case "uspeshno": »
Использовать строки весьма расточительно. Смотрите в сторону enum.
Цитата lxa85:
Соотв. что за глупая переменная otvet ? »
Дополню. Вот тут про JS, но суть одинаковая. Обратите внимание на правило №1.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:20, 30-04-2015 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Java - правильность написания кода

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Правильность замены процессора Вилка Хочу все знать 9 07-05-2015 00:08
C/C++ - Лабораторные работы ( проверка написания кода ) xasn0w Программирование и базы данных 3 06-05-2015 21:47
Правильность конфигурации Leoz Выбор отдельных компонентов компьютера и конфигурации в целом 9 06-09-2009 22:15
правильность конфигурации belomor3000 Выбор отдельных компонентов компьютера и конфигурации в целом 5 15-09-2008 11:11
Правильность работы сети DimSher Сетевые технологии 5 18-02-2003 13:53




 
Переход