Ostatnio myślałem o zabezpieczeniu części mojego kodu. Ciekaw jestem, jak można się upewnić, że obiekt nigdy nie zostanie utworzony bezpośrednio, ale tylko za pomocą jakiejś metody klasy fabrycznej. Powiedzmy, że mam klasę „obiektów biznesowych” i chcę się upewnić, że każda instancja tej klasy będzie miała prawidłowy stan wewnętrzny. Aby to osiągnąć, będę musiał sprawdzić przed utworzeniem obiektu, prawdopodobnie w jego konstruktorze. Wszystko jest w porządku, dopóki nie zdecyduję, że chcę, aby ta kontrola była częścią logiki biznesowej. Jak więc ustawić, aby obiekt biznesowy był tworzony tylko za pomocą jakiejś metody w mojej klasie logiki biznesowej, ale nigdy bezpośrednio? Pierwsza naturalna chęć użycia dobrego, starego słowa kluczowego „przyjaciel” języka C ++ nie powiedzie się w przypadku języka C #. Potrzebujemy więc innych opcji ...
Spróbujmy na przykład:
public MyBusinessObjectClass
{
public string MyProperty { get; private set; }
public MyBusinessObjectClass (string myProperty)
{
MyProperty = myProperty;
}
}
public MyBusinessLogicClass
{
public MyBusinessObjectClass CreateBusinessObject (string myProperty)
{
// Perform some check on myProperty
if (true /* check is okay */)
return new MyBusinessObjectClass (myProperty);
return null;
}
}
Wszystko jest w porządku, dopóki nie przypomnisz sobie, że nadal możesz bezpośrednio utworzyć instancję MyBusinessObjectClass, bez sprawdzania danych wejściowych. Chciałbym całkowicie wykluczyć tę techniczną możliwość.
Więc co o tym myśli społeczność?