[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.