Modellierung Widerstandsnetzwerk

LucaToni

Aktives Mitglied
Java:
/**
* Interface Resistor
*/

public interface Resistor
{
    /**
     * Ein Beispiel eines Methodenkops - ersetzen Sie diesen Kommentar mit Ihrem eigenen
     *
     * @param  y    ein Beispielparameter für eine Methode
     * @return        das Ergebnis von beispMethode
     */
    double ohm();
  
}








import static java.lang.Math.sqrt;
/**
*Klasse einfacher Widerstand
*/
public class SimpleResistor implements Resistor
{
    protected double widerstand1;
  

    public SimpleResistor(double r)
    {
    if(r<0){
        widerstand1=sqrt(r*r);
        System.out.println("Sie haben einen negativen Widerstand eingegeben,es wurde der Betrag überneommen");
    }
        widerstand1=r;
    }

  
    public double ohm()
    {
    return widerstand1;
    }
}







/**
*Abstrakte Klasse Widerstandsnetzwerk
*/
public abstract class AbstractResistorNet implements Resistor
{
    // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
    protected SimpleResistor r1 ;
    protected SimpleResistor r2;
    /**
     * Ein Beispiel einer Methode - ersetzen Sie diesen Kommentar mit Ihrem eigenen
     *
     * @param  y    ein Beispielparameter für eine Methode
     * @return        die Summe aus x und y
     */
    protected  AbstractResistorNet(SimpleResistor r1,SimpleResistor r2)
    {
       this.r1=r1;
       this.r2=r2;
    }
  
  
  
}





/**
* Beschreiben Sie hier die Klasse SerialResistorNet.
*
*/
public class SerialResistorNet extends AbstractResistorNet
{
    SimpleResistor r1;
    SimpleResistor r2;
    public SerialResistorNet(SimpleResistor r1,SimpleResistor r2)
    {
    super(r1,r2);
    this.r1=r1;
    this.r2=r2;
    }
  
    @Override
    public double ohm()
    {
    return
    }
  
}


Komme bei der Implementierung in der Klasse SimpleResistor nicht weiter... die Methode ohm() will nicht so.. beziehungsweise ich weiß nicht genau wie ich da ein double zurückgeben soll...

Eigentlich will ich ja r1+r2 zurückgeben... aber meine Methode ohm() kann nur double zurückgeben...
 
K

kneitzel

Gast
Neben dem Hinweis von fhoffmann auch noch ein kleiner Hinweis: Ohm ist doch nur die Einheit. Der Widerstand wird ja in Ohm angegeben.

Eine Methode "ohm" sagt auch wenig aus. Da ist nicht erkennbar, was die Methode macht oder zurück gibt.

Und wenn Du eine Instanzvariable widerstand hast und Du diese nach außen sichtbar haben willst, dann wäre das in der Regel einfach ein public double getWiderstand() { return widerstand; }

Und vom Design her: Du hast ja das Interface Resistor. Generell ist es doch dem SerialResistorNet egal, was da als Widerstände eingebaut wurde. Es kann ein einfacher Widerstand sein oder SerialResistorNet oder was da sonst noch wichtig wird. Wichtig ist doch erst einmal nur, dass es sich wie ein Resistor verhält. Daher solltest Du Dir überlegen, in SerialresistorNet nicht mit SimpleResistor sondern mit dem Resistor Interface zu arbeiten.
 

LucaToni

Aktives Mitglied
Neben dem Hinweis von fhoffmann auch noch ein kleiner Hinweis: Ohm ist doch nur die Einheit. Der Widerstand wird ja in Ohm angegeben.

Eine Methode "ohm" sagt auch wenig aus. Da ist nicht erkennbar, was die Methode macht oder zurück gibt.

Und wenn Du eine Instanzvariable widerstand hast und Du diese nach außen sichtbar haben willst, dann wäre das in der Regel einfach ein public double getWiderstand() { return widerstand; }

Und vom Design her: Du hast ja das Interface Resistor. Generell ist es doch dem SerialResistorNet egal, was da als Widerstände eingebaut wurde. Es kann ein einfacher Widerstand sein oder SerialResistorNet oder was da sonst noch wichtig wird. Wichtig ist doch erst einmal nur, dass es sich wie ein Resistor verhält. Daher solltest Du Dir überlegen, in SerialresistorNet nicht mit SimpleResistor sondern mit dem Resistor Interface zu arbeiten.

Aber Resistor ist doch ein Interface... kann ich aus einem Interface Objekte machen? Ich dachte ich kann nur Objekte von Klassen erzeugen?
 

fhoffmann

Top Contributor
Noch zwei Hinweise zu deinem Code:

widerstand1=Math.sqrt(r*r);
kannst du ersezen durch
widerstand1=Math.abs(r);

Und in
Java:
super(r1,r2);
this.r1=r1;
this.r2=r2;
sind die letzten beiden Zeilen überflüssig, da super das bereits erledigt.
 

LucaToni

Aktives Mitglied
Noch eine Frage zu Testmethoden zu diesem Beispiel...

Wie kann ich denn eine Testmethode zu einer Paralleschaltung schreiben?
Warum sind meiner Methode r1 und r2 nicht bekannt?

Dieser Test sollte ja eigentlich nur für r1=600 und r2=600 funktionieren...

Java:
@Test
     public void test_r1r2_parallel()
    {
       
        assertEquals(300,r1.ohm()*r2.ohm()/(r1.ohm+r2.ohm),0.001);
    }
    }

Ich habe nicht so richtig verstanden warum man diese Testmethoden schreibt... irgendwie ist offensichtlich, da man ja ein Ergebnis erwartet beziehungsweise schon vorher berechnet hat...mit dem Taschenrechner oder sonst wie...
Okay außer dass man im Nachhinein Änderungen bemerken kann, wenn die Testmethode auf einmal nicht funktioniert usw.
Natürlich kann man die TESTMETHODE vorher schreiben und dann die Methode... macht ja auch irgendwie Sinn, da man das Ergebnis kennen muss um eine Testmethode zu schreiben...
 

mrBrown

Super-Moderator
Mitarbeiter
Neben dem Hinweis von fhoffmann auch noch ein kleiner Hinweis: Ohm ist doch nur die Einheit. Der Widerstand wird ja in Ohm angegeben.

Eine Methode "ohm" sagt auch wenig aus. Da ist nicht erkennbar, was die Methode macht oder zurück gibt.

Und wenn Du eine Instanzvariable widerstand hast und Du diese nach außen sichtbar haben willst, dann wäre das in der Regel einfach ein public double getWiderstand() { return widerstand; }
Würde ich in diesem Fall Ausnahmsweise mal anders sehen :) Widerstand.ohm sagt zumindest für mich genug aus, sogar mehr als Widerstand.getWiderstand - bei ersterem ist klar um was es geht und was die Einheit ist - bei letzterem fehlt die Einheit (Ohm? Milli-Ohm? Ananas/Sekunde?). Ähnlich wie bei z.B. Duration.seconds im Vergleich zu Duration.getDuration. :)
 

mrBrown

Super-Moderator
Mitarbeiter
Noch eine Frage zu Testmethoden zu diesem Beispiel...

Wie kann ich denn eine Testmethode zu einer Paralleschaltung schreiben?
Warum sind meiner Methode r1 und r2 nicht bekannt?

Dieser Test sollte ja eigentlich nur für r1=600 und r2=600 funktionieren...

Java:
@Test
     public void test_r1r2_parallel()
    {
     
        assertEquals(300,r1.ohm()*r2.ohm()/(r1.ohm+r2.ohm),0.001);
    }
    }

r1 und r2 sind Attribute des SerialResistorNet, nicht des Tests.

Dein Test in der Form ist auch sehr sinnlos, das man da nicht erkennt wozu die sichtbar sind ist klar :)

Ein sinnvoller Test könnte, in Pseudocode, etwa so aussehen:

Java:
Widerstand1 := 600 Ohm
Widerstand2 := 600 Ohm
Paralleschaltung schaltung = new Paralleschaltung(Widerstand1, Widerstand2)

assertEquals(300, schaltung.ohm(), 0.001);

Ich habe nicht so richtig verstanden warum man diese Testmethoden schreibt... irgendwie ist offensichtlich, da man ja ein Ergebnis erwartet beziehungsweise schon vorher berechnet hat...mit dem Taschenrechner oder sonst wie...
Okay außer dass man im Nachhinein Änderungen bemerken kann, wenn die Testmethode auf einmal nicht funktioniert usw.
Natürlich kann man die TESTMETHODE vorher schreiben und dann die Methode... macht ja auch irgendwie Sinn, da man das Ergebnis kennen muss um eine Testmethode zu schreiben...
Damit beschriebst du doch zwei Gründe, warum man die schreibt :)
* Sicherstellen, dass die Methode weiterhin funktioniert
* Sicherstellen, dass die Implementation der Spezifikation entspricht
* Die Methode dokumentieren
 

LucaToni

Aktives Mitglied
r1 und r2 sind Attribute des SerialResistorNet, nicht des Tests.

Dein Test in der Form ist auch sehr sinnlos, das man da nicht erkennt wozu die sichtbar sind ist klar :)

Ein sinnvoller Test könnte, in Pseudocode, etwa so aussehen:

Java:
Widerstand1 := 600 Ohm
Widerstand2 := 600 Ohm
Paralleschaltung schaltung = new Paralleschaltung(Widerstand1, Widerstand2)

assertEquals(300, schaltung.ohm(), 0.001);


Damit beschriebst du doch zwei Gründe, warum man die schreibt :)
* Sicherstellen, dass die Methode weiterhin funktioniert
* Sicherstellen, dass die Implementation der Spezifikation entspricht
* Die Methode dokumentieren

Also muss man in der Testmethode ganz genau die Werte für die Widerstände eingeben und nicht allgemein und dann gilt die Testmethode ja genau für einen einzigen Fall... ^^ Soll ich jetzt für jeden möglichen Wert eine Testmethode schreiben wenn da steht: Testen Sie alle möglichen Fälle ?
 
K

kneitzel

Gast
Würde ich in diesem Fall Ausnahmsweise mal anders sehen :) Widerstand.ohm sagt zumindest für mich genug aus, sogar mehr als Widerstand.getWiderstand - bei ersterem ist klar um was es geht und was die Einheit ist - bei letzterem fehlt die Einheit (Ohm? Milli-Ohm? Ananas/Sekunde?). Ähnlich wie bei z.B. Duration.seconds im Vergleich zu Duration.getDuration. :)
Ok, wenn man das mit dem Widerstand.getWiderstand sieht, dann wird das deutlich. Da sieht man die Dopplung sofort.

Auch das Beispiel bei Duration mit seconds ist gut.

Hatte nicht bedacht, dass es ja der Hauptwert ist.

Hast du also vollkommen Recht. War ich neben der Spur mit dem Hinweis.
 

mrBrown

Super-Moderator
Mitarbeiter
Also muss man in der Testmethode ganz genau die Werte für die Widerstände eingeben und nicht allgemein und dann gilt die Testmethode ja genau für einen einzigen Fall... ^^ Soll ich jetzt für jeden möglichen Wert eine Testmethode schreiben wenn da steht: Testen Sie alle möglichen Fälle ?
Dafür sucht ma Äquivalenzklassen und Grenzwerte :)

Äquivalenzklassen sind Gruppen von Werten, bei denn sich der Test "gleich" verhält. In diesem Fall wären das z.B. einmal alle validen Werte und einmal alle invaliden Werte. Zusätzlich dann noch alle Grenzwerte, quasi die Grenzen, an denen es von valide zu invalide wechselt.

Aus jeder "Gruppe" wählst du dann einen Repräsentanten, in diesem Fall hast du zB mit (600, 600) einen validen Repräsentanten gewählt. Wenn du das für alle Gruppen machst, hast du eine ziemlich hohe (an die 100% an Pfad-Überdeckung, wenns weniger ist fehlen Testfälle) Abdeckung.
 

mrBrown

Super-Moderator
Mitarbeiter
Ok, wenn man das mit dem Widerstand.getWiderstand sieht, dann wird das deutlich. Da sieht man die Dopplung sofort.

Auch das Beispiel bei Duration mit seconds ist gut.

Hatte nicht bedacht, dass es ja der Hauptwert ist.

Hast du also vollkommen Recht. War ich neben der Spur mit dem Hinweis.
Wenn ich drüber nachdenke ist Duration sogar eher ein schlechtes Beispiel 😅

Das ist eine Dauer, die eine Einheit hat - bei Widerstand ist's aber ein Widerstand, der einen Widerstand in Ohm hat...

Auf Englisch ist's etwas eindeutiger, da wär's Resistor.resistance(), fände ich sogar okay. Wobei man mit direkt Resistor.ohm keine Information verliert, aber die Einheit gewinnt, weshalb ich trotzdem dazu tendieren würde.


Am schönsten wäre es mit passenden Datentypen, also Resistance als Widerstand, Resistor als Bauteil. Wenn man dann noch Voltage und Current hat, kann man damit dann auch relativ schön typsicher rechnen. Werden die meisten aber zu viel Aufwand finden (in anderen Sprachen ginge das schöner als in Java)...
 

mihe7

Top Contributor
Ich will auch mal: ein ohmscher Widerstand hat einen (Widerstands)Wert, der in einer ohmschen Einheit angegeben wird.
 

Ähnliche Java Themen

Neue Themen


Oben