Aula 1 de 0
Em Progresso
3.3. Manter a coesão resulta em muitas classes pequenas
Listing 10-5
PrintPrimes.j ava
package literatePrimes; public class PrintPrimes { public static void main (String [] args) { final int M = 1000; final int RR = 50; final int CC = 4; final int WW = 10; final int ORDMAX =30; int P[] = new int [M + 1]; int PAGENÜMBER; int PAGEOFFSET; int ROWOFFSET; int C; int J; int K; boolean JPRIME; int ORD; int SQUARE; int N; int MULT[] = new int[ORDMAX + 1]; J = 1; K = 1; P[l] = 2; ORD = 2; SQUARE = 9; while (K < M) { do ( J = J + 2; if (J == SQUARE) { ORD = ORD + 1; SQUARE = P[ORD] * P[ORD]; MULT[ORD - 1] = J; N = 2; JPRIME = true; while (N < ORD && JPRIME) { while (MULT[N] < J) MULT [N] = MULT [N] + P [N] + P [N] ; if [MULT[N] == J) JPRIME = false; N = N + 1; } while (!JPRIME); K = K + 1; P[K] = J; PAGENUMBER = 1; PAGEOFFSET = 1; while (PAGEOFFSET <= M) { System.out.printlnf"The First " + M + 11 Prime Numbers — Page 11 + PAGENUMBER) ; System.out.printlnf") ; for (ROWOFFSET = PAGEOFFSET; ROWOFFSET < PAGEOFFSET + RR; ROWOFFSET++){ for (0=0; C < CC;C++) if (ROWOFFSET + C * RR <= M) System.out.format("%10d", P[ROWOFFSET t C * RR]); System.out.printlnf") ; System.out.println("\f"); PAGENUMBER = PAGENUMBER + 1; PAGEOFFSET = PAGEOFFSET + RR * CO;
Listing 10-6
PrimePrinter.java (refactored)
package literatePrimes; public class PrimePrinter { public static void main (String [] args) { final int NUMBER_OF_PRIMES = 1000; int[] primes = PrimeGenerator.generate(NUMBER_OF_PRIMES); final int ROWS_PER_PAGE = 50; final int COLÜMNS_PER_PAGE = 4; RowColumnPagePrinter tablePrinter = new RowColumnPagePrinter(ROWS_PER_PAGE, COLÜMNS_PER_PAGE, "The First " + NÜMBER_OF_PRIMES + " Prime Numbers"); tablePrinter.print(primes);
Listing 10-7
RowColumnPagePrinter.j ava
package literatePrimes; import java.io.PrintStream; public class RowColumnPagePrinter { private int rowsPerPage; private int columnsPerPage; private int numbersPerPage; private String PageReader; private PrintStream printStream; public RowColumnPagePrinter(int rowsPerPage, int columnsPerPage, String PageReader) { this.rowsPerPage = rowsPerPage; this.columnsPerPage = columnsPerPage; this.PageReader = PageReader; numbersPerPage = rowsPerPage * columnsPerPage; printStream = System.out; public void printfint data[]) { int pageNumber = 1; for (int firstlndexOnPage = 0; firstlndexOnPage < data.length; firstlndexOnPage += numbersPerPage) { int lastlndexOnPage = Math.minffirstlndexOnPage + numbersPerPage - 1, data.length - 1); printPageHeader(pageHeader, pageNumber); printPage(firstlndexOnPage, lastlndexOnPage, data); printStream.println("\f"); pageNumber++; private void printPage(int firstlndexOnPage, int lastlndexOnPage, int [] data) { int firstlndexOfLastRowOnPage = firstlndexOnPage + rowsPerPage - 1; for (int firstlndexInRow = firstlndexOnPage; firstlndexInRow <= firstlndexOfLastRowOnPage; firstIndexInRow++) { printRow(first!ndexInRow, lastlndexOnPage, data); printStream.printlnf") ; } } private void printRowfint firstlndexInRow, int lastlndexOnPage, int [] data) { for (int column = 0; column < columnsPerPage; column++) { int index = firstlndexInRow + column * rowsPerPage; if (index <= lastlndexOnPage) printStream.format("%10d", data[index]); private void printPageHeader(String pageHeader, int pageNumber) { printStream.println(pageHeader + " — Page " + pageNumber); printStream.printlnf"); public void setOutput(PrintStream printStream) { this.printStream = printStream;
Listing 10-8
PrimeGenerator.j ava
import java.util.ArrayList; public class PrimeGenerator { private static int[] primes; private static ArrayList<Integer> multiplesOfPrimeFactors; protected static int[] generate(int n) { primes = new int[n]; multiplesOfPrimeFactors = new ArrayList<Integer>(); set2AsFirstPrime(); checkOddNumbersForSubsequentPrimes(); return primes; private static void set2AsFirstPrime() { primes [0] = 2; multiplesOfPrimeFactors.add(2); private static void checkOddNumbersForSubsequentPrimes() { int primelndex = 1; for (int candidate = 3; primelndex < primes.length; candidate += 2) { if (isPrime(candidate)) primes[primelndex++] = candidate; private static boolean isPrime(int candidate) { if (isLeastRelevantMultipleOfNextLargerPrimeFactor(candidate)) { multiplesOfPrimeFactors.add(candidate); return false; return isNotMultipleOfAnyPreviousPrimeFactor(candidate); private static boolean isLeastRelevantMultipleOfNextLargerPrimeFactor(int candidate) { int nextLargerPrimeFactor = primes[multiplesOfPrimeFactors.size()]; int leastRelevantMultiple = nextLargerPrimeFactor * nextLargerPrimeFactor; return candidate == leastRelevantMultiple; private static boolean isNotMultipleOfAnyPreviousPrimeFactor(int candidate) { for (int n = 1; n < multiplesOfPrimeFactors.sizeO ; n++) { if (isMultipleOfNthPrimeFactor(candidate, n)) return false; return true; private static boolean isMultipleOfNthPrimeFactor(int candidate, int n) { return candidate == smallestOddNthMultipleNotLessThanCandidate(candidate, n); private static int smallestOddNthMultipleNotLessThanCandidate(int candidate, int n) { int multiple = multiplesOfPrimeFactors.get(n); while (multiple < candidate) multiple += 2 * primes[n]; multiplesOfPrimeFactors.set(n, multiple); return multiple;