Divida um arquivo grande em módulos separados em C/C++, Java e Python

| | | | | | | | | | |

Essa abordagem está fadada ao fracasso e geralmente requer reescrita do zero.

Então, para resolver esse cenário, podemos tentar dividir o problema em vários subproblemas e tentar resolvê-lo um por 1.

Isso não apenas facilita nossa tarefa, mas também nos permite alcançar a

Agora a grande questão é como "quebrar" não teoricamente, mas SOFTWARE .

Veremos vários tipos diferentes dessas unidades em linguagens populares ‚Äã‚Äãcomo C/C++, Python e Java.

C / C++

Para fins ilustrativos,

Vamos supor que temos todas as inserções de listas encadeadas básicas em um programa. Como existem muitos métodos (funções), não podemos sobrecarregar o programa escrevendo todas as definições de métodos acima da função principal necessária. Mas mesmo que o fizéssemos, poderia haver um problema de ordenação de métodos, quando um método deveria estar antes de outro e assim por diante.

Então, para resolver esse problema, podemos declarar todos os protótipos no início de o programa, e depois o método main e abaixo podemos defini-los em qualquer ordem específica:

Program:

FullLinkedList.c


// inserir uma lista encadeada completa


# include "stdio.h >
# inclui "stdlib.h >


// ------------ -------------- ------
// Anúncios - START:
// ------ --------------------------


struct Nó;

struct Node * create_node ( int dados);

void b_insert ( struct Node ** head, int data);

void n_insert ( struct Node ** head, int dados, int pos);

void e_insert ( struct Node ** head, int data);

void display ( struct Node * temp);


// ------------ -------------- ------
// Anúncios - END:
// ------ --------------------------


int main ()

{

struct Nó * head = NULL;


int ch, data, pos;


printf ( " Lista encadeada: " );

while (1) {

printf ( "1.Inserir no início" );

printf ( "2.Insert na enésima posição" );

printf ( "3.Insert No final" );

printf ( "4.Display " );

printf ( "0.Exit " );

printf ( "Digite sua escolha :" );

scanf ( "% d" , & amp; ch);


switch (ch) {

case 1:

printf ( "Digite o data:" );

scanf ( "% d" , & amp; dados);

b_insert (& amp; head, data);

break ;


case 2:

printf ( "Digite o data:" );

scanf ( "% d" , & amp; dados);


printf ( " Digite a Posição: " );

scanf ( "% d" , & amp; pos);

n_insert (& amp; head, data, pos);

break ;


case 3:

printf ( "Digite o data:" );

scanf ( "% d" , & amp; dados);

e_insert (& amp; head, data);

break ;


case 4:

display (head);

break ;


case 0:

return 0;


default :

printf ( "Escolha errada" );

}

}

}


// ---------------- ---------- ------
// Definições - START:
// ---- ----------------------------


struct Nó {

int < classe de código ="simples "> dados;

struct Nó * próximo;

};


struct Node * create_node ( int dados)

{

struct Node * temp

= ( struct Node *)

malloc ( sizeof ( struct Nó));

temp- > dados = dados;

temp- > próximo = NULL;


return temp;

}


void b_insert ( struct Node ** head, int dados)

{

struct Node * new_node = create_node (data);


new_node- > próximo = * cabeça;

* head = new_node;

}


void n_insert ( struct Node ** head, int dados, int pos)

{

if (* head == NULL) {

b_insert (head, data);

return ;

}


struct Node * new_node = create_node (data);


struct Node * temp = * head;


para ( int i = 0; i "pos - 2; ++ i)

temp = temp- > Próximo;


new_node- > próximo = temp- > Próximo;

temp- > próximo = new_node;

}


void e_insert ( struct Node ** head, int dados)

{

if (* head == NULL) {

b_insert (head, data);

return ;

}


struct Node * temp = * head;


while (temp- > next! = NULL)

temp = temp- > Próximo;


struct Node * new_node = create_node (data);

temp- > próximo = new_node;

}


void display ( struct Node * temp)

{

printf ( "Os elementos são:" );

while (temp! = NULL) {

printf ( "% d" , temp- > dados);

temp = temp- > Próximo;

}

printf ( " " );

}


// ------ --------------------------
// Definições - END
// ---------- -----------

Compilando o código: podemos compilar o programa acima:

 gcc linkedlist.c -o linkedlist 

E funciona!

Os principais problemas no código acima:
Já podemos ver os principais problemas com o programa, não é tão fácil trabalhar com o código individualmente ou em grupo .

Se alguém quiser trabalhar com o acima programa, então alguns dos muitos problemas que a pessoa está enfrentando:

  1. É preciso passar pelo arquivo fonte completo. para melhorar ou melhorar alguma funcionalidade.
  2. Não pode ser facilmente reutilizado o programa como base para outros projetos.
  3. O código é muito confuso e não é nada atraente, o que torna muito difícil navegar pelo código.

No caso de um projeto em grupo ou de grandes programas, a abordagem acima garante o aumento dos custos gerais, energia e taxas de falhas.

Abordagem correta:

Vemos que essas linhas começam em todo programa C/C++ que começa com "#include".
Isso significa inclua todas as funções declaradas no cabeçalho "library" (arquivos .h) e definidas possivelmente em arquivos library.c/cpp .

Essas linhas são pré-processadas em tempo de compilação.

Podemos tentar criar manualmente essa biblioteca para nossos próprios propósitos.

Coisas importantes a serem lembradas :

  1. Os arquivos ".h" contêm apenas declarações de protótipo (como funções, estruturas) e variáveis globais.
  2. Os arquivos ".c / .cpp" contêm a implementação real (definições de declaração em arquivos de cabeçalho)
  3. Ao compilar todos os arquivos de origem, certifique-se de que várias definições da mesma função, variável, etc. não existem para o mesmo projeto. (MUITO IMPORTANTE)
  4. Use funções estáticas, para restringir-se ao arquivo no qual elas são declaradas.
  5. Use a palavra-chave extern para usar variáveis referenciadas por e arquivos externos.
  6. Ao usar C++, tenha cuidado com namespaces, sempre use namespace_name:: function(), para evitar colisões.
  7. Ao dividir o programa em códigos menores:
    Depois de examinar o programa acima, podemos ver como esse grande programa pode ser dividido em pequenas partes adequadas e então facilmente processado.

    O programa acima tem essencialmente 2 funções principais:
    1) Criar, inserir e salvar dados em nós.
    2) Exibir nós


    Dessa forma eu posso dividir o programa de acordo para que:
    1) O arquivo principal seja > Driver do programa, Nice Wrapper dos Módulos de Inserção e onde usamos arquivos adicionais.
    2) Colar - > A implementação real está aqui.

    Com os pontos importantes mencionados, o programa é dividido em:

    linkedlist.c - > Contém Programa de Driver
    inserir.c - > Contém código para inserção

    linkedlist.h - > Contém as declarações de Node necessárias
    insert.h - > Contém as Declarações de Inserção de Nó necessárias

    Em cada arquivo de cabeçalho começamos com:

     #ifndef FILENAME_H #define FILENAME_H Declarações ... #endif 

    A razão pela qual escrevemos nossas declarações entre #ifndef, #define e #endif, é para evitar múltiplas declarações de identificadores, como tipos de dados, variáveis, etc., quando um e o mesmo arquivo de cabeçalho é chamado em um novo arquivo pertencente ao mesmo projeto.

    Para este programa de amostra:

    inserir.h - > Contém a declaração do nó de inserção, bem como a declaração do próprio nó.

    É muito importante lembrar que o compilador pode ver as declarações no arquivo de cabeçalho, mas se você tentar escrever um código que incluir a declaração em outro lugar, isso resultará em um erro, pois o compilador compila cada arquivo .c individualmente antes de passar para a etapa de link. ,

    connectedlist.h - > Um arquivo auxiliar que contém o Node e suas declarações de exibição que devem ser incluídas para os arquivos que os utilizam.


    insert.c - > Inclua uma declaração Node via #include "connectedlist.h", que contém a declaração, bem como todas as outras definições de método declaradas em insert.h.

    connectedlist.c - > Simple Wrapper, contendo um loop infinito solicitando ao usuário que insira dados inteiros nas posições necessárias e também contendo um método que exibe a lista.

    E a última coisa a ter em mente é que não tem sentido a inclusão de arquivos entre si pode levar a várias substituições (s) e resultará em um erro.

    Tendo em conta o que foi dito acima, você deve dividir cuidadosamente em rotinas adequadas.

    linkedlist.h


    // connectlist.h


    # ifndef LINKED_LIST_H
    # define LINKED_LIST_H


    struct Nó {

    int dados;

    struct Nó * próximo;

    };


    void display ( struct Nó * temp);


    # endif

    insert.h


    // insert.h


    # ifndef INSERT_H
    #define INSERT_H


    struct Node;

    struct Node * create_node ( int dados);

    void b_insert ( struct Node ** head, int data);

    void n_insert ( struct Node ** head, int dados, int pos);

    void e_insert ( struct Node ** head, int data);


    # endif

    insert.c


    // insert.c


    # inclui "linkedlist.h"
    // & quot; " então o pré-processador procura
    // para o diretório atual e
    // arquivos de biblioteca padrão posteriormente.


    # inclui "stdlib.h >


    struct Node * create_node ( int dados)

    {

    struct Node * temp = ( struct Nó *) malloc ( sizeof ( struct Node));

    temp- > dados = dados;

    temp- > próximo = NULL;


    return temp;

    }


    void b_insert ( struct Node ** head, int dados)

    {

    struct Node * new_node = create_node (data);


    new_node- > próximo = * cabeça;

    * head = new_node;

    }


    void n_insert ( struct Node ** head, int dados, int pos)

    {

    if (* head == NULL) {

    b_insert (head, data);

    return ;

    }


    struct Node * new_node = create_node (data);


    struct Node * temp = * head;


    para ( int i = 0; i "pos - 2; ++ i)

    temp = temp- > Próximo;


    new_node- > próximo = temp- > Próximo;

    temp- > próximo = new_node;

    <

    Shop

    Learn programming in R: courses

    $

    Best Python online courses for 2022

    $

    Best laptop for Fortnite

    $

    Best laptop for Excel

    $

    Best laptop for Solidworks

    $

    Best laptop for Roblox

    $

    Best computer for crypto mining

    $

    Best laptop for Sims 4

    $

    Latest questions

    NUMPYNUMPY

    psycopg2: insert multiple rows with one query

    12 answers

    NUMPYNUMPY

    How to convert Nonetype to int or string?

    12 answers

    NUMPYNUMPY

    How to specify multiple return types using type-hints

    12 answers

    NUMPYNUMPY

    Javascript Error: IPython is not defined in JupyterLab

    12 answers


    Wiki

    Python OpenCV | cv2.putText () method

    numpy.arctan2 () in Python

    Python | os.path.realpath () method

    Python OpenCV | cv2.circle () method

    Python OpenCV cv2.cvtColor () method

    Python - Move item to the end of the list

    time.perf_counter () function in Python

    Check if one list is a subset of another in Python

    Python os.path.join () method