Estou escrevendo aulas que "devem ser usadas de uma maneira específica" (acho que todas as aulas devem ...).
Por exemplo, eu crio a fooManager
classe, que requer uma chamada para, digamos Initialize(string,string)
,. E, para levar o exemplo um pouco mais longe, a classe seria inútil se não ouvirmos sua ThisHappened
ação.
O que quero dizer é que a classe que estou escrevendo exige chamadas de método. Mas ele será compilado muito bem se você não chamar esses métodos e acabar com um novo FooManager vazio. Em algum momento, ele não funcionará ou poderá falhar, dependendo da classe e do que faz. O programador que implementa minha classe obviamente olhava para dentro e percebia "Ah, eu não chamei Initialize!", E tudo ficaria bem.
Mas eu não gosto disso. O que eu idealmente desejaria é o código para NÃO compilar se o método não fosse chamado; Acho que isso simplesmente não é possível. Ou algo que seria imediatamente visível e claro.
Sinto-me incomodado com a atual abordagem que tenho aqui, que é a seguinte:
Adicione um valor booleano privado na classe e verifique em todos os lugares necessários se a classe foi inicializada; caso contrário, lançarei uma exceção dizendo "A turma não foi inicializada, você tem certeza de que está ligando .Initialize(string,string)
?".
Eu estou bem com essa abordagem, mas ela leva a um monte de código que é compilado e, no final, não é necessário para o usuário final.
Além disso, às vezes é ainda mais código quando há mais métodos do que apenas um Initiliaze
para chamar. Eu tento manter minhas classes com não muitos métodos / ações públicos, mas isso não está resolvendo o problema, apenas mantendo-o razoável.
O que eu estou procurando aqui é:
- Minha abordagem está correta?
- Existe um melhor?
- O que vocês fazem / aconselham?
- Estou tentando resolver um problema não? Os colegas me disseram que é do programador verificar a turma antes de tentar usá-la. Eu discordo respeitosamente, mas esse é outro assunto em que acredito.
Simplificando, estou tentando descobrir uma maneira de nunca esquecer de implementar chamadas quando essa classe for reutilizada mais tarde ou por outra pessoa.
ESCLARECIMENTOS:
Para esclarecer muitas perguntas aqui:
Definitivamente, não estou falando apenas da parte de Inicialização de uma classe, mas de toda a vida. Evite que os colegas chamem um método duas vezes, certificando-se de chamar X antes de Y etc. Qualquer coisa que acabe sendo obrigatória e documentada, mas que eu gostaria em código, o mais simples e pequeno possível. Eu realmente gostei da ideia do Asserts, embora tenha certeza de que precisarei misturar outras idéias, pois o Asserts nem sempre será possível.
Estou usando a linguagem C #! Como eu não mencionei isso ?! Estou em um ambiente Xamarin e construindo aplicativos móveis geralmente usando de 6 a 9 projetos em uma solução, incluindo projetos PCL, iOS, Android e Windows. Sou desenvolvedor há cerca de um ano e meio (escola e trabalho combinados), daí minhas declarações / perguntas às vezes ridículas. Tudo isso provavelmente é irrelevante aqui, mas muita informação nem sempre é uma coisa ruim.
Nem sempre posso colocar tudo o que é obrigatório no construtor, devido a restrições de plataforma e ao uso de Injeção de Dependência, ter parâmetros diferentes de Interfaces está fora de questão. Ou talvez meu conhecimento não seja suficiente, o que é altamente possível. Na maioria das vezes, não é um problema de inicialização, mas mais
como posso garantir que ele se inscreveu nesse evento?
como posso ter certeza de que ele não esqueceu de "parar o processo em algum momento"
Aqui me lembro de uma aula de busca de anúncios. Desde que a visualização em que o anúncio esteja visível seja visível, a classe buscará um novo anúncio a cada minuto. Essa classe precisa de uma visualização, quando construída, onde possa exibir o anúncio, que poderia ir em um parâmetro obviamente. Mas, uma vez que a exibição se foi, StopFetching () deve ser chamado. Caso contrário, a classe continuaria buscando anúncios para uma visualização que não existe, e isso é ruim.
Além disso, essa classe tem eventos que devem ser ouvidos, como "AdClicked", por exemplo. Tudo funciona bem se não for ouvido, mas perdemos o rastreamento das análises lá se os toques não forem registrados. No entanto, o anúncio ainda funciona, para que o usuário e o desenvolvedor não vejam a diferença e a análise tenha apenas dados incorretos. Isso precisa ser evitado, mas não tenho certeza de como o desenvolvedor pode saber que deve se registrar no evento tao. Esse é um exemplo simplificado, mas a idéia está aí: "certifique-se de que ele use a ação pública que está disponível" e nos momentos certos, é claro!
initialize
ser feita depois da criação do objeto? O ctor seria muito "arriscado" no sentido em que poderia lançar exceções e quebrar a cadeia de criação?
new
se o objeto não estiver pronto para ser usado. Contar com um método de inicialização provavelmente voltará para assombrá-lo e deve ser evitado, a menos que seja absolutamente necessário, pelo menos essa é a minha experiência.