Conversation
| return time; | ||
| } | ||
|
|
||
| abstract int initSwimCost(); |
There was a problem hiding this comment.
Этот метод нужен для инициализации значения SwimCost у всех водоплавающих. Так как он абстрактный, то любое водоплавающее животное его реализует и это гарантирует, что всегда будет поле с названием SwimCost и оно всегда будет проинициализировано своим значением для конкретного животного.
There was a problem hiding this comment.
Опять же, идея не моя https://stackoverflow.com/questions/2613596/how-to-create-an-abstract-field
Использовал рекомендацию, которая показалась наиболее простой "using the Template pattern. In this way, you force all subclasses to implement the init() method, which, since it being called by the constructor, will assign the field for you."
There was a problem hiding this comment.
Там у человека хитрый случай, в данном решении такой подход не требуется
There was a problem hiding this comment.
Спорить не буду, вы профи, вам виднее
| package ru.otus.vadim.ivanov.java.basic.lesson11.oop2; | ||
|
|
||
| //обычные животные | ||
| public abstract class Animal { |
There was a problem hiding this comment.
По заданию требовался еще флаг усталости, чтобы в методе инфо потом сказать что животное устало по результату гонки
There was a problem hiding this comment.
В задаче нет ничего про флаг усталости, цитирую "Если выносливости не хватает, то возвращаем время -1 и указываем что у животного появилось состояние усталости. "
There was a problem hiding this comment.
Добавляем метод info(), который выводит в консоль состояние животного.
Как Вы отпечатаете состояние усталости если не отслеживаете его?)
Но согласен, можно сослаться на нечуткую формулировку дз и не делать это)
There was a problem hiding this comment.
Состояние это текущее значение выносливости, просто вывожу его в консоль.
| String name; | ||
|
|
||
| //скорость бега м/с | ||
| private int runSpeed; |
There was a problem hiding this comment.
Почему это поле закрыто от наследников?
There was a problem hiding this comment.
Принцип инкапсуляции говорит о том, что все что не используется явно, должно быть закрыто. Да и вы сами об этом говорили, открыть то, что необходимо. В предлагаемой мной реализации необходимости его открывать нет.
There was a problem hiding this comment.
Не совсем так, давайте в общем чате обсудим
| package ru.otus.vadim.ivanov.java.basic.lesson11.oop2; | ||
|
|
||
| //обычные животные | ||
| public abstract class Animal { |
There was a problem hiding this comment.
Всех животных стоило бы вынести в отдельный пакет
There was a problem hiding this comment.
В задании это явно нигде не прописано. Ошибку понял, учту на будущее.
There was a problem hiding this comment.
Ну задание не должно описывать те вещи, о которых должен заботиться сам программист
There was a problem hiding this comment.
Для человека который ничего не разрабатывал на яве, это не совсем очевидно. К тому же, вы при демонстрации примеров часто делаете каждый класс в отдельном файле в том же пакете
There was a problem hiding this comment.
Согласен, на занятии могу это не часто показывать, и поэтому проговариваю это на ревью кода. Ревью домашек это дополнительный материал для изучения в том числе
| int endurance; | ||
|
|
||
| //Все животные на 1 метр бега тратят 1 ед выносливости | ||
| private final int runCost = 1; |
There was a problem hiding this comment.
private final int DEFAULT_RUN_COST = 1;
| } | ||
|
|
||
| endurance -= actionCost; | ||
| int time = distance/runSpeed; |
There was a problem hiding this comment.
В задании опять же не сказано, что нужна точность до мс. Почему нельзя использовать точность до секунды? Int для этого вполне достаточно.
There was a problem hiding this comment.
Эх.. и правда про флоат не написал, ответ принимается)
| super(name,runSpeed,endurance); | ||
| this.swimSpeed = swimSpeed; | ||
|
|
||
| this.swimCost = initSwimCost(); |
There was a problem hiding this comment.
Это поле можно спокойно заполнять в конструкторе конкретного животного
There was a problem hiding this comment.
Правильную инициализацию этого поля мы оставляем на совесть разработчика, который будет писать конструктор конкретного животного, что опять же по моему мнению (не факт что истинному) не правильная стратегия. Необходимость реализовать initSwimCost - гарантирует наличие этого поля и его правильную инициализацию.
There was a problem hiding this comment.
А что мешает совести разработчика криво заполнить поле в initSwimCost? Если оно прошито в родительском конструкторе, то сам родительский конструктор не даст его пропустить
There was a problem hiding this comment.
Ну как бы они его не заполняли, метод должен вернуть int и наше поле тоже типа int, а значит работа алгоритма не нарушится, мы всегда получим int. Ошибка может быть только в самом значении, но от этого уже застраховать не возможно, ну или накручивать логику валидации
| package ru.otus.vadim.ivanov.java.basic.lesson11.oop2; | ||
|
|
||
| //водоплавающие | ||
| public abstract class WaterfowlAnimal extends Animal { |
There was a problem hiding this comment.
При такой структуре классов будет крайне сложно "смешивать" способности животных. Например, если добавилась бы логика травоядные(т)/хищные(х), то строилось бы большое дерево, плав/т, п/х, неплав/т, нп/х. А если добавим сюда третье свойство, то при добавлении придется переписывать все классы, чтобы переразнести их в разные группы
Всю реализацию можно было оставить в Животном, только при попытке попросить поплавать кота, он бы просто отказывался от этого.
There was a problem hiding this comment.
Согласен, сложно. Возможно я не правильно понял задание "Кот плавать не умеет." - я понимаю как, у кота в принципе не должно быть метода swim, а как это реализовать без разделения на группы? Идея, про то, что у кота есть метод swim, но он при этом ничего не делает не совсем очевидна. А что метод swim будет возвращать? По условию он должен возвращать время или -1 в случае усталости.
There was a problem hiding this comment.
-1 скорее по логике означает невозможность выполнить действие, поэтому у кота свим может быть (типа попросим его поплавать), но он скажет нет и просто вернет -1
There was a problem hiding this comment.
Это ни разу не очевидно "Если выносливости не хватает, то возвращаем время -1"
| //водоплавающие | ||
| public abstract class WaterfowlAnimal extends Animal { | ||
|
|
||
| private int swimCost; |
There was a problem hiding this comment.
Они не используются нигде кроме текущего класса, зачем их делать открытыми ?
No description provided.