#java
#java
Вопрос:
Если для двух значений установлено значение от 0 до 29, если число, указанное в аргументе, является суммой этих двух чисел, а номер аргумента и номер экземпляра совпадают.
вот код, который я написал до сих пор:
public class TwoNumbers {
private int firstnum = 0;
private int secondnum = 0;
//Constructor that initialize the first and second number
//to a value of 0
public TwoNumbers()
{
firstnum = 0;
secondnum = 0;
}
public int getFirstNum(){
return firstnum;
}
public int getSecondNum(){
return secondnum;
}
public boolean setFirstNum (int firstnum){
if (firstnum >= 0 amp;amp; firstnum <=29){
return true;
}
else {
return false;
}
}
public boolean setSecondNum (int secondnum)
{
if (secondnum >= 0 amp;amp; secondnum <=29){
return true;
}
else {
return false;
}
}
public boolean checkSum (int sum){
if (sum == firstnum secondnum){
return true;
}
else {
return false;
}
}
public boolean equals (int numbers1) {
if (firstnum == secondnum){
return true;
}
else{
return false;
}
}
}
Ответ №1:
Ваши установщики не устанавливают новые значения.
public boolean setFirstNum (int newValue){
firstnum = newValue;
if (firstnum >= 0 amp;amp; firstnum <=29){
return true;
}
else {
return false;
}
}
public boolean setSecondNum (int newValue)
{
secondnum = newValue;
if (secondnum >= 0 amp;amp; secondnum <=29){
return true;
}
else {
return false;
}
и тесты 14 и 15 не проверяют значение чисел.
return numbers1.equals(numbers2);
вместо этого следует читать
return numbers1.firstNumber == numbers2.firstNumber amp;amp; numbers1.secondNumber == numbers2.secondNumber;
Комментарии:
1. должен ли я установить их следующим образом
firstnum = 0
иsecondnum = 0
2. Я рекомендую изменить имена ваших аргументов, чтобы сделать ваш код более разборчивым, т.Е.: public boolean setFirstNum (int newValue)
3. Нет, вам нужно установить для них значения, которые вы передаете в методах setFirstNum и setSecondNum.
4. Я должен также отметить, что установщики обычно не имеют возвращаемых значений, они обычно недействительны, я рекомендую вам следовать этому как стандартной практике, чтобы сделать ваш код более читаемым для других.
5. но метод имеет логический тип, ему нужно возвращаемое значение? для true и false
Ответ №2:
Несколько предложений для вас:
- Вам следует использовать JUnit, а не создавать свой собственный механизм тестирования. Вместо того чтобы возвращать логические значения и печатать сообщения об ошибках, вы могли бы иметь очень четкие тестовые инструкции, такие как
assertEquals("default num1 is zero", 0, new TwoNumbers().getFirstNum())
- Содержите ваши методы получения и установки в чистоте: средства получения должны просто возвращать значение, а средства установки должны просто устанавливать значение.
- Если есть условие ошибки, такое как аргумент, находящийся за пределами ожидаемого диапазона, тогда выбрасывайте и исключайте, а не возвращайте логическое значение.
- Проведите модульные тесты, подтверждающие, что правильные исключения генерируются при правильных условиях (используя
expected
ключ аннотации JUnit).
Если вы начнете с этих изменений, я подозреваю, что ваши проблемы довольно быстро станут очевидными, и вы будете изучать лучшие практики с самого начала.
Ответ №3:
Я думаю, вам следует проверить значения, которые вы установили.
public static boolean test15() {
TwoNumbers numbers1 = new TwoNumbers();
numbers1.setFirstNum(1);
numbers1.setSecondNum(4);
TwoNumbers numbers2 = new TwoNumbers();
numbers2.setFirstNum(4);
numbers2.setSecondNum(1);
return numbers1.equals(numbers2);
}
В случае с номером 15 вы проверяете, что 1 равно 4. Следовательно, он возвращает false
, и в этом тестовом примере нет ничего плохого.
Измените его с помощью:
numbers2.setFirstNum(1);
numbers2.setSecondNum(4);
В случае № 2 вы не установили secondNum
, но пытаетесь проверить это, поэтому он возвращается false
.
public static boolean test2() {
TwoNumbers numbers = new TwoNumbers();
boolean success = numbers.setFirstNum(1);
return success amp;amp; (numbers.getFirstNum() == 1) amp;amp; (numbers.getSecondNum() == 0);
}
Добавьте строку ниже:
boolean success = numbers.setSecondNum(0);
В случае с номером 6 вы не установили firstNum
, но пытаетесь его проверить, поэтому он также возвращает false
.
public static boolean test6() {
TwoNumbers numbers = new TwoNumbers();
boolean success = numbers.setSecondNum(1);
return success amp;amp; (numbers.getFirstNum() == 0) amp;amp; (numbers.getSecondNum() == 1);
}
Добавьте строку ниже:
boolean success = numbers.setFirstNum(0);
Я понял вашу ошибку, когда посмотрел случай № 14.. Ваши методы установки не устанавливают значения. Они просто возвращают false или true. Пожалуйста, обновите их, как показано ниже:
public boolean setFirstNum (int firstnum) {
if (firstnum >= 0 amp;amp; firstnum <=29) {
this.firstnum = firstnum;
return true;
} else {
return false;
}
}
public boolean setSecondNum (int secondnum) {
if (secondnum >= 0 amp;amp; secondnum <=29) {
this.secondnum = secondnum;
return true;
} else {
return false;
}
}
Комментарии:
1. да, но он все равно должен пройти, потому что он проверит, что 1 не равно 4
2. Нет, к сожалению, вы ошибаетесь. Поскольку результат равен false, то выводится сообщение «сбой»..
3. итак, я обновил setSecondNum следующим образом: ` public boolean setFirstNum (int firstnum){ secondnum = 0; if (firstnum >= 0 amp;amp; firstnum <= 29){ return true; } else { return false; } }` но все еще не прошел второй тест
4. добавить логическое значение success = numbers.setSecondNum(0); к методу setSecondNum?
5. Не могли бы вы еще раз проверить мой окончательный ответ
Ответ №4:
как прокомментировал @GlenPierce, но с некоторыми изменениями
public boolean setFirstNum (int firstnum){
if (firstnum >= 0 amp;amp; firstnum <=29){
return true;
}
else {
return false;
}
}
public boolean setSecondNum (int secondnum)
{
if (secondnum >= 0 amp;amp; secondnum <=29){
return true;
}
else {
return false;
}
}
должно быть
public boolean setFirstNum (int firstnum)
{
if (firstnum >= 0 amp;amp; firstnum <=29){
this.firstnum = firstnum; //this is to set the value for TwoNumbers class in your object
return true;
}
else {
return false;
}
}
public boolean setSecondNum (int secondnum)
{
if (secondnum >= 0 amp;amp; secondnum <=29){
this.secondnum = secondnum; //this is to set the value for TwoNumbers class in your object
return true;
}
else {
return false;
}
}
и теперь это будет работать нормально.
даже если вы получаете true или false из класса TwoNumbers. В вашем экземпляре значение всегда будет равно нулю без установки их в setFirstNum и setSecondNum.
используйте ключевое слово this, чтобы задать их. Это всего лишь одно из решений, есть еще другие способы, подобные тому, что сделал @GlenPierce.
для 14 и 15
// testing equals()
public static boolean test14() {
TwoNumbers numbers1 = new TwoNumbers();
numbers1.setFirstNum(1);
numbers1.setSecondNum(4);
TwoNumbers numbers2 = new TwoNumbers();
numbers2.setFirstNum(1);
numbers2.setSecondNum(4);
return numbers1.equals(numbers2);
}
public static boolean test15() {
TwoNumbers numbers1 = new TwoNumbers();
numbers1.setFirstNum(1);
numbers1.setSecondNum(4);
TwoNumbers numbers2 = new TwoNumbers();
numbers2.setFirstNum(4);
numbers2.setSecondNum(1);
return numbers1.equals(numbers2);
}
это приведет к сбою, потому что ваша логика неверна. метод in .equal вашего TwoNumbers принимает int, пока вы передаете весь объект.
измените 14 и 15 и равный метод на это, и все будет хорошо
// testing equals()
public static boolean test14() {
TwoNumbers numbers1 = new TwoNumbers();
numbers1.setFirstNum(1);
numbers1.setSecondNum(4);
TwoNumbers numbers2 = new TwoNumbers();
numbers2.setFirstNum(1);
numbers2.setSecondNum(4);
return numbers1.equals(numbers2.secondnum);
}
public static boolean test15() {
TwoNumbers numbers1 = new TwoNumbers();
numbers1.setFirstNum(1);
numbers1.setSecondNum(4);
TwoNumbers numbers2 = new TwoNumbers();
numbers2.setFirstNum(4);
numbers2.setSecondNum(1);
return numbers1.equals(numbers2.secondnum);
}
public boolean equals (int numberYouPassed) {
//firstnum is the value from your numbers1
//numberYouPassed is the value from numbers2.secondnum that you passed
if (firstnum == numberYouPassed){
return true;
}
else{
return false;
}
}
}
Комментарии:
1. это помогло пройти только тест 2. Теперь тест 8 не выполняется с использованием этого.
2. я все еще пытаюсь просмотреть ваш код. по крайней мере, мы ответили на одну из ваших проблем 🙂 давайте сделаем это по одному. хе-хе . просто подождите, и я обновлю ответ mmy
3. нет проблем. Я думаю, может быть, использование
this
поможет с этим решением, нет?4. как вы думаете, сработает ли изменение его на firstnum < 0 amp;amp; firstnum > 29 и возврат true, а else как false?
5. нет. ваша логика кода верна. не меняйте его на firstnum < 0 amp;amp; firstnum > 29, потому что это вернет false . Я уже изменил свой ответ. Я забыл поместить i t внутри в if. теперь он будет работать должным образом для 8 🙂