[Organização] Modularização - UnbDroid/SEK GitHub Wiki

O que é?

Modularizar é quebrar um problema em pequenas partes, sendo que cada uma dessas partes será responsável pela realização de uma etapa do problema. Por exemplo, se seu problema é criar um robô que simule um ônibus, você pode dividir as partes da programação em movimentação, rota, identificação de pessoas, mecanismos para embarcar os passageiros, e entre diversos outros.

Para o arquivo do NXC, fazemos essa organização em diretórios. Dentro do diretório source, devem existir duas pastas e os arquivos principais. A pasta include deverá conter os arquivos de cabeçalho (headers), nestes arquivos conterá as definições das diretivas de pré-processamento e funções de cada biblioteca. A pasta lib conterá as declaração das funções definidas em seu header. E os arquivos que deverão existir na pasta source devem ser somente os quais você compilará para o NXT.

├── root
    └── source
        ├── include
        │   └── teste.h
        ├── lib
        │   └── teste.nxc
        └── main.nxc

Motivação

  • Divisão fisica do código de acordo com sua função
  • Códigos curtos e mais gerenciáveis
  • Facilita o entendimento do código
  • Facilita a reutilização do código

Arquivos Headers

O header (arquivo “.h”) em si contém apenas as estruturas necessárias, os protótipos (declarações) das funções a serem implementadas no arquivo “.nxc” (ambos devem ter o mesmo nome) e as bibliotecas padrões.

Arquivo teste.h:

#ifndef TEST_HEADER
#define TEST_HEADER

#define WORD "Hello World"

void say_hello(int times);

#endif

Arquivos de Biblioteca

O arquivo “.nxc”, é onde de fato se implementam (define) as funções, inclui apenas o “.h” (com aspas, indicando que se trata de um arquivo localizado na mesma pasta) criado, que por sua vez incluirá as bibliotecas padrões.

Arquivo teste.nxc:

#include "include/teste.h"

void say_hello(int times){
  for(int i = 0; i < times; i++){
    print(WORD);
  }
}

Incluindo a Modularização

E no arquivo principal contendo a função main() inclui-se o “.nxc” criado, também utilizando aspas.

Arquivo main.nxc:

#ifndef INCTEST
  #include "lib/test.nxc"
  #define INCTEST
#endif

int main(){
  say_hello(3);
}

Observações

  • Esta modularização é considerada apenas uma adaptação para a linguagem. A modularização correta não foi feita pois não conseguimos utilizar Makefiles
  • As linhas de código que dizem #ifndef e #define são diretivas de pré-processamento para inclusão condicional. Garantindo que o mesmo arquivo não seja incluido duas vezes.