- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我第一次遇到这种情况是这样的:一个 Box
类,其中包含一个包含项目的列表。所有这些项目都有一个 int Weight
实例变量。现在,要获取 Box
的重量,是否应该使用实例变量 weight
来跟踪它?或者您应该使用方法 calculateWeight()
来获取权重?
public class Box {
private ArrayList<Item> list; // Item objects in the list, all Item objects have a weight
private int weight; // Should I: use an instance variable as is seen here <- ?
public int calculateWeight() { // or use a method to calculate the weight each time?
int sum = 0;
// for all items get the weight and add it together
return sum;
}
}
现在在这个例子中,对我来说使用方法而不是实例变量更有意义,因为否则 Box
的实例变量 weight
必须每次添加或删除项目时都会更新。
但现在我正在开发一个可读性分数计算器(JetBrains 上的项目),我发现我应该做什么不太明显。可读性分数计算器获取文本并查找句子、单词、字符、音节等的数量,并使用简单的公式来计算可读性分数。目前,我一直在通过调用构造函数内部计算每个句子、单词、字符等的方法来将所有数量的句子、单词、字符等存储在实例变量中,但我不确定这是否是一个好的做法(感觉有点困惑)大部头书)。另一种方法是不将它们存储在实例变量中,而只在每次需要时使用这些方法来获取金额。这就是代码现在的样子:
public abstract class ReadabilityScoreCalculator {
protected String name;
protected String text;
protected int wordCount;
protected int sentenceCount;
protected int charCount;
protected int syllableCount;
protected int polySyllableCount;
protected double score;
protected int age;
public ReadabilityScoreCalculator(String text, String name) {
this.text = text;
this.name = name;
this.wordCount = this.countWords();
this.sentenceCount = this.countSentences();
this.charCount = this.countCharacters();
this.syllableCount = this.countSyllables();
this.polySyllableCount = this.countPolySyllables();
this.score = this.calculateAndReturnScore();
this.age = this.getAgeGroup();
}
private int countWords() {
return this.getArrayOfWords().length;
}
private String[] getArrayOfWords() {
return this.text.split("[ ]+");
}
private int countSentences() {
return this.text.split("[.!?]").length;
}
private int countCharacters() {
String textWithoutSpaces = this.removeSpaces();
return textWithoutSpaces.length();
}
private String removeSpaces() {
return this.text.replaceAll("[ ]+", "");
}
private int countSyllables() {
String[] words = this.getArrayOfWords();
int amountOfSyllables = Arrays.stream(words)
.mapToInt(word -> this.countSyllablesInWord(word))
.reduce(0, (previousCount, amountOfSyllablesInWord) -> previousCount + amountOfSyllablesInWord);
return amountOfSyllables;
}
private int countSyllablesInWord(String word) {
int amountOfSyllablesInWord = 0;
for (int i = 0, n = word.length(); i < n; i++) {
char character = word.charAt(i);
if (this.isCharVowel(character)) {
if (this.isCharVowel(word.charAt(i - 1)) || this.areWeAtTheLastCharAndDoesItEqualE(i, word)) {
continue;
}
amountOfSyllablesInWord++;
}
}
return (amountOfSyllablesInWord == 0) ? 1 : amountOfSyllablesInWord;
}
private boolean isCharVowel(char character) {
String charAsString = String.valueOf(character);
return charAsString.matches("(?i)[aeiouy]");
}
private boolean areWeAtTheLastCharAndDoesItEqualE(int index, String word) {
int wordLength = word.length();
char currentCharacter = word.charAt(index);
return (index == (wordLength - 1) && currentCharacter == 'e');
}
private int countPolySyllables() {
String[] words = this.getArrayOfWords();
int amountOfPolySyllables = Arrays.stream(words)
.mapToInt(word -> this.countSyllablesInWord(word))
.filter(amountOfSyllablesInWord -> amountOfSyllablesInWord > 2)
.reduce(0, (previousCount, amountOfPolySyllablesInWord) -> previousCount + amountOfPolySyllablesInWord);
return amountOfPolySyllables;
}
private double calculateAndReturnScore() {
return this.calculateScore();
}
abstract double calculateScore();
public void setScore(double score) {
this.score = score;
}
public void printResults() {
System.out.println(this.name + ": " + this.score + " (about " + this.age + " year olds).");
}
public void setAgeGroup() {
this.age = this.getAgeGroup();
}
private int getAgeGroup() {
int ageGroup = 0;
switch(this.roundUpAndParseToInt(this.score)) {
case 1:
ageGroup = 6;
break;
case 2:
ageGroup = 7;
break;
case 3:
ageGroup = 9;
break;
case 4:
ageGroup = 10;
break;
case 5:
ageGroup = 11;
break;
case 6:
ageGroup = 12;
break;
case 7:
ageGroup = 13;
break;
case 8:
ageGroup = 14;
break;
case 9:
ageGroup = 15;
break;
case 10:
ageGroup = 16;
break;
case 11:
ageGroup = 17;
break;
case 12:
ageGroup = 18;
break;
case 13:
ageGroup = 24;
break;
case 14:
ageGroup = 24;
break;
}
return ageGroup;
}
public int roundUpAndParseToInt(double number) {
return (int) Math.ceil(number);
}
}
其中之一是否被视为良好实践?还是真的要视情况而定?我可以看到该方法的计算成本更高,但提供了更多的确定性。我上面的代码的任何其他问题也可能会被指出。
编辑:这是一个抽象类,calculateScore()
方法应该由继承自该类的类填充。因此,可以使用多个不同的公式来计算可读性分数。
最佳答案
一般来说,忽略使用基于计算的实例变量,而使用检索方法。更重要的是你的代码文档本身是否简洁并且易于维护。
通过使用实例变量,每次修改它们各自的属性时都需要更新它们,这可能会降低修改这些变量的方法的可读性。
例如,下面是一些修改list
并更新weight
成员变量的简单方法:
public void addItem(Item item) {
this.list.add(item);
this.weight += item.weight;
}
public Item removeItem(int i) {
Item item = this.list.remove(i);
this.weight -= item.weight;
return item;
}
public void setList(ArrayList<Item> list) {
this.list = list;
this.weight = this.calculateWeight();
}
由于您正在执行方法名称中未描述的附加操作,因此这些方法不是自文档化的。您可以将它们称为 addItemAndUpdateWeight()
之类的名称,但如果还有更多成员变量需要更新怎么办? addItemAndUpdateMemberVariables()
太模糊了,很快这些方法就会变得非常困惑并且难以维护。
您可以添加一个辅助函数来更新您的成员变量,但您仍然需要在每个此类方法中调用它,并且每次添加新的成员变量时,您都必须也更新这个方法。
另外,如果这些方法成本高昂,最好仅在需要时执行计算。
更好的解决方案是通过隔离方法的功能来保持简单:
public void addItem(Item item) {
this.list.add(item);
}
public Item removeItem(int i) {
return this.list.remove(i);
}
public void setList(ArrayList<Item> list) {
this.list = list;
}
您立即就清楚地知道这些方法的作用,并且不会有任何偷偷摸摸的代码让您以后感到头疼。另外,现在您不需要在构造函数中执行这些操作。
我确信可以为更复杂的情况(例如索引)建立一个案例,但这似乎超出了本讨论的范围。
关于java - 将属性存储在实例变量中还是使用方法来计算它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61915011/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!