Die Diskussion über die Frage, ob es ein Parameter sein sollte (aus Designsicht), ist völlig schwachsinnig, weil dafür die nötigen Informationen fehlen.
Allgemein kann man sagen "Parameter sind besser als Instanzvariablen", so wie man sagen kann "Lokale Variablen sind besser als globale". Es ist immer besser, den Gültigkeitsbereich so klein wie möglich und so groß wie nötig zu halten.
Hier ist aber überhaupt nicht definiert, welcher Gültigkeitsbereich nötig ist.
Z.B. ist gar nicht genannt, was denn "die jeweilige Klasse" ist. Das spielt aber, wie folgendes Beispiel zeigt, eine wichtige Rolle.
Code:
//cool typedefs here
//...
class DrawableMenu
{
public:
virtual void Draw(DeviceType *device) = 0;
//...
};
class FancyMenu : public DrawableMenu
{
void DrawSomeSubMenu(DeviceType *device);
public:
virtual void Draw(DeviceType *device);
//...
};
void FancyMenu::DrawSomeSubMenu(DeviceType *device)
{
//draw this shit
}
void FancyMenu::Draw(DeviceType *device)
{
DrawSomeSubMenu(device);
//draw even more
}
class MenuController
{
std::vector<DrawableMenu *> _menus;
DeviceType *_device;
public:
MenuController(DeviceType *device, const std::vector<DrawableMenu *> &menus)
: _device(device)
, _menus(menus)
{}
void UpdateMenus();
};
void MenuController::UpdateMenus()
{
//...
for (DrawableMenu *menu : _menus)
{
menu->Draw(_device);
}
//...
}
std::vector<DrawableMenu *> CreateMenus()
{
//...
}
HRESULT __stdcall hkEndScene(DeviceType *device)
{
static MenuController menuController(device, CreateMenus());
//...
menuController.UpdateMenus();
return origEndScene(device);
}
(man entschuldige meine eingerosteten C++ Kenntnisse)
MenuContoller realisiert hier eine Verwaltung von mehreren D3D Menüs für ein Device. Er selbst speichert daher selbiges Device, da er daran gebunden ist und es mehr oder weniger verwaltet.
Ein Menü hingegen kann an beliebig vielen Controllern hängen und zumindest rein theoretisch mit beliebig vielen Devices gezeichnet werden. Es hat also keine Instanzvariable, sondern erhält das Device für die Zeichnung als Parameter. Zwar wird das Device ebenfalls in weiteren privaten Methoden gebraucht, aber an den nötigen Stellen wird es dann halt durchgereicht, denn es wäre unsauber und fehleranfällig, eine Instanzvariable zum Durchreichen zu verwenden, nur um sich den zusätzlichen Parameter bei den betroffenen Methoden zu sparen.
Quote:
da die objektorientierte lösung deutlich sauberer ist
[...]
Kann zwar je nach anwendungsfall anders sein, in der regel wird aber die objektorientierte lösung wesentlich sauberer sein - und nicht per parameter.
|
Nur dass eine Instanzvariable für etwas zu verwenden nicht automatisch bedeutet, dass es objektorientiert(er) ist als die Version mit dem Parameter.
Quote:
|
Du musst halt überlegen, wie du die Relation am besten darstellen kannst. Wenn dein Sprite-Objekt unabhängig vom D3D-Kontext existieren kann, würde ich nicht unbedingt den Zeiger speichern, da du nicht wissen kannst, ob der noch gültig ist.
|
^this