Java_Hundregister_1.2_Dog
Hej, kommit igång med en till uppgift men har kört fast lite nu här är en första bakgrund till uppgiften.
"Uppdatering av ˚aldernEn sak saknas helt i klassdiagrammet: metoder f¨or att uppdatera attributen. Detta¨ar ett krav fr˚an best¨allaren av systemet, namnet till exempel ska inte g˚a att ¨andra.Hundar blir dock ¨aldre med ˚aren. I uppgiften ing˚ar d¨arf¨or att designa och implementera en metod f¨or att uppdatera ˚aldern. N¨ar du g¨or det s˚a t¨ank p˚a att ˚aldernbara kan ¨oka, aldrig minska.Detta ¨ar den f¨orsta (publika) metoden i uppgiften som du f˚ar namnge sj¨alv. T¨ankp˚a att namnet ska vara beskrivande, och f¨olja Javas namngivningskonventioner [7]."
Jag har tre funderingar:
1. Tycker min metod med en if-sats på getTailLength() känns helt ok och testkört tester och får en del rätt men mycket fel fortfarande. Den är lite begränsad då den bara kollar av "tax" och "dachshund" men det är ok enligt instruktioner ". Ipraktiken r¨acker det med att programmet klarar av att hantera det svenska ordet”tax” och det engelska ”dachshund”,
2. Kravet på att kunna inkrementera åldern har jag försökt lösa också med tidigare exempel från pluggakuten med en if-sats som är
public int increseAge() {
if(age < Integer.MAX_VALUE) {
}
age++;
}
men förstår inte riktigt jämförelsen i if-satsen man jämför (age > Integer.MAX.VALUE) vad är och vart kommer Integer.MAX_VALUE ifrån är det ens korrekt att göra så? age förstår jag den är deklarerad där uppe i koden (verkar ok nu när jag testar men man behöver förstå vad som görs MAX.VALUE är en funktion men vad gör den?
3. toString() metoden hur skall den konstrueras skall den formateras eller returnera
public String toString() {
return "Dog: " + name;}
//klass
public class Dog {
private String name;
private String breed;
private int age;
private int weight;
//konstruktur
public Dog (String breed, String name, int age, int weight) {
this.name = name.toUpperCase();
this.breed = breed.toUpperCase();
this.age = age;
this.weight = weight;
}
public String getName() {
return name;
}
public String getBreed() {
return breed;
}
public int getAge() {
return age;
}
public int getWeight() {
return weight;
}
public double getTailLength() {
if (breed.equalsIgnoreCase("tax") || breed.equalsIgnoreCase("dachshund")) {
return 3.70;
}
else {
return (age * weight) / 10.0; }
}
public int increseAge() {
if(age < Integer.MAX_VALUE) {
age++;
}
return age; }
public String toString() {
return "Dog: " + name;
}
}
Tack!
- Om den bara ska klara tax och dachshund, vad får du för fel?
- Integer.MAX_VALUE är en konstant med värdet (2 147 483 647). Detta är det högsta värdet en int kan ha i Java. Att ha ett sånt if check är bra för att förhindra overflow, men rent allmänt blir inte hundar två miljarder år gamla... =)
Du kan i stället tänka dig en metod som tar emot ett nytt värde på åldern, men där du kollar att den nya åldern inte är lägre än den nuvarande.
- I toString() så tycker jag du ska få med fler attribut. Du har ju fyra attribut som du sparar, plus svanslängd som du kan beräkna. Då kan hunden beskrivas med all denna information.
Sen som lite plus i kanten tror jag nog beställaren vill att det ska gå att uppdatera vikten, även om hen säger "åldern och inget annat".
1. Testar verkar godkänna det vi har lite begränsade tester i och med att vi är nybörjare.
2. Ok det kände jag inte till kanske ej behövs på ålder då men det fungerar.
3. Det var tips kan ju va rimligt att använda de attribut man skapat.
4. Det är inget krav även fast det borde vara det.
Kan jag få tips eller länk på vart man kan hitta information om strängformatering se bild.
Tack!
Du kan använda String.format till det, t.ex.
double myDouble = 2.6999999999997;
String rounded = String.format("%.2f", myDouble);
Nu har det dock blivit en sträng av det och metoden ska skicka tillbaka double, så du är inte klar.
Tack jag skall kolla på det sen. men varför går du från double till string om det skall vara en double?
Men jag satt igår och försökte få igång mitt testprogram för att testa utskrifter det gick inte bra.
public class DogTestProgram {
public static void main(String[] args) {
Dog o = new Dog(name:"Tax");
System.out.println(o.getName());
}
}
Får syntax error
1. Name cannot be resolved to a variable (kan ej använda name? vad bör används?)
2. Syntax error on token "," invalid AssignmentOperator (är det name: (:) bör ej den användas utan något annat?)
tack!
popelos skrev:Tack jag skall kolla på det sen. men varför går du från double till string om det skall vara en double?
Jag demonstrerade förslaget i texten du visade.
Om du inte har ändrat din kod så har Dog bara en constructor och den tar fyra argument, så syntaxfel åsido kan du inte skicka bara en sträng. Du skickar breed, name, age, weight, i den ordningen, för att använda constructorn. Det här du försöker göra med kolon är inget som Java stödjer.
Dog o = new Dog("Tax", "Fido", 5, 20)
Tack nu förstod jag mer det där hade jag aldrig listat ut antagligen tog konstruktorn i min föregående uppgift bara ett argument!
Hej jag förstår ej vad testerna tkr jag gör för fel. Men har iallfall lyckats få igång testprogrammet tänkte försöka skriva ut double GetTailLength() måste jag koppla in ett femte argument i konstruktorn eller går det?
Det här meddelandet får jag.
* Misslyckat test: Svanslängden finns med i strängrepresentationenTestklass: HR1_2_DogTestTestmetod: taillengthInStringRepresentationDetta orsakat av ett org.opentest4j.AssertionFailedError med meddelandet"Kunde inte hitta någon av strängarna [2,7, 2.7] i "Dog: FOXTERRIERMILOU93""Undantaget inträffade här:org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:38)org.junit.jupiter.api.Assertions.fail(Assertions.java:135)HR1_2_DogTest.assertStringContainsAnyOf(HR1_2_DogTest.java:509)HR1_2_DogTest.taillengthInStringRepresentation(HR1_2_DogTest.java:500)(Ytterligare 69 anropsnivåer bortfiltrerade)
De här tipsen får jag.
Checkstyle: Magiska tal* [WARN] Dog.java:49 ('3.70' is a magic number.)
Det kan vara väldigt svårt att förstå varför ett visst tal står i koden på ett visst ställe. Det är nästan alltid bättre att ge variabeln ett namn via en konstant och använda denna konstant istället.
Sådana konstanter sätts normalt till final om de bara förekommer i en metod, och skrivs då som vanliga variabler:final
int max = 20;
eller static och final om de deklareras på klassnivå och skrivs med stora bokstäver:static final
int MAX = 20;
När man ger värden namn på detta sätt ska namnet spegla syftet med värdet, inte värdet självt. En konstant som denna ger ingen hjälp:
static final int TWENTYFOUR = 24;
//klass
public class Dog {
private String name;
private String breed;
private int age;
private int weight;
//konstruktur
public Dog (String breed, String name, int age, int weight) {
this.name = name.toUpperCase();
this.breed = breed.toUpperCase();
this.age = age;
this.weight = weight;
}
public String getName() {
return name;
}
public String getBreed() {
return breed;
}
public int getAge() {
return age;
}
public int getWeight() {
return weight;
}
public double getTailLength() {
if (breed.equalsIgnoreCase("tax") || breed.equalsIgnoreCase("dachshund")) {
return 3.70;
}
else {
return (age * weight) / 10.0; }
}
public int increseAge() {
if(age < Integer.MAX_VALUE) {
age++;
}
return age; }
public String toString() {
return "Dog: " + name + breed + age + weight;
}
}
Den vill att toString() ska skriva ut svanslängden också. Du kan kalla på getTailLength() i din toString(). Och jag rekommenderar att du ser över den där utskriften. toString() ska ge något som är bekvämt för en människa att läsa. Du kan jobba vidare på typ
return name + " is a " + breed " with " + [...];
toString() behöver förresten inte bara vara en enda rad. Du kan bygga din sträng stegvis om det är lättare för dig.
Tack det skall jag göra!
Den vill nog inte bara det för jag la in i toString() att den även skall ta med men med get går det att göra så? den fortsätter klaga över de sakerna. Men jag skall ändra utskrifterna så det blir lättare att läsa!
public String toString() {
return "Dog: " + name + breed + age + weight + getTailLength();
}
}