Last active
November 9, 2023 12:52
-
-
Save yegor256/6335539 to your computer and use it in GitHub Desktop.
quiz.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Please review the class below and suggest improvements. How would | |
* you refactor this class if it would be in a real-life project? | |
* There are many problems here, both high-level design mistakes, | |
* and low-level implementation bugs. We're interested to see high-level | |
* problems first, since they are most critical. The more mistakes | |
* you can spot, the better programmer you are. | |
*/ | |
/** | |
* This class is thread safe. | |
*/ | |
public class Parser { | |
private File file; | |
public synchronized void setFile(File f) { | |
file = f; | |
} | |
public synchronized File getFile() { | |
return file; | |
} | |
public String getContent() throws IOException { | |
InputStream i = new FileInputStream(file); | |
String output = ""; | |
int data; | |
while ((data = i.read()) > 0) { | |
output += (char) data; | |
} | |
return output; | |
} | |
public String getContentWithoutUnicode() throws IOException { | |
InputStream i = new FileInputStream(file); | |
String output = ""; | |
int data; | |
while ((data = i.read()) > 0) { | |
if (data < 0x80) { | |
output += (char) data; | |
} | |
} | |
return output; | |
} | |
public void saveContent(String content) throws IOException { | |
OutputStream o = new FileOutputStream(file); | |
for (int i = 0; i < content.length(); i += 1) { | |
o.write(content.charAt(i)); | |
} | |
} | |
} |
/**
* Made this class fully public for next extend cases
* For now it's unclear is this need to split FileContent class to different ones
*
* F.e. ParsedFile could have two methods returning SimpleContent and UnicodeFreeContent
* And each *Content class could have unique logic in it
*
* ParsedFile is thread safe because of immutability
*/
class FileContent {
private final String raw;
public FileContent(String rawContent) {
this.raw = rawContent;
}
public String text() {
return this.raw;
}
}
class ParsedFile {
private final InputStream fileInputStream;
public ParsedFile(InputStream fileInputStream) {
this.fileInputStream = fileInputStream;
}
public FileContent content() {
String content = "bytes converted to string";
return new FileContent(content);
}
public FileContent contentUnicodeFree() {
String content = "bytes converted to string without unicode";
return new FileContent(content);
}
}
class DefaultParsedFileUsage {
public static void main(String[] args) {
File file = new File("path");
try(InputStream is = new FileInputStream(file)) {
ParsedFile parsedFile = new ParsedFile(is);
FileContent fileContent = parsedFile.content();
String fileText = fileContent.text();
// next code
} catch (IOException ioException) {
// logging exception
}
}
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Я бы использовал библиотеку apache commons, кода станет в разы меньше: