简体   繁体   中英

Should I implement the two interfaces in the same class?

I have Two interfaces: Normalizer and ScoringSummary as follow:

  1. Normalizer:

     public interface Normalizer { /** * Accepts a <code>csvPath</code> for a CSV file, perform a Z-Score normalization against * <code>colToStandardize</code>, then generate the result file with additional scored column to * <code>destPath</code>. * * @param csvPath path of CSV file to read * @param destPath path to which the scaled CSV file should be written * @param colToStandardize the name of the column to normalize * @return */ ScoringSummary zscore(Path csvPath, Path destPath, String colToStandardize); /** * Accepts a <code>csvPath</code> for a CSV file, perform a Min-Max normalization against * <code>colToNormalize</code>, then generate the result file with additional scored column to * <code>destPath</code>. * * @param csvPath path of CSV file to read * @param destPath path to which the scaled CSV file should be written * @param colToNormalize the name of the column to normalize * @return */ ScoringSummary minMaxScaling(Path csvPath, Path destPath, String colToNormalize); }
  2. ScoringSummary:

     public interface ScoringSummary { public BigDecimal mean(); public BigDecimal standardDeviation(); public BigDecimal variance(); public BigDecimal median(); public BigDecimal min(); public BigDecimal max(); }

And here is a function from the TDD:

@Test
    public void givenMarksCSVFileToScale_whenMarkColumnIsZScored_thenNewCSVFileIsGeneratedWithAdditionalZScoreColumn() throws IOException {
        String filename = "marks.csv";
        Path induction = Files.createTempDirectory("induction");
        String columnName = "mark";
        Path csvPath = induction.resolve(filename);
        Path destPath = induction.resolve("marks_scaled.csv");
        copyFile("/marks.csv", csvPath);
        Assertions.assertTrue(Files.exists(csvPath));

        Normalizer normalizer = normalizer();
        ScoringSummary summary = normalizer.zscore(csvPath, destPath, columnName);
        Assertions.assertNotNull(summary, "the returned summary is null");

        Assertions.assertEquals(new BigDecimal("66.00"), summary.mean(), "invalid mean");
        Assertions.assertEquals(new BigDecimal("16.73"), summary.standardDeviation(), "invalid standard deviation");
        Assertions.assertEquals(new BigDecimal("280.00"), summary.variance(), "invalid variance");
        Assertions.assertEquals(new BigDecimal("65.00"), summary.median(), "invalid median");
        Assertions.assertEquals(new BigDecimal("40.00"), summary.min(), "invalid min value");
        Assertions.assertEquals(new BigDecimal("95.00"), summary.max(), "invalid maximum value");

        Assertions.assertTrue(Files.exists(destPath), "the destination file does not exists");
        Assertions.assertFalse(Files.isDirectory(destPath), "the destination is not a file");

        List<String> generatedLines = Files.readAllLines(destPath);
        Path assertionPath = copyFile("/marks_z.csv", induction.resolve("marks_z.csv"));
        List<String> expectedLines = Files.readAllLines(assertionPath);
        assertLines(generatedLines, expectedLines);
    }

How can I implement these two interfaces in one java class? And do I need any dependency or other frameworks to parse CSV?

You don't necessarily need a dependency or framework to handle CSV data. However, using an existing library is much easier than implementing everything on your own.

There are many different ways to implement these two interfaces. Your implementation just needs to fulfil their contracts. Below are some examples:

Two separate classes

public class NormalizerImplSplit implements Normalizer {

    @Override
    public ScoringSummary zscore(Path csvPath, Path destPath, String colToStandardize) {
        // process CSV and store summary results
        ScoringSummaryImpl summary = new ScoringSummaryImpl();
        summary.setMean(new BigDecimal("66.00"));

        // return summary object
        return summary;
    }

    // other method of Normalizer

}

public class ScoringSummaryImpl implements ScoringSummary {

    private BigDecimal mean;

    public void setMean(BigDecimal mean) {
        this.mean = mean;
    }

    @Override
    public BigDecimal mean() {
        return this.mean;
    }

    // other methods of ScoringSummary
}

Normalizer implementation with nested ScoringSummary implementation

public class NormalizerImplNested implements Normalizer {

    @Override
    public ScoringSummary zscore(Path csvPath, Path destPath, String colToStandardize) {
        // process CSV and store summary results
        ScoringSummaryImpl summary = new ScoringSummaryImpl();
        summary.setMean(new BigDecimal("66.00"));

        // return summary object
        return summary;
    }

    // other method of Normalizer

    public static class ScoringSummaryImpl implements ScoringSummary {

        private BigDecimal mean;

        private void setMean(BigDecimal mean) {
            this.mean = mean;
        }

        @Override
        public BigDecimal mean() {
            return this.mean;
        }

        // other methods of ScoringSummary
    }
}

Single class implementing Normalizer and ScoringSummary

public class NormalizerImpl implements Normalizer, ScoringSummary {

    private BigDecimal mean;

    @Override
    public ScoringSummary zscore(Path csvPath,Path destPath,String colToStandardize) {
        // process CSV and store summary results
        this.mean = new BigDecimal("66.00");

        // return this instance since ScoringSummary is also implemented
        return this;
    }

    @Override
    public BigDecimal mean() {
        return this.mean;
    }

    // other methods of the two interfaces

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM