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 <input file> <output file>\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 …