Нещодавно я думав про захист свого коду. Мені цікаво, як можна переконатись, що об’єкт ніколи не може бути створений безпосередньо, а лише за допомогою якогось методу заводського класу. Скажімо, у мене є клас «бізнес-об’єкт», і я хочу переконатися, що будь-який екземпляр цього класу матиме дійсний внутрішній стан. Для цього мені потрібно виконати певну перевірку перед створенням об'єкта, можливо, в його конструкторі. Це все гаразд, поки я не вирішу, що хочу зробити цю перевірку частиною бізнес-логіки. Отже, як я можу організувати можливість створення бізнес-об’єкта лише за допомогою якогось методу в моєму класі бізнес-логіки, але ніколи безпосередньо? Перше природне бажання використати старе добре ключове слово "друг" на C ++ буде невдалим із C #. Тож нам потрібні інші варіанти ...
Спробуємо на прикладі:
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;
}
}
Все гаразд, поки ви не пам’ятаєте, що ви все ще можете створити екземпляр MyBusinessObjectClass безпосередньо, не перевіряючи введення. Я хотів би повністю виключити цю технічну можливість.
Отже, що про це думає громада?