Código modular ou pulverizado!?

Meu professor de compiladores ao corrigir alguns fontes meus, disse que meu código estava muito pulverizado, separei os módulos funcionais de maneira clara e concisa, agora não sei o que fazer!
Qual a diferença de um código Pulverizado de um código Modularizado?
Afinal de contas a navegação de código, caso que ocorre quando um código é modularizado deve ser evitada? Devo seguir o premissa de separar as funções em sub-funções conforme níveis de complexidade?

7 anos atrás quando comecei a aprender a programar, escrevia normalmente todo o programa em um único bloco, depois de aprender várias linguagens OO e estruturadas, ler livros e aplicar como escrever um código limpo, estudar modelagem, padrões de projeto e de muita tentativa e erro essa situação acontece.

Você podia colocar alguns exemplos concretos para o pessoal discutir a partir deles. Fica mais fácil compreender exatamente o que está pensando, qual caminho está seguindo, até onde o professor tem razão na crítica ou não.

O que o professor quis dizer com pulverizado? Seria um “modularizado em excesso”?

[quote=DavidUser]Meu professor de compiladores ao corrigir alguns fontes meus, disse que meu código estava muito pulverizado, separei os módulos funcionais de maneira clara e concisa, agora não sei o que fazer!
Qual a diferença de um código Pulverizado de um código Modularizado?
Afinal de contas a navegação de código, caso que ocorre quando um código é modularizado deve ser evitada? Devo seguir o premissa de separar as funções em sub-funções conforme níveis de complexidade?
[/quote]

Sim, desde que mantenham a coesão. Normalmente pulverizar significa destruir a coesão, ou sejam funções que deviam estar juntas estão separadas ou estão demasiado em estrutrua fina (muitas subfunções de subfunções, etc) que acada que cada função faz 1 linha de código. As funções devem ser partidas, mas não se isso afetar a coeão. Em java , c consegue partir mais porque tem o escopo private que mantém a coesão. Em C por exemplo isso não é assim e se partir muito vai acabar partindo demais.

sergiotaborda Muito Obrigado pela dica, então em linguagens como C vou tentar diminuir o número de subfunções.

Este foi o fonte:
Não foi criada nenhuma outra subfunção para as funções que são chamadas aqui.

/*
 ============================================================================
 Name        : AED01TokensList.c
 Author      : david
 Version     : 1.0
 Copyright   : GNU GPL
 Description : Tokenizer in C, should be use in comandline
 ============================================================================
 */

#define DEBUG
#define DEBUG_FILES_CONTENT


#include <stdlib.h>
#include <stdio.h>
#include "tokenize.h"

extern int isdigit(int);
extern int ispunct(int);

void tokenizeInputAndPrintOrderly(FILE *, FILE *);

/*
 * @definition	tokenize archive print on output arquive the digit numbers and operators by line, in this order.
 * @param argv[1]	input data archive
 * @param argv[2]	output data archive
 */
int main(int argc, const char *argv[]) {
#ifdef DEBUG
#	define INPUT_SRC "input.txt"
#	define OUTPUT_SRC "output.txt"
#else
#	define INPUT_SRC argv[1]
#	define OUTPUT_SRC argv[2]
	const int NUMBER_OF_ARGUMENTS_INVALID = argc < 3;
	if (NUMBER_OF_ARGUMENTS_INVALID)
		printf("try to correct syntax:\n%s <input file> <output file>\n", argv[0]), exit(-1);
#endif

	FILE *inputStream = fopen(INPUT_SRC, "rt");
	FILE *outputStream = fopen(OUTPUT_SRC, "wt");

#ifndef DEBUG
	if (!inputStream) printf("%s archive not found!", INPUT_SRC);
	if (!outputStream) printf("%s archive not found!", OUTPUT_SRC);
#endif

	tokenizeInputAndPrintOrderly(inputStream, outputStream);

	fclose(inputStream);
	fclose(outputStream);

#ifdef DEBUG_FILES_CONTENT
	puts("Input file \""INPUT_SRC"\" content:\n");
	system("more "INPUT_SRC);
	puts("\n\nOutput file \""OUTPUT_SRC"\" content:\n");
	system("more "OUTPUT_SRC);
#endif

	return EXIT_SUCCESS;
}

/**
 * Print in output file the input file tokenized and classified
 *
 * @param inputStream file to input
 * @param outputStream file to output
 */
void tokenizeInputAndPrintOrderly(FILE *inputStream, FILE *outputStream) {
	LinkedList *tokenListOfInputArchive = generateTokenLinkedList(inputStream,
			isdigit, //filter function to type 1
			ispunct, //filter function to type 2
			NULL);

	#define DIGIT_TYPE 1
	#define PUNCT_TYPE 2

	printTokensByType(tokenListOfInputArchive, outputStream,
			DIGIT_TYPE,
			PUNCT_TYPE,
			NULL);
	delete_TokenLinkedList(tokenListOfInputArchive);
}

Exceto pelo monte de #defines, eu acho que seu código está ok. :shock:

Melhor?

[code]/*

Name : AED01TokensList.c
Author : david
Version : 1.0
Copyright : GNU GPL
Description : Tokenizer in C, should be use in comandline

*/

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include “tokenize.h”

#define DEBUG

extern int isdigit(int);
extern int ispunct(int);

void tokenizeInputAndPrintOrderly(FILE *, FILE *);

/*

  • @definition tokenize archive print on output arquive the digit numbers and operators by line, in this order.
  • @param argv[1] input data archive
  • @param argv[2] output data archive
    */
    int main(int argc, const char *argv[]) {

#define INPUT_SRC argv[1]
#define OUTPUT_SRC argv[2]
#ifdef DEBUG
argc = 3;

define INPUT_SRC “input.txt”

define OUTPUT_SRC “output.txt”

#endif

const int NUMBER_OF_ARGUMENTS_INVALID = argc != 3;
if (NUMBER_OF_ARGUMENTS_INVALID)
	printf("try to correct syntax:\n%s &lt;input file&gt; &lt;output file&gt;\n", argv[0]), exit(-1);

FILE *inputStream = fopen(INPUT_SRC, "rt");
FILE *outputStream = fopen(OUTPUT_SRC, "wt");

if (!inputStream) printf("%s archive not found!", INPUT_SRC);
if (!outputStream) printf("%s archive not found!", OUTPUT_SRC);

tokenizeInputAndPrintOrderly(inputStream, outputStream);

fclose(inputStream);
fclose(outputStream);

#ifdef DEBUG
system(“more “INPUT_SRC);
puts(”---------------------------------------------”);
system("more "OUTPUT_SRC);
#endif

return EXIT_SUCCESS;

}

/**

  • Print in output file the input file tokenized and classified

  • @param inputStream file to input

  • @param outputStream file to output
    */
    void tokenizeInputAndPrintOrderly(FILE *inputStream, FILE *outputStream) {
    LinkedList *tokenListOfInputArchive = generateTokenLinkedList(inputStream,
    isdigit, //filter function to type 1
    ispunct, //filter function to type 2
    NULL);

    #define DIGIT_TYPE 1
    #define PUNCT_TYPE 2

    printTokensByType(tokenListOfInputArchive, outputStream,
    DIGIT_TYPE,
    PUNCT_TYPE,
    NULL);
    delete_TokenLinkedList(tokenListOfInputArchive);
    }
    [/code]

[quote=DavidUser]sergiotaborda Muito Obrigado pela dica, então em linguagens como C vou tentar diminuir o número de subfunções.

Este foi o fonte:
Não foi criada nenhuma outra subfunção para as funções que são chamadas aqui.
[/quote]

É… seu codigo parece perfeitmente normal. Não sei realmente o que seu prof quer dizer …