dobra praktyka dla obsługi wyjątków w konstruktorze

0

Jak rzucamy wyjątek w konstruktorze, to wiadomo taki obiekt nie jest tworzony w związku z czym destruktor się nie wywoła.
Czy zatem dobra praktyka (jak już ktoś używa wyjątków w konstruktorze, bo też w sumie można przenieść implementację do innej metody i ją wywołać w głównej pętli programu), to czy zatem dobra praktyka polega na stworzeniu metody np. "release()" i wywoływaniu jej w destruktorze jak i po złapaniu wyjątku? Przykład niżej.

 
Goalnet::Goalnet(D3DXVECTOR3 pos, float angle)
{
  try
  {
    if(Model::loadMesh(mapping::goalnet_path, mGoalnet) == NOK)
        throw runtime_error("Goalnet::Goalnet() - goalnet mesh not created");

    addToNetMeshVertexIndices();

    if(Model::loadMesh(mapping::net_path, mNet) == NOK)
        throw runtime_error("Goalnet::Goalnet() - net mesh not created");
    
	mGoalnet.pos = new D3DXVECTOR3;
	*mGoalnet.pos = pos;

	D3DXMatrixRotationY(&mMatOrientation, angle);
	mMatOrientation._41 = pos.x;
	mMatOrientation._42 = pos.y;
	mMatOrientation._43 = pos.z;

	prepareInternalBlockData();
  }
  catch(const runtime_error &e)
  {
	  release();
	  throw e;
  }
  catch(const bad_alloc& e)
  {
      release();
      throw runtime_error("Goalnet::Goalnet error code " + string(e.what()));
  }
}
Goalnet::~Goalnet()
{
    release();
}
void Goalnet::release()
{
    mGoalnet.release();
    mNet.release();
}
1

Stwórz metodę fabrykującą, a w konstruktorze zostaw tylko przypisanie składowych.

0

Nie rozumiem jak by miała mi tu pomóc metoda fabrykująca: http://www.algorytm.org/wzorce-projektowe/metoda-wytworcza-factory-method.html
Czy w ten sposób że w niej mam łapac wyjątki i w obsłudze catch wywoływać metodę release() od produktu?

1

Nie chodziło mi o jakiś wysublimowany wzorzec, tylko o zwykłą funkcję statyczną (jeśli jest potrzeba to może być i osobna fabryka/ budowniczy), która by budowała zależności dla Goalnet, a sam konstruktor klasy Goalnet robił tylko przypisywania.

Klasy, które robią dużo w konstruktorze ciężko się testuje, ciężko się rozszerza i łatwo się pogubić w kolejności inicjalizacji obiektu, co skutkuje odpalaniem metod wykorzystujących niezainicjalizowany jeszcze stan.

Artykuły:
http://stackoverflow.com/questions/3905784/what-not-to-do-in-a-constructor
http://stackoverflow.com/questions/293967/how-much-work-should-be-done-in-a-constructor
http://stackoverflow.com/questions/7048515/is-doing-a-lot-in-constructors-bad
http://misko.hevery.com/code-reviewers-guide/flaw-constructor-does-real-work/
Niektóre dotyczą Javy i opisują wstrzykiwanie zależności, którego nie ma w C++. Jednak sama idea budowania grafu zależności poza konstruktorami ma zastosowanie w każdym języku z OOP.

Czy w ten sposób że w niej mam łapac wyjątki i w obsłudze catch wywoływać metodę release() od produktu?

Tak.

1 użytkowników online, w tym zalogowanych: 0, gości: 1