Recentemente, tenho pensado em proteger parte do meu código. Estou curioso para saber como alguém poderia ter certeza de que um objeto nunca pode ser criado diretamente, mas apenas por meio de algum método de uma classe de fábrica. Digamos que eu tenha alguma classe de "objeto de negócios" e quero ter certeza de que qualquer instância dessa classe terá um estado interno válido. Para conseguir isso, vou precisar fazer algumas verificações antes de criar um objeto, provavelmente em seu construtor. Está tudo bem até eu decidir que quero fazer com que essa verificação faça parte da lógica de negócios. Portanto, como posso fazer com que um objeto de negócios seja criável apenas por meio de algum método em minha classe de lógica de negócios, mas nunca diretamente? O primeiro desejo natural de usar uma boa e velha palavra-chave "amiga" do C ++ ficará aquém do C #. Então, precisamos de outras opções ...
Vamos tentar alguns exemplos:
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;
}
}
Está tudo bem até você se lembrar que ainda pode criar a instância MyBusinessObjectClass diretamente, sem verificar a entrada. Eu gostaria de excluir totalmente essa possibilidade técnica.
Então, o que a comunidade pensa sobre isso?
CreateBusinessObject
método é validar argumentos AND para (retornar um novo objeto válido OU retornar um erro) em uma única chamada de método quando um chamador não sabe imediatamente se os argumentos são válidos para passar para o construtor.
Distance
instância com um argumento negativo deve lançar um, ArgumentOutOfRangeException
por exemplo, você não ganharia nada criando um DistanceFactory
que faça a mesma verificação. Ainda não vejo o que você tem a ganhar aqui.