Laden...

Eigenschaften auch weglassen?

Erstellt von al3ko vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.929 Views
A
al3ko Themenstarter:in
42 Beiträge seit 2006
vor 17 Jahren
Eigenschaften auch weglassen?

Hey Leute,

ich bin gerade dabei, einen Taschenrechner zu programmieren. Dabei ist mir aufgefallen, dass ich da 2 sich ähnelnde Möglichkeiten habe.

Möglichkeit 1:

using System;
using System.Collections.Generic;
using System.Text;

namespace Bruch
{
  class Rechnung
  {
    //Member deklarieren
    int zähler;
    int nenner;

    //Eigenschaften
    public int Zähler
    {
      get { return zähler; }
      set { zähler = value; }
    }
    public int Nenner
    {
      get { return nenner; }
      set { nenner = value; }
    }

    //Methode Frage
    public void Frage()
    {
      Console.Write("Zähler: ");
      Zähler = Int32.Parse(Console.ReadLine());
      Console.Write("Nenner: ");
      Nenner = Int32.Parse(Console.ReadLine());
    }
    //Methode Zeige
    public void Zeige()
    {
      Console.Write("Der Bruch lautet: " + Zähler + "/" + Nenner);
      Console.ReadLine();
    }
    //Methode Addiere
    public void Add(){

  }
}

und Möglichkeit 2:


using System;
using System.Collections.Generic;
using System.Text;

namespace Bruch
{
  class Rechnung
  {
    //Member deklarieren
    int zähler;
    int nenner;

    //Methode Frage
    public void Frage()
    {
      Console.Write("Zähler: ");
      zähler = Int32.Parse(Console.ReadLine());
      Console.Write("Nenner: ");
      nenner = Int32.Parse(Console.ReadLine());
    }
    //Methode Zeige
    public void Zeige()
    {
      Console.Write("Der Bruch lautet: " + zähler + "/" + nenner);
      Console.ReadLine();
    }
    //Methode Addiere
    public void Add()
    {

    }
  }
}

Bei der zweiten Möglichkeit habe ich die Eigenschaften weggelassen und für meine Frage und Zeige Methode die Member zähler und nenner einlesen lassen.
Bei der ersten Möglichkeit hingegen habe ich bei der Frage und Zeige Methode die Eigenschaften einlesen lassen, die ja die Schnittstellen für meine Member sind. Beides funktioniert, nur was ist im Sinne der OOP richtig?

PS: Ich habe in meiner Main() Methode eine Instanz (Objekt) von der Klasse Rechnung erzeugt. Das sieht dann so aus:


using System;
using System.Collections.Generic;
using System.Text;

namespace Bruch
{
  class Program
  {
    static void Main(string[] args)
    {
      Rechnung bruch1 = new Rechnung();
      bruch1.Frage();
      bruch1.Zeige();
    }
  }
}

F
722 Beiträge seit 2005
vor 17 Jahren

Hallo,

ich würde dir raten, Tastatureingaben in deinem Objektmodell zu vermeiden. Wenn du eine Klasse schreibst, die einen Bruch abbildet, ist das eine gute Idee. Tastatureingaben sollten aber IMMER nur durch die Main Methode gemacht werden, und an die jeweiligen Klassen weitergegeben werden. Dazu hast du ja auch schon Eigenschaften definiert. Wenn du deine Klasse irgendwann einmal in einer Win-Form Applikation einsetzten willst, wirst du mit den Conse.ReadLine() Aufrufen Probleme bekommen. Deshalb: Tastatureingaben und Objektmodell immer strikt trennen. Ich hoffe das war einigermaßen verständlich erklärt =)

Gruß

A
al3ko Themenstarter:in
42 Beiträge seit 2006
vor 17 Jahren

das hieße dann ja, dass ich zwei variablen in meiner Main() Methode erzeugen muss, die mittels console.writeline und console.readline eingelesen werden und einen wert bekommen? mithilfe meiner eigenschaften, die ich in der klasse rechnung geschaffen habe, können auf die variablen dann auch von der klasse rechnung zugegriffen werden?

nur mal so am rande: ich bin noch neu in der welt von c# und wir haben das projekt taschenrechner in unseren vorlesungen gehabt. dort haben wir es nicht so gemacht, dass wir die variablen in der main() methode deklariert und eingelesen haben. wir haben es eher so gemacht, wie ich es gepostet habe. nur ist mir dann dabei aufgefallen, dass ich zwei möglichkeiten habe...

aber ich glaube, dass ich dich schon verstanden habe. nur ist das dann nicht an der OOP vorbeiprogrammiert? ich meine, es so verstanden zu haben, dass in der main methode lediglich die objekte erzeugt werden und in den klassen die baupläne meines bruches sind? das ist doch der witz bei der oop, oder?

F
722 Beiträge seit 2005
vor 17 Jahren

Original von al3ko
ich meine, es so verstanden zu haben, dass in der main methode lediglich die objekte erzeugt werden und in den klassen die baupläne meines bruches sind? das ist doch der witz bei der oop, oder?

der witz an der oop ist vor allem, dass klassen wiederverwendbar sind. das wäre aber nicht der fall, wenn du darin daten per Console.ReadLine() einliest. Denn dann wären deine klassen auf den anwendungstyp konsolen-applikation beschränkt.

M
402 Beiträge seit 2005
vor 17 Jahren

Hi Al3ko!

Ich kenne solche "Beispiele" und Probleme aus eigener Erfahrung...

Du schreibst in Deinem ersten Posting dass Du ja "eigentlich" 2 Möglichkeiten
hast auf die Klassenvariablen zuzugreifen. Das ist "eigentlich" schon richtig.

Auf die Variablen einer Klasse sollte ja nicht von aussen, also von einer
anderen Klasse, direkt zugegriffen (lesend und schreibend) werden können.
Aus diesem Grund sind sie als PRIVATE deklariert.

Weil man aber trotzdem von aussen Werte an die Klasse übergeben können
muss gibts die Eigenschaften, die mit get und set die Werte aus den
Klassenvaris auslesen bzw. in sie speichern.

Möchte ich aber Werte der Klassenvariabeln direkt aus der Klasse abrufen,
brauch ich dazu keine Eigenschaften weil ich direkten Zugriff habe.
(Deine 2. Möglichkeit)

Gemixt mit den Antworten meiner Vorposter gibts für Dich aus OO-Sicht
daher "eigentlich" nur eine Möglichkeit:

Die Klasse Rechnung aus Möglichkeit 1 (ohne die Methode Frage).
Das Einlesen der Werte für Zähler und Nenner übernimmt in deinem Fall die Main().
Und "eigentlich könnte man sich aber für die Methode "Zeige" auch etwas anderes
einfallen lassen.... zb. einfach nur den String returnen und in der Main ausgeben...


using System;
using System.Collections.Generic;
using System.Text;

namespace Bruch
{
  class Program
  {
    static void Main(string[] args)
    {
      Rechnung bruch1 = new Rechnung();
      bruch1.Nenner = Int32.Parse(Console.ReadLine());
      bruch1.Zähler = Int32.Parse(Console.ReadLine());
      System.Write(bruch1.Zeige());
    }
  }
} 

R
494 Beiträge seit 2006
vor 17 Jahren

Da kannst du dann im Setter vom Zähler auch gleich auf != 0 prüfen 🙂

A
al3ko Themenstarter:in
42 Beiträge seit 2006
vor 17 Jahren

Original von regen
Da kannst du dann im Setter vom Zähler auch gleich auf != 0 prüfen 🙂

jaa, das weiß ich ja. das sollte allerdings das geringste problem sein. mir geht es erstmal ums prinzip der klassen und der oop. ich verstehe eure beiträge und argumente. werde mal gucken, wie ich das mache, erstmal für die prüfung morgen büffeln 8)

N
750 Beiträge seit 2004
vor 17 Jahren

Original von regen
Da kannst du dann im Setter vom Zähler auch gleich auf != 0 prüfen 🙂

ich denke die prüfung im nenner wäre sinnvoller 🙂 oder ? 8)

?( wer suchet, der findet auch! :]

R
494 Beiträge seit 2006
vor 17 Jahren

Original von nils

Original von regen
Da kannst du dann im Setter vom Zähler auch gleich auf != 0 prüfen 🙂

ich denke die prüfung im nenner wäre sinnvoller 🙂 oder ? 8)

achwas 😁

ja, stimmt, verwechselt 🙁