"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

c++: member acces to other members of parent

wergor 02.03.2018 - 11:04 2456 7
Posts

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: graz
Posts: 4027
ich habe eine klasse (wetterstation) die mehrere andere klassen (sensoren) als member enthält. die sensor-klassen haben ein einheitliches interface und sind komplett unabhängig voneinander. sie werden einmal konfiguriert und werden danach nur noch gelesen.
Code: CPP
class ObservingConditions
{
[...]
private:
	YAAASensor *sensor_dew_point_;
	YAAASensor *sensor_humidity_;
	YAAASensor *sensor_temperature_;
};

class YAAASensor
{
public:
[...]
	virtual bool begin() = 0;

	virtual bool measure() = 0;

	virtual bool hasValue() = 0;

	virtual float getValue() = 0;
};
in diesem beispiel lässt sich der taupunkt aus der temperatur und luftfeuchtigkeit berechnen. wie verschaffe ich dem objekt sensor_dew_point_ zugriff auf die anderen beiden sensoren? ich könnte dem taupunktsensor referenzen auf die anderen beiden sensoren mitgeben, was aber imho bestenfalls fragwürdig ist, oder eine referenz auf das ObservingConditions objekt, was mir aber auch nicht so recht gefallen mag. das YAAASensor interface will ich nicht ändern und den einen sensor auch nicht anders behandeln als alle anderen (also keine zusätzlichen funktionen).

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Einen back pointer auf parent koenntest du schon im Interface definieren, das ist nicht perfekt aber dennoch eine recht gaengige practice.

https://softwareengineering.stackex...he-parent-class

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5200
Vielleicht überseh ich grad was, aber warum machst du die Berechnung nicht einfach in der Klasse ObservingConditions? Dort hast du Zugriff auf alle Sensoren.

Und was ich nicht ganz check: Warum gibt es einen eigenen Sensor für den Taupunkt, wenn er aus den Daten der anderen beiden Sensoren berechnet wird?

-=Willi=-

The Emperor protects
Avatar
Registered: Aug 2003
Location: ~
Posts: 1624
Zitat aus einem Post von tinker
Vielleicht überseh ich grad was, aber warum machst du die Berechnung nicht einfach in der Klasse ObservingConditions? Dort hast du Zugriff auf alle Sensoren.

Und was ich nicht ganz check: Warum gibt es einen eigenen Sensor für den Taupunkt, wenn er aus den Daten der anderen beiden Sensoren berechnet wird?

Ja seh ich auch so. Ich würd `sensor_dew_point_` entfernen und `ObservingConditions` ein paar Methoden zum Holen/Berechnen der eigentlichen Werte geben.

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11326
Zitat aus einem Post von wergor
in diesem beispiel lässt sich der taupunkt aus der temperatur und luftfeuchtigkeit berechnen.

Damit ist es kein Sensor, sondern ein Berechner.

Zitat aus einem Post von wergor
wie verschaffe ich dem objekt sensor_dew_point_ zugriff auf die anderen beiden sensoren? ich könnte dem taupunktsensor referenzen auf die anderen beiden sensoren mitgeben, was aber imho bestenfalls fragwürdig ist, oder eine referenz auf das ObservingConditions objekt, was mir aber auch nicht so recht gefallen mag.

Fragwürdig ist es nur, weil du verschiedene Dinge mit dem selben Interface behandeln willst und dein Interface "Sensor" heißt. Ich würde es auch fragwürdig finden, wenn ein Sensor irgendwas von anderen Sensoren wissen soll. Wenn du YAAASensor aber weniger als Sensor-Interface siehst, sondern eher als einheitliches Interface zum *Auslesen* von Sensordaten oder abgeleiteten Daten, ist das in Ordnung.

Du hast aber hinter dem Interface zwei grundverschiedene Implementierungen deiner "Sensoren": Echte Sensoren messen irgendwas aus der Außenwelt, und dein "Taupunktsensor" leitet Daten aus anderen Sensoren ab. Damit brauchst er eine andere Implementierung, und da darf er durchaus andere Sensoren kennen. Das ist aber ein Implementierungsdetail und muss/soll sich nicht auf das Auslese-Interface auswirken.

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: graz
Posts: 4027
Zitat aus einem Post von tinker
Und was ich nicht ganz check: Warum gibt es einen eigenen Sensor für den Taupunkt, wenn er aus den Daten der anderen beiden Sensoren berechnet wird?
die idee dahinter ist, dass ich stattdessen einen physischen taupunktsensor verwenden könnte, dann müsste ich nur ein anderes objekt instanzieren und mich um sonst nichts kümmern.
die einfachste lösung wäre natürlich die taupunktberechnung in ObservingConditions zu implementieren, ich würde aber gerne das sammeln / berechnen von daten von dieser klasse getrennt halten.

Vinci

hatin' on summer
Registered: Jan 2003
Location: Wien
Posts: 5774
Ist imho eine legitime Idee und damit ein klasssiches Dependency Injection Problem. Ich würde das YAAASensor Interface um eine Variante erweitern, die die beiden anderen Sensoren im Konstruktur schluckt.

Code: C++
class YAAASensorMock : public YAAASensor {
  YAAASensorMock(YAAASensor* hs, YAAASensor* ts) : hs{hs}, ts{ts} {}

  virtual bool hasValue() final { ... };

private:
  YAAASensor* hs;  // humidity
  YAAASensor* ts;   // temperature
};


Naja, nein, würd ich eigentlich nicht. :D
Ich würd das Sensor-Interface mittlerweile wohl als Concept anlegen um die vtables verlässlich loszuwerden... aber das ändert am grundlegenden Design nichts.

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: graz
Posts: 4027
ich werde die berechnung in der ObservingConditions klasse implementieren, ist die saubere lösung (glaube ich).
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz