Como eu combinaria 'Command' e 'Composite' para simular um atraso de tempo?

9

Como um exercício de aprendizado (não estou na escola - apenas um rapaz tentando aprender algo novo), estou tentando escrever uma simulação de porta lógica que incorpore atraso de propagação. O usuário também deve poder agrupar portas para criar objetos de nível superior.

Quero aplicar padrões de design ao meu problema, mas estou tendo dificuldades.

Estou lendo o Head First Design Patterns e vejo que o padrão Command é uma boa maneira de simular pulsos elétricos através de um circuito com atraso. Também vejo que o padrão Composite é uma boa maneira de simular unidades aninhadas. Só não sei como misturar os dois.

Em outras palavras, enquanto atravesso meus portões, vejo que o portão 'x' deve disparar. Ele tem um atraso de 15 nanossegundos, então eu crio um comando com um carimbo de data / hora de 15 ns do tempo atual do jogo. Onde está o expedidor? No exemplo do restaurante, com o comando "Order", a garçonete e o cozinheiro enviam o comando e têm a opção de introduzir um atraso. Se eu tenho um portão 'composto', ele também possui seu próprio despachante? Preciso usar um Singleton para gerenciar a fila?

Li o que pude encontrar, mas ainda preciso de um empurrão na direção certa:

Neil Mussett
fonte
9
Padrões são ferramentas. Não se usa martelo e chave de fenda e acho que vou construir uma casa. Em vez disso, comece a construir uma casa e perceba onde um martelo facilitaria o trabalho.
Isso não responde exatamente à minha pergunta. Eu já tenho um aplicativo Java grande, que passa mensagens de porta em porta. No entanto, estou tentando incorporar o atraso de propagação e acho que o design do meu aplicativo não pode lidar com isso facilmente. Eu estava esperando padrões de projeto poderia ajudar ...
Neil Mussett
4
Você está procurando simulação de eventos discretos - como cron, mas sem tempo 'real'. Crie isso e reconheça "oh, estou construindo um composto aqui - eu sei como fazer isso" em vez de procurar uma maneira de inserir um composto na solução.
11
Em particular, você pode encontrar uma estrutura de dados eficiente para o conjunto de eventos de simulação das comunicações da ACM de agosto de 1977, volume 20, número 8 bastante útil (uma pesquisa no google por esse título deve exibir um pdf - estou tendo problemas para vincular a it) - analisa o conceito de implementação da estrutura de dados que é significativamente aprimorada em uma lista indexada.
11
Aqui está um link para o artigo da ACM hospedado no citeseerx.
26413 Frank

Respostas:

1

Você pode querer ver um exemplo de Programação no Scala , pois eles têm um simulador que faz o que você está tentando fazer em Java:

http://www.cs.helsinki.fi/u/wikla/OTS/Sisalto/examples/html/ch30.html#sec6

Observando a abordagem deles, você pode descobrir como alterar seu programa para obter o comportamento desejado.

Você mencionou que não pode adicioná-lo facilmente, então por que não explicar qual é a sua abordagem e qual é a dificuldade que você encontra, para que as pessoas possam lhe dar algumas sugestões que você pode não ter considerado.

Como mencionado, os padrões de design são maneiras de falar sobre o que seu código está fazendo, como uma abreviação, mas a idéia de tentar forçar os padrões de design parece uma má ideia.

Basicamente, um atraso de propagação não deve ser difícil.

Você pode ter uma classe base que é Gate, e nela colocar um atraso.

Todos os portões se estendem disso e definem o atraso real.

Agora, quando você está seguindo um sinal, quando em um portão, esse encadeamento pode dormir pelo atraso simulado, mas isso também significa que você precisa mapear o tempo real para o tempo simulado, pois o simulador será mais lento que um sistema real seria.

Se você achar que tem muitos threads, basta colocar em uma lista classificada, a seguir no topo, e quando você parar, basta colocar o tempo em que o atraso está concluído e, em cada loop, o simulador selecionará aqueles que estão prontos agora , execute a próxima ação e o próximo atraso acontecerá.

Isso seria semelhante a um loop de jogo.

James Black
fonte
0

Em outras palavras, enquanto atravesso meus portões, vejo que o portão 'x' deve disparar.

Então você não está usando o padrão de comando.

Se eu tenho um portão 'composto', ele também possui seu próprio despachante?

Querido Deus não. O ponto inteiro do padrão composto é que você pode fornecer um objeto composto para um local que espera apenas um objeto. Isso permite que você componha o comportamento de maneira sã.

Preciso usar um Singleton para gerenciar a fila?

De jeito nenhum. Você tem apenas uma cozinheira e uma garçonete em todo o mundo? Eles têm apenas uma cozinha?

A mistura do comando e do padrão composto é bastante direta. Você tem alguma interface que representa um comando. Cada comando concreto pode substituir (ou satisfazê-lo em linguagens sem herança) essa interface para fornecer algum comportamento. Seu atraso é um desses comportamentos simples.

O padrão composto fornece dois (ou mais) objetos / comportamentos atrás de uma única interface. O uso mais simples para este exemplo seria um comando composto que usa dois outros comandos e, quando solicitado a executar, aciona os dois comandos armazenados. Dessa forma, você pode usar seu comando 'delay' isolado e qualquer outro comando arbitrário para criar um comando atrasado.

Telastyn
fonte