Eu tenho um algoritmo iterativo e quero imprimir o progresso. No entanto, eu também posso querer que não imprima qualquer informação, ou imprima de forma diferente, ou faça outra lógica. Em uma linguagem orientada a objetos, eu executaria as seguintes soluções:
Solução 1: método virtual
tem a classe de algoritmo MyAlgoClass que implementa o algoritmo. A classe também implementa um método virtual reportIteration (iterInfo) que está vazio e pode ser reimplementado. Subclasse o MyAlgoClass e substitua reportIteration para que ele faça o que precisa fazer. Essa solução permite transportar informações adicionais (por exemplo, a unidade de arquivo) na classe reimplementada.
Eu não gosto desse método porque ele agrupa duas funcionalidades que podem não estar relacionadas, mas em aplicativos GUI pode estar tudo bem.
Solução 2: padrão de observação
a classe do algoritmo tem um método de registro (Observer), mantém uma lista dos observadores registrados e cuida da chamada notify () em cada um deles. Observer :: notify () precisa de uma maneira de obter as informações do Sujeito, então ele tem dois parâmetros, um com o Sujeito e outro com os dados que o Sujeito pode passar, ou apenas o Sujeito e o Observador estão agora no comando. de consultá-lo para buscar as informações relevantes.
Solução 3: retornos de chamada
Eu costumo ver o método de retorno de chamada como um observador leve. Em vez de passar um objeto, você passa um retorno de chamada, que pode ser uma função simples, mas também um método de instância nos idiomas que o permitem (por exemplo, em python porque passar um método de instância permanecerá vinculado à instância). No entanto, o C ++ não permite, porque se você passar um ponteiro para um método de instância, this
não será definido. Por favor, corrija-me a esse respeito, meu C ++ é bem antigo.
O problema com retornos de chamada é que geralmente você tem que passá-los junto com os dados que você deseja que o retorno de chamada seja invocado. Os retornos de chamada não armazenam o estado, portanto, é necessário passar o retorno de chamada e o estado para o Subject
para encontrá-lo na execução do retorno de chamada, juntamente com todos os dados adicionais que o Subject
fornecer sobre o evento. / p>
Pergunta
Minha pergunta é relativa ao fato de que eu preciso implementar o problema de abertura em uma linguagem que não é orientada a objetos, a saber Fortran 95, e estou lutando com meu raciocínio usual que é baseado em suposições e estilo python. Eu acho que em Fortran o conceito é similar ao C, com o problema adicional que em C você pode armazenar um ponteiro de função, enquanto no Fortran 95 você pode apenas passá-lo.
Você tem algum comentário, sugestão, dicas e peculiaridades a esse respeito (em C, C ++, Fortran e python, mas também em qualquer outro idioma, para ter uma comparação dos recursos de linguagem que podem ser explorados a esse respeito? ) sobre como projetar um algoritmo que deve relatar o progresso para alguma entidade externa, usando o estado do algoritmo e da entidade externa?