Wywalanie obiektu na kostruktorze ma sens, ale nie jezeli uzywamy bezposredniego wywolania. Lepiej zrobic jakas warstwe pomiedzy ktora ulatwi korzystanie z klasy
I tak, i nie. To wszystko zależy od projektu. Bo może tworzysz wszystkie trójkąty raz w jednym miejscu.
Wyobrazcie sobie taka sytuacje. Macie kod, ktory tworzy ten trojkat. I robicie
auto triangle = new Triangle(1,5,2);
I taki kod wam sie wywala (w sensie rzuca wyjatek) teraz musicie robic try catch wokol tego. W okol tworzenia jakiegos obiektu po przez kontstuktor.
Wymaga to
- posiadanie wiedzy jak dokladnie taka klasa jest zaimplementowana (nie mozliwe w przypadku DLL)
- czytanie dokumentacji
Ad 1. Wystarczy przeczytać dokumentację.
Ad 2. Siadanie do nowej biblioteki bez czytania dokumentacji często skończy się porażką.
Oczywiscie, kazdy powinien takie rzeczy czytac i robic zanim napisze kod. Ale lepiej jest gdy kod podpowiada, ze dana rzecz moze wyrzucic wyjatek (szybciej i latwiej sie kodzi)
Zawsze można zrobić odpowiednie komentarze, które pojawią się np. w Intelisensie.
auto triangle = TriangleFactory.TryToCreate(1,5,2);
albo jeszcze lepiej, jezeli to ma byc kod wewnetrzny, to nie potrzebujemy wyjatkow (tam gdzie tworzymy triangle, oczywiscie factory wewnetrznie bedzie mialo obsluge wyjatku). Mozemy zwrocic obiekt z rezultem (to jest moj
gust odnosnie tego)
auto resultOfCreation = TriangleFactory.Create(1,5,2);
if (resultOfCreation.successful)
{
auto triangle = resultOfCreation.createdObject;
}
Czyli albo będziesz miał nullowy obiekt bez żadnej informacji o tym (będziesz musiał sprawdzać, czy trójkąt faktycznie się utworzył), albo będziesz musiał mieć optionale, co już wydaje się lepszym pomysłem i sprawdzać za każdym razem, czy trójkąt się utworzył. To już lepiej by było połączyć to w taki sposób:
Triangle * p;
if(TriangleFactory.TryCreate(1, 5, 2, &p)
{
}
(dla czepialskich, można oczywiście użyć smart pointerów tutaj :))
To wszystko tak naprawdę zależy od projektu. Bo jeśli, tak jak mówiłem, mamy trójkąty tworzone w pętli albo partiami, no to throw w konstruktorze jest odpowiednim wyjściem. Jeśli natomiast to projekt, w którym w wielu miejscach tworzy się jeden trójkąt, to można pomyśleć o czymś, co nie wymaga w każdym z tych miejsc obsługi wyjątków (to może być przerost formy nad treścią, bo w różnych miejscach możesz mieć różne wymagania). A może wystarczy obsługę wyjątków przenieść na odpowiedni poziom wyżej... Wszystko zależy od projektu.