Quais são alguns dos padrões de design encontrados nos principais módulos contribuídos?


10

Além Apresentação-abstração de controle e outros padrões que são utilizados no núcleo Drupal , existem outros padrões de projeto proeminente utilizados nos mais módulos contribuíram populares como Views, CCK, e recursos?


2
Conforme relatado no FAQ , "Você só deve fazer perguntas práticas e respondíveis com base nos problemas reais que enfrenta. As perguntas abertas e tagarelas diminuem a utilidade do nosso site e expulsam outras perguntas da primeira página".
kiamlaluno

1
isso pode ser um bom tópico no wiki da comunidade
#

O Wiki da comunidade não é mais usado para perguntas que não são aceitáveis ​​ou que são limítrofes. Veja o futuro da comunidade Wiki .
kiamlaluno

2
Por outro lado, acho que esse é um tópico interessante. Sugestão para uma pergunta melhor: "Existe um padrão de design que possa resolver o problema X?". Como é para isso que servem os padrões de design, resolvendo um problema, eles não devem ser usados ​​apenas para serem usados.
Berdir 17/09/11

1
@kiamlaluno, eu diria que a pergunta não é respondida, faladora ou impraticável, embora possa ser indiscutivelmente aberta. Meu objetivo ao fazer a pergunta é ter uma noção melhor de como os padrões de design são usados, no código com o qual estou familiarizado.
Matt V.

Respostas:


10

Um ponto de partida é o próprio núcleo e os padrões expostos ao contrib. - Um ótimo artigo de Larry Garfield (Crell) pode ser encontrado em um artigo do Drupal Watchdog .

Observadores, visitantes e espreitadelas

Drupal é na verdade construído sobre os padrões gêmeos de Observer e Visitor, embora não os chame pelo nome. Em vez disso, os chama de ganchos. hook_node_load(), hook_user_login()etc. são, em essência, observadores em nós e usuários. hook_form_alter(), hook_node_view()E assim por diante são, em essência, os visitantes. Como o Drupal não diferencia os dois, alguns ganchos podem ser considerados os dois padrões, mas o princípio é o mesmo.

Fábricas e comandos

Existem várias variações no padrão Factory, mas todas se resumem à mesma idéia: um objeto, um cliente, pede a outro objeto, uma fábrica, uma implementação apropriada de um pedaço de lógica, mas não se importa com o que é. . Isso depende da fábrica decidir. Considere a db_insert()função, cujos bits importantes são mostrados abaixo:

   function db_insert($table, array $options = array()) {
       // ...
       return Database::getConnection($options['target'])->insert($table, $options);
     }

O Database::getConnection()método é uma fábrica que retorna um objeto de conexão apropriado para este site.

Injeção de Dependência do Doutor Drupal

No Drupal 6, o sistema de menus foi destruído e reescrito para ser um processo de várias etapas. Agora, implementaríamos a mesma chamada de retorno de página assim:

   function example_menu() {
       $items['node/%node/example'] = array(
         'page callback' => 'example_page',
         'page arguments' => array(1),
         // ...
       );
       return $items;
     }

     function example_page($node) {
       // Do useful stuff here.
     }

Nesta nova configuração, o roteador de menus fica mais complexo. Em troca, no entanto, o retorno de chamada da página obtém o nó do qual depende passado para ele, ou seja, injetado nele. Isso nos dá uma série de benefícios.

Ir para Broke (r)

Uma abordagem comum é alguma variação na ideia de um corretor ou mediador. Nesse design, um objeto não solicita informações de outro objeto diretamente. Em vez disso, solicita que um objeto intermediário, que pode ter sido injetado nele, faça essa solicitação em seu nome. Embora ainda signifique que o primeiro objeto precisa solicitar informações ativamente, ele está fortemente acoplado ao objeto mediador e não à miríade de outros objetos dos quais ele pode precisar solicitar informações. Isso significa que, se esses outros sistemas mudarem, precisamos apenas atualizar o mediador, e não todos os sistemas que o tocam.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.