简体   繁体   English

我应该在同一个类中实现这两个接口吗?

[英]Should I implement the two interfaces in the same class?

I have Two interfaces: Normalizer and ScoringSummary as follow:我有两个接口: NormalizerScoringSummary如下:

  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:这是来自 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?如何在一个 java 类中实现这两个接口? And do I need any dependency or other frameworks to parse CSV?我是否需要任何依赖项或其他框架来解析 CSV?

You don't necessarily need a dependency or framework to handle CSV data.您不一定需要依赖项或框架来处理 CSV 数据。 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具有嵌套ScoringSummary实现的Normalizer ScoringSummary实现

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实现NormalizerScoringSummary单个类

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

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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