Forum: PC-Programmierung Frage zur Objektbildung


von KidMoritz (Gast)


Lesenswert?

Hallo Gemeinde,

ich habe ein kleines Verstaendnisproblem.
Ich braeuchte einen Gedankenanstoss zur Erstellung der richtigen Klasse 
bzw. deren Objekt.

Es geht um eine runde analoge Anzeige.
Sie besteht meines Erachtens nach aus 2 Teilen.
Dem starren Hintergrund(die Ziffernscheibe) und dem beweglichen Zeiger.
Ich wuerde den Hintergrund mit keiner Klasse beschreiben wollen.
Da es nur ein (totes) Bild ist.
Ist das so richtig gedacht?

Der Zeiger der Anzeige ist das womit mit ich arbeite.
Hierfuer erstelle ich eine Klasse mit ihren Eigenschaften und Methoden.

Oder ist die ganze Anzeige das Objekt und ich muss hier weiter 
unterteilen?


Danke im Voraus.

von Robert L. (lrlr)


Lesenswert?

zur frage (die man meiner Meinung nach nicht beantworten kann) trotzdem 
ein Gedanke:

der Hintergrund hat doch genauso bestimmte "properties" (zumindest höhe 
und breite, vielleicht sind die zeiger nicht in der mitte usw., min/max 
winkel usw )

kann man dann ja in einem Objekt speichern

von Karl H. (kbuchegg)


Lesenswert?

Wenn dein Hintergrund tatsächlich immer nur ein Bild ist, dann würde ich 
eine Klasse für den Hintergrund tatsächlich für Overkill halten.

Im Moment wäre mein erster Gedanke eine Klasse für das Anzeigeinstrument 
selber zu machen und eventuell eine Klasse für den Zeiger. Ob ich den 
Zeiger als eigene Klasse modelliere, würde ich unter anderem auch davon 
abhängig machen, ob ich diesen Zeiger noch an anderen Stellen brauchen 
kann und wie komplex dieser Zeiger werden wird.

Ein Anzeigeinstrument HAT dann einen Zeiger als interne Strukturierung. 
Genauso wie es eventuell ein Hintergrundobjekt haben könnte oder ein 
Skalenobjekt.

Schnittstelle zum Rest des Universums ist aber das Anzeigeobjekt. 
Darüber läuft die Kommunikation nach aussen und das Anzeigeobjekt 
verteilt dann wiederrum eingehende 'Befehle' an die einzelnen 
Teilobjekte bzw. koordiniert sie.
Von daher kann man später dem Anzeigeobjekt dann später immer noch eine 
feinere Klassenstruktur als Hilfsobjekte zur Verfügung stellen ohne dass 
sich im Rest des Universums viel ändert.

von KidMoritz (Gast)


Lesenswert?

Sorry, dass ich mich erst nach reichlich verstrichener Zeit bedanke.

Danke fuer die Formulierungen, wie es betrachtet werden kann.
Sicher ist es auch eine Sache der Uebung und der Erfahrung, wie man die 
Dinge sieht und sie programmiertechnisch umsetzt.

>Im Moment wäre mein erster Gedanke eine Klasse für das Anzeigeinstrument
>selber zu machen und eventuell eine Klasse für den Zeiger.

Ok, das Object Anzeigeinstrument mit seinen Eigenschaften,
 wie: mal abgesehen von den geometrischen Eigenschaften und das der 
Hintergrund kein bild sei
- skaleneinteilung : min / max, Schrittweite,

wuerde ich die Klasse so beschreiben wollen


>Ob ich den Zeiger als eigene Klasse modelliere, würde ich unter anderem >auch 
davon abhängig machen, ob ich diesen Zeiger noch an anderen Stellen >brauchen kann 
und wie komplex dieser Zeiger werden wird.

Wie komplex kann denn ein Zeiger sein?
Mir faellt da jetzt nur ein: min/max-Stellung des Zeigers, Schrittweite
und Methoden, wie:
- inkrementieren/dekrementieren

Was heisst an anderer Stelle?
Wenn ich 2 Anzeigen modellieren wollte?


Wenn ich den Zeiger bewegen moechte, sollte ich ihn dann an die 
Schrittweite des Anzeigeobjektes "binden"?
was ich damit meine ist, dass ich dem Zeiger quasi den Winkel oder die 
XY-Position an dem der Anzeigewert 50 steht uebergebe?
Kann dies mit Vererbung realisiert werden?
Oder reicht es den Zeiger ohne "DatenBindung" zur Anzeige drehen zu 
lassen?


>Ein Anzeigeinstrument HAT dann einen Zeiger als interne Strukturierung.

Wie das gemeint kann ich mir vorstellen.
Wie ist das programmiertechnisch zu sehen?
Basisklasse->angeleitete Klasse?


Danke im Voraus

von Karl H. (kbuchegg)


Lesenswert?

KidMoritz schrieb:

> Ok, das Object Anzeigeinstrument mit seinen Eigenschaften,
>  wie: mal abgesehen von den geometrischen Eigenschaften und das der
> Hintergrund kein bild sei
> - skaleneinteilung : min / max, Schrittweite,

Beschriftung, Strichlänge, wird jeder 5.te oder 10.te Strich länge 
gemacht, ist die Skala linear oder in einem Kreisbogen angeordnet, etc. 
etc.


> davon abhängig machen, ob ich diesen Zeiger noch an anderen Stellen >brauchen 
kann
> und wie komplex dieser Zeiger werden wird.
>
> Wie komplex kann denn ein Zeiger sein?
> Mir faellt da jetzt nur ein: min/max-Stellung des Zeigers, Schrittweite
> und Methoden, wie:
> - inkrementieren/dekrementieren

Wie wird seine Anzeige realisiert?
Ist das eine Bitmap, die um einen Punkt gedreht wird, oder eine einfache 
Linie. Vielleicht wird der auch als Polygonzug modelliert oder denk an 
eine Kirchtumuhr, bei der der Zeiger verschnörkelt ist.

> Was heisst an anderer Stelle?
> Wenn ich 2 Anzeigen modellieren wollte?

Na, wenn ich zb einen Zeiger brauche, der auf einer Anzeige ähnlich der 
Datums/Uhrzeit-Einstellung im iPhone nicht zu einem Drehinstrument 
gehört.

> Wenn ich den Zeiger bewegen moechte, sollte ich ihn dann an die
> Schrittweite des Anzeigeobjektes "binden"?

Kommt drauf an. Von extern (also ausserhalb der Klasse) bewegt sowieso 
keiner direkt den Zeiger, sondern das Objekt Auto gibt dem Objekt Tacho 
den Auftrag 'Anzeige der Fahrgschwindigkeit von 50 km/h'. Wie der Tacho 
das dann mit dem Zeiger realisiert, ist das Problem vom Tacho (also den 
Anzeigeinstrument) und nicht das Problem des Autos. Und wenn der Tacho 
festlegt (zb durch eine Konfigurationsvariable), dass er seinen Zeiger 
nur auf ganzzahlige Vielfache von 5 km/h stellen will, dann macht das 
das Anzeigeinstrument eben so.

> was ich damit meine ist, dass ich dem Zeiger quasi den Winkel oder die
> XY-Position an dem der Anzeigewert 50 steht uebergebe?

Ich würde das so machen, dass sich der Zeiger selbst darstellen kann. 
Und zwar mit seinem Referenzpunkt (gemeinhin als Drehpunkt bekannt) an 
einer bestimmten Position und von dort ausgehend in einem bestimmten 
Winkel. (Ich würde dafür eine 2D-Transformationsmatrix nehmen, aber das 
ist eine andere Geschichte)

Das Anzeigeinstrument hat dann die Aufgabe, den anzuzeigenden Wert 
mithilfe seines Skalenobjekts in interne Werte zu überführen und an 
seine mitwirkenden Einzelteile die entsprechenden Werte zu verteilen.

>>Ein Anzeigeinstrument HAT dann einen Zeiger als interne Strukturierung.
>
> Wie das gemeint kann ich mir vorstellen.
> Wie ist das programmiertechnisch zu sehen?
> Basisklasse->angeleitete Klasse?


Als Daumenregel

Wenn du umgangssprachlich sagst "IST EIN", dann ist das ein Hinweis für 
Vererbung.
Wenn du umgangssprachlich sagst "HAT EIN", dann ist das ein Hinweis für 
eine Member-Inklusion.

Also:
Ein Pkw IST EIN Auto, ein Lkw IST EIN Auto
1
   class Auto
2
   {
3
   };
4
5
   class Pkw : public Auto
6
   {
7
   }
8
9
   class Lkw : public Auto
10
   {
11
   }
Ein Auto HAT EINEN Motor
1
   class Auto
2
   {
3
4
     Motor motor_;
5
   };
6
7
   class Pkw : public Auto
8
   {
9
   }
10
11
   class Lkw : public Auto
12
   {
13
   }
Über den Weg der Vererbung erben damit Pkw und Lkw automatisch, dass sie 
einen Motor haben.

Ganz falsch hingegen wäre
1
   class Auto : public Motor
2
   {
3
   }
denn ein Auto IST KEIN Motor, also ist Motor auch keine Basisklasse für 
Auto. Aber: jedes Auto hat zb ein Lenkrad oder Sitze oder Türen oder 
Spiegel. Autotüren zb HABEN wiederrum einen Türöffner (sie SIND aber 
kein Türöffner) und oft auch ein Fenster. So ein Fenster HAT wiederrum 
einen Fensterheber. Eine simple Kurbel IST zb so ein Fensterheber, aber 
auch ein elektrischer Fensterheber IST EIN Fensterheber.

von KidMoritz (Gast)


Lesenswert?

Danke fuer die Formulierungen.
Das musste ich erst einmal verarbeiten.
Vor allem die Daumenregel hat meine Sicht gut erweitert. DANKE :)

>Ich würde das so machen, dass sich der Zeiger selbst darstellen kann.
>Und zwar mit seinem Referenzpunkt (gemeinhin als Drehpunkt bekannt) an
>einer bestimmten Position und von dort ausgehend in einem bestimmten
>Winkel.
Das macht fuer mich einiges leichter, auch fuer die Sicht-und 
Herangehensweise in  Zukunft.
Ich haette mich da wahrscheinlich im Labyrinth der Komplizierung 
verirrt.

Ist Sichtweise und Aufbau hier korrekt?: HAT-Regel
1
class Messgeraet
2
{
3
    Anzeige _anzeige;
4
}
5
6
class Anzeige
7
{
8
    Zeiger _zeiger;
9
}
10
11
class Zeiger
12
{
13
    
14
}

von Karl H. (kbuchegg)


Lesenswert?

KidMoritz schrieb:

> Ich haette mich da wahrscheinlich im Labyrinth der Komplizierung
> verirrt.

Das passiert allen am Anfang.
Es dauert einfach seine Zeit bis man die Objektorientierung 
verinnerlicht hat.

> Ist Sichtweise und Aufbau hier korrekt?: HAT-Regel

Mal sehen.
Dein Klassenapparat sagt mir:

* Ein Messgerät hat eine Anzeige (oder: kann eine Anzeige haben)
  Macht für mich Sinn. Denn zu einem Messgerät gehört ja noch mehr
  als nur die Anzeige (Messaufnehmer, Verstärker, Gehäuse, Strippen, ...
  Auf der anderen Seite ist ein Messgerät keine Anzeige, denn es gibt
  ja auch welche, die keine Anzeige haben, weil sie ihre Messwerte
  per TCP/IP oder UART rausgeben. Oder denken wir an die
  Einschubkarten in einen PC. Die haben selbst keine Anzeige.
  Daher kann "Ein Messgerät IST EINE Anzeige" nicht richtig sein.
  Ergo: In der Beziehung sieht dein Aufbau korrekt aus.

* Eine Anzeige hat einen Zeiger
  Auch das macht Sinn. Denn zu einer Anzeige gehört ja noch mehr
  als nur der Zeiger.
  Vielleicht hat eine Anzeige auch gar keinen Zeiger (zb 7-Segment),
  aber lass uns jetzt nicht spitzfindig werden. Wenn das zu
  berücksichtigen wäre, dann kann man da immer noch eine Klasse
  dazwischen schieben (AnalogAnzeige bzw. DigitalAnzeige).
  Dann gibt es eben Anzeigen und davon abgeleitet analoge Anzeigen
  und digitale Anzeigen. Analoge Anzeigen haben einen Zeiger,
  digitale nicht.

Dein Klassenaufbau macht für mich also in Summe Sinn. Das sieht logisch 
aus und entspricht so meiner Vorstellung davon, wie sich die Welt der 
Messgeräte aufbaut.

(PS: ein guter Klassenaufbau zeichnet sich oft auch dadurch aus, dass er 
auch im Nachhinein noch gut zu ändern geht. Wie zb hier: Wenn digitale 
Anzeigen ein Thema werden, dann geht das ganz einfach. Und das ist immer 
ein gutes Zeichen)

von KidMoritz (Gast)


Lesenswert?

Na, das hat ja schon einmal gut geklappt.
Schoen ware es wenn man solche verstaendlichen Erklaerungen in Buechern 
finden wuerde.
Um ein Buch zur Ojektorientierung werde ich dennoch nicht rummkommen.

Solch Daumeregeln sind wahre Schaetze, wenn man sie kennt.
Gibt es evtl noch weitere in deiner Schatzkiste?
Auch wenn sie mir im Moment noch keinen Bezug zu ProgammierThemen geben?

Danke und Gruss

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.