[英]Should I implement the two interfaces in the same class?
I have Two interfaces: Normalizer
and ScoringSummary
as follow:我有两个接口:
Normalizer
和ScoringSummary
如下:
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); }
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:
下面是一些例子:
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
implementationScoringSummary
实现的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
}
}
Normalizer
and ScoringSummary
Normalizer
和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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.