![]() |
правильность написания кода
Здравствуйте. Интересует правильно ли я пишу код. Выучил ООП и сейчас перехожу к изучению awt, swing и javaFX. Быстро накидал простенькую прожку. :drug: Хотелось знать мнение по поводу составления кода :read: . главный класс
Код:
package square; клас с методамы и конструктором
Код:
package square; |
Код как код. Не обременен комментариями, не выполняет каких-либо сверх задач, содержит ошибку вычисления при реализации прямоугольного треугольника.
На мой взгляд процедура public void squareOut() { ... } лишняя. Я не люблю, когда за меня думает процедура. Т.е. я сам решу, какой текст следует писать, и нужен ли он мне вообще. Из более грубых ошибок - отсутствие проверки треугольника. Т.е. нельзя в планиметрии получить треугольник со сторонами 1, 1, 6. А в этой программе можно. Тоже касается и отрицательных величин. |
Цитата:
|
Цитата:
Благодарю за ответ. Комментарии писать буду, а то я забываю что кроме меня еще кто то будет его читать. Насчет правил планиметрии так сказать "проверку на дурака" я не писал... просто хотел по быстрому накидать прожку. Сегодня допишу с учетом всех ошибок и скину сюда. Интересовало мнение насчет построения класса, методов, конструктора. Благодарю за критику. Если вы не против то по мере изучения я буду сливать сюда коды. Хотелось бы видеть от вас критику по их поводу. Мне кажется просто что так я научусь писать более менее нормальный код. |
Еще можно ли использовать геттеры и сеттеры? А то много негативного о них в интернете написано... Или их использование будет дурным тоном?
|
В "интернетах" много что пишут. Если специфика работы объекта подсказывает использования сеттера или геттера - то вполне.
Если сеттер и геттер "поганит" данные и вызывает неявное/непредсказуемое действие - тогда это проблема. nomad____1, setter и getter - это инструмент. Пользоваться им или нет - решать не мне. В данном случае в процедуру установки параметров можно прописать процедуру установки флага "валидности" треугольника. Тогда в процедуре вычисления площади будет проверяться условие планарности треугольника по флагу. Моветон? ---- nomad____1, как вам сказать. Точность - вежливость королей. По таким мелочам судят о специалисте. На счет построения конструктора класса и методов - сказать сложно. Ваш пример с одной стороны достаточно каноничен и в нем нет сложности, с другой оторван от реальности и практики. Те же прямоугольные треугольники здесь не учитываются. Ответ будет дан с определенной погрешностью (кстати вопрос "на засыпку" как специалисту: какая погрешность метода при вычислении площади прямоугольного треугольника?). Отсутствие условий планиметрии приведет к ошибке - вычислению корня из отрицательного числа (NaN). ---- Iska, а вот интересно. Допустим у нас некая выпуклая фигура, на плоскости которой я могу нарисовать треугольник со сторонами 1:1:6. И ... наверно собственно все. По данным сторонам я не смогу сказать какая это фигура? Допустим шар, сфера. Наверно нет. Получится у меня должны (пусть катеты) две стороны лежать на прямых плоскостях, а гипотенуза в 6 ед. должна быть свернута в гармошку. Так что ли? ---- P.S. Не стоит без особой надобности выделять текст жирным шрифтом. |
валидность треугольника УЧТЕНО И ДОРОБОТАНО
Цитата:
Код:
// Проверка планарности треугольника точность УЧТЕНО
Цитата:
учтено. программу буду улучшать по мере изучения
Цитата:
Цитата:
Тут уже вопрос как заставить ее работать... У меня выводит 0. Так как не может вычислить целый квадратный корень. Цитата:
Вот код после доработки: главный класс
package square;
Код:
public class Square { Класс с методами и конструктором
package square;
Код:
public class Triangle { P.S. Сегодня ночью думаю скину код где будет проверка треугольника на прямоугольность и вычисление площади по отдельной формуле. Думаю использовать сравнение трех сторон. Две самые "мелкие" должны быть катетами. Дальше с помощю теоремы Пифагора проверить будет ли получена гипотенуза равна "нашей" введеной. пока мой извращенный мозг более простого не придумал))) :durak: P.P.S. Надеюсь етот смайл пробет стенку головой) |
Цитата:
А по теме мои 5 копеек: Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Насчет неправильного вывода то разобрался что нужно поменять типы данных переменных в которые записываются длинны сторон на флоаты или даблы. |
nomad____1, касательно public'ов, static'ов и пр. я не скажу. Но переменная vuvod у меня вызывает подозрения.
Почему используется конструкция public void SquareOut. Почему не int или не double ? Я от программы хочу получить ответ. Желательно наиболее простой и пригодный для "дальнейшей эксплуатации". Мне совершенно не хочется заниматься парсингом строки (притом не возвращаемой в силу void). Чтобы сигнализировать об ошибке следует возвращать отрицательные значения. -1, -2 и т.д. Поведение разумеется должно быть описано в сопровождающей документации и в комментариях к процедуре. ---- Цитата:
Напомню, речь шла про сеттеры, гетторы и ввод "флага валидности" треугольника. ---- Цитата:
|
Цитата:
--- Цитата:
P.S. ПРОГРАММУ ПЕРЕПИШУ И СЕГОДНЯ БУДЕТ НОВЫЙ КОД |
Цитата:
|
nomad____1, разница и игра слов процедура/метод от меня ускользают.
Будете приводить код, выделите пожалуйста, чтобы мы говорили об одном и том же. ---- nomad____1, Цитата:
Iska, вообще подходит. Можно будет взять конус в довольно большом промежутке параметров и рассечь наклонной плоскостью. Это даст эллипс в сечении и останется только достроить треугольник до заданного. |
|
Цитата:
P.S. Благодарю за поправку. Я ничего не доказываю просто объяснил точку зрения "почему я сделать так"... еще вчера после вашего сообщения все операторы выбора были заменены на строковые значения для большей информативности. Параметр "error" не был описан и по нему выполняется дефолтное значение. P.P.S. Начал изучать графический интерфейс. Скоро "упакую" эту прожку как конфетку и добавлю немного функционала. А пока надо ее довести до нормального вида. |
Цитата:
Может быть это???
Код:
// Цитата:
А вот и полностью сам код! Главный класс
Код:
package square; Класс с методами
Код:
package square; |
Цитата:
Код:
private void square() { Код:
public void valueOut() { Класс как результат вычисления square должен отдавать либо результат вычисления площади, либо отрицательное число с ошибкой. Анализ ошибки на стороне "пользователя" класса. Если уж хотите что-нибудь писать, пишите в стандартный поток ошибок. А заодно узнайте, что это за звери - стандартный поток ввода, стандартный поток вывода, стандартный поток ошибок. Заодно прочитайте про волшебную вещь перенаправления потоков. Анализ планарности треугольника происходит каждый раз при вычислении площади. Что ИМХО не есть правильно. Выставление флагов планарности и прямоугольности ИМХО должно выставляться в процессе задания параметров треугольника. (Сеттеры и геттеры) |
Цитата:
Цитата:
Цитата:
Цитата:
|
nomad____1, Конструктор - он конструирует. Он выполняется один раз при создании объекта. Объект создали, далее конструктор мы не дергаем.
А вот установку параметров (св-тв) объекта - это другая, более интересная и захватывающая история. Св-ва (поля) планарности и "прямоугольности" объекта Triangle надо сделать закрытыми (private), чтобы я не мог влиять на них извне. Ситуация. Я ввожу треугольник (1, 1, 6). Процедура установки параметров отрабатывает ситуацию и сбрасывает флаг планарности. Процедура вычисления площади, написанная как if planarity {square = ...} else {...}; отдаст ошибку. При этом я пологая, что для вычисления площади я не буду каждый раз "рассчитывать" условия планарности. Тогда я принудительно говорю объекту, что он планарен (triangle.planarity = true) и все, здравствуй не верная площадь. Поэтому признаки должны быть скрытыми (private) Модификация признаков - в процессе установки сторон треугольника. (Setter |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Читаю о потоках и ошибках. Такого в уроках не рассказывали :( Но спасибо что указали. Это весьма полезно. Теперь все что вы писали мне стает более менее ясно. сегодня возьмусь за переписку программы полностью.
Цитата:
Цитата:
Цитата:
Цитата:
|
Читал вот о таком примере.
Скрытый текст
Код:
Scanner scanner = new Scanner(System.in); Достаточно толково. Это как в с++ консолин и консолаут) Просто судя по урокам и некоторой литературе то они это упускали. Следовательно я понял что такой шняги как в с++ нету. Что касается сеттеров. То проверку каждой стороны можно прописать на "валидность" еще в сеттере. Конструктор можно не использовать. Но планарность проверяется после введения "правильных" сторон. После проверки планарности еще проверить на прямоугольность. Потом вычислить площадь и вывод в консоль? Я правильно понял (разбил так сказать на объекты). Если нет то пожалуйста напишите что за чем, а я попробую это написать. P.S. Хотя я кое что уже придумал. Я понял как это все грамотно сделать.))) СПС Цитата:
|
Код переделал и представляю вашему вниманию. Прочитал о return-ах. На комментарии не скупился. О потоках ввода/вывода еще что то нашел, а вот об ошибках толком ничего. Если можете то скиньте ссылку/литературу
Main класс
Код:
package mathprogram; класс с методами
Код:
package mathprogram; Старался как мог. Реализовал интерфейс через который можно получить данные, но не изменить их. Так сказать обеспечил безопасность. Притом девушка подкинула идею. Усложнить можно если треугольник задается в 2Д плоскости координатами вершин и потом в 3д плоскости. Соответственно написать конструкторы и написать пару методов для нахождения длинны отрезков заданных координатами их концов а далее по написанному моему трафарету. Еще пару дней и это все упакую в красивую оболочку с кнопочками и полями. Но только если все написано правильно и нормально. Хочется довести все до ума. Заодно и набить руку. |
nomad____1, ну ... блин, ну куда, ну с какого перепуга?
Ну не пхай ты в класс чего не попадя. Чаа. Я пишу ситуацию, скорректирую задачу. Затем, уж прости, порежу код. ---- Ситуация. Я кодер, сижу прожу. Случилось, что мне до зарезу понадобился треугольник. Я пишу ландшафтный дизайн, создаю обучалку, игру, занимаюсь графикой и строю программную модель объекта на пару тысяч полигонов. Цель. Зачем? Мне нужен класс треугольника, который отдает мне площадь, и чтобы не сильно врал в ответах. Поехали. Что за глупость public void inputSides()
Код:
public void inputSides() { одна мысль
Все текстовые вопросы - вне класса. Табу! Класс, если он не "болтливый", должен быть как безвольная скотинка. "Муу" - строго по команде.
Одна процедура вопросы задает, потом стороны запоминает, потом еще и другую вызывает. (Создает еще один экземпляр кода возврата, копию данных в ОЗУ, передачу управления, всё по полной программе вызова процедур) Что будет, если я захочу изменить треугольник? Мне надо вспоминать предыдущие стороны? Брр Класс должен обрабатывать те данные, которые я ему скажу. Не спрашивать меня, не строить умного, а молча кушать данные. Молча. Кушать. (почитал дальше) Э. Весь этот код - в основную процедуру. Ctrl-C, Ctrl-V и его никто не видел. Другая мысль
Я чуть позже картинок нарисую, может полегче станет, мне по крайней мере, должно, я верю.
Сортировка данных
Код:
private void sortSides() { А вот это а-яй-яй. Это геометрическое нарушение. За это по рукам. В общем случае треугольник ABC =! CBA. Нельзя треугольник читать как попало, даже если очень хочется. Прямоугольный треугольник
Код:
private boolean rightTriangle() { А зачем нам надо возвращать rightTriangle? Не устанавливать, а возвращать? Или в Java куда не ткни, попадешь в процедуру с функцией? Код:
public class Triangle { Возвращаемые значения площади
Код:
public float getRightTriangleSquare() { Код:
Triangle triangle = new Triangle(); Код:
run: Пока все, надо и другими делами заняться. Вспомню чего - напишу. |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
очень жду рисунков... я пока как слепой котенок... мало знаю и мало ориентируюсь... зато пробую исправится |
Цитата:
класс пользователя
Код:
package mathprogram; Оно неплохо тут вжилось) А насчет этого могу сказать в свое оправдание только то как я думал.( Скрытый текст
Код:
Неудачный выбор названия переменной так как оно совпадает с названием метода. Только НО "rightTriangle;"-это переменная, а "rightTriangle();" - это метод. Сначала инициализируется переменная rightTriangle но она пустая так как изначально ей не присвоено никакого значения (хотя можно и было присвоить ложь). Потом в методе ей присваивается значение в зависимости пройдет условие или нет. А после булевский метод rightTriangle() возвращает значение. В даном случае он возвращает значение глобальной переменной. Нужно было бы так написать. Скрытый текст
Код:
private float rightTriangle; а это стоит наверное перебросить в другой класс. и тогда будет само выбирать как вычислять площадь и потом только по одной команде выводить значение которое более всего подходит, которое более точное. Скрытый текст
Код:
if (triangle.isSetSides() == true) { Если что то не так то прошу исправить.!!! так как правильно и красиво кодить это не заучить правила и писать по ним как под трафарет, а научится правильно думать, уметь проводить анализ. |
Вот с утра не было дел. Шел дождь. Делать было нечего. Порция очередного "гавнокода" :(
мейн
Дописано Ваш тест. Код:
package mathprogram; методарий
Код:
package mathprogram; Теперь класс "сам" определяет лучший способ вычисления площади. В меру болтлив. Зря не "тявкает" в консоль. Сортировка массива была сделана для того что бы не писать такую колбасу так как мне показалось это не совсем эстетичным. Код:
rightTriangle = false; Флаги сделал доступными для чтения для того что бы можно было получить инфу например о планарности треугольника только. Или прямоугольность. Не всегда же программа должна только площадь считать. Так сказать наращиваю функционал. |
Цитата:
Цитата:
И, вообще, решите чего вы хотите от класса и от этого уже начинайте. |
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Тогда как такой код???
мейн
Код:
package mathprogram; методарий
Код:
package mathprogram; Все защищено. Лишнего ничего нет. Тявкает то что ему сказано. Может и не тявкать если надо. Это уже мы выбираем. Стороны вводятся через сеттеры. Внутренние методы работают только то что надо, а именно считают и не вызываю других методов. Можно получить любые интересующие данные благодаря геттерам. Принудительно что то в логике изменить нельзя. Также класс сам считает более подходящим способом. |
nomad____1, хочешь иголку воткну?
Ну так, чтобы не скучно было? :) В код не подглядывай, а утром поищи ошибку самостоятельно. Если не найдешь - смотри тест. Но лучше сам. Тест
Не, не, не! Не надо!
Да я ж под пару тройку спойлеров то точно спрячу ;)
Я предупреждал!
Код:
float sideA = 5; float sideB = 4; float sideC = 3; |
ок... на честность... поищу... утром... пффф))) я ложусь в 4 часа ночи))) по пару раз на день захожу сюда... так что до утра попробую найти, а нет то посмотрю текст
может этот кусок переписать Код:
public float getRightTriangleSquare() { Код:
public float getRightTriangleSquare() { и еще парочку... Скрытый текст
было Код:
private float square() { Код:
private float square() { Скрытый текст
было Код:
public float getRightTriangleSquare() { Код:
public float getRightTriangleSquare() { Скрытый текст
было Код:
public float getRightTriangleSquare() { Код:
public boolean isRightTriangle() { |
Цитата:
Ахах)))) даже и не подумал) сортировку массива и пере присвоение убрал, а тут такой фейл оставил))) Четко) :laugh: :laugh: :laugh: :lol: :biggrin: :up Я хотел написать метод нахождение минимума и максимума и с его помощью считать. Но как то вылетело. И пожалуйста скиньте рисунки которые обещали... Или будет массив и будет сортировка но только! в даном методе исключительно ради точности вычислений. Зато сам еще потестил и нашел пару багов))) P.S. Утром перепишу) |
С днем Великой победы товарищи!!!! :Beer:
Для исправление данной "иголки" использовал массив и сортировку. Но только в данном методе. На остальные данные не влияет и на логику программы в целом. Код:
private float rightTriangleSquare() { мейн
Код:
package mathprogram; методарий
Код:
package mathprogram; |
nomad____1, хорошо, только маленькая поправка.
Код:
private float rightTriangleSquare() { P.S. На счет картинок. Почти все ошибки исправлены, поэтому они тебе здесь уже не нужны. Там уже ничего примечательного. |
Цитата:
Ок благодарю) Вашу поправку внесу в класс. Уже упаковал с помощью javaFX в оболочку. Теперь еще поднаростить функционал))) Цитата:
P.S. Завтра допишу функционал еще... Как говорил Цитата:
|
что можете посоветовать учить после завершения ООП. JavaFX немного понял принципы. Можно ли приступать к изучению JDBC, мавен, ант т в какой последовательности.
|
nomad____1, мысль вслух.
Лучший учитель - это натура. Учиться согласно поставленных целей. Задачками мир наполнен более чем. |
Цитата:
|
Цитата:
|
Время: 01:54. |
Время: 01:54.
© OSzone.net 2001-