我正在尝试重构代码,由于对编程非常陌生,因此很难知道从哪里开始。
我尝试将方法注释放在类CommentedPost下,就像并且与众不同,但是我不知道该怎么办了。
Post.java
public class Post {
private String username; // username of the post's author
private long timestamp;
private int likes;
private ArrayList<String> comments;
/**
* Constructor for objects of class Post.
*
* @param author The username of the author of this post.
*/
public Post(String author)
{
username = author;
timestamp = System.currentTimeMillis();
likes = 0;
comments = new ArrayList<String>();
}
/**
* Record one more 'Like' indication from a user.
*/
public void like()
{
likes++;
}
/**
* Record that a user has withdrawn his/her 'Like' vote.
*/
public void unlike()
{
if (likes > 0) {
likes--;
}
}
/**
* Add a comment to this post.
*
* @param text The new comment to add.
*/
public void addComment(String text)
{
comments.add(text);
}
/**
* Return the time of creation of this post.
*
* @return The post's creation time, as a system time value.
*/
public long getTimeStamp()
{
return timestamp;
}
/**
* Display the details of this post.
*
* (Currently: Print to the text terminal. This is simulating display
* in a web browser for now.)
*/
public void display()
{
System.out.println(username);
System.out.print(timeString(timestamp));
if(likes > 0) {
System.out.println(" - " + likes + " people like this.");
}
else {
System.out.println();
}
if(comments.isEmpty()) {
System.out.println(" No comments.");
}
else {
System.out.println(" " + comments.size() + " comment(s). Click here to view.");
}
}
/**
* Create a string describing a time point in the past in terms
* relative to current time, such as "30 seconds ago" or "7 minutes ago".
* Currently, only seconds and minutes are used for the string.
*
* @param time The time value to convert (in system milliseconds)
* @return A relative time string for the given time
*/
private String timeString(long time)
{
long current = System.currentTimeMillis();
long pastMillis = current - time; // time passed in milliseconds
long seconds = pastMillis/1000;
long minutes = seconds/60;
if(minutes > 0) {
return minutes + " minutes ago";
}
else {
return seconds + " seconds ago";
}
}
}
CommentedPost.java
public class CommentedPost extends Post {
public CommentedPost(String author) {
super(author);
// TODO Auto-generated constructor stub
}
}
EventPost.java
public class EventPost extends Post{
public EventPost(String author) {
super(author);
// TODO Auto-generated constructor stub
}
}
MessagePost.java
public class MessagePost extends Post{
private String message; // an arbitrarily long, multi-line message
/**
* Constructor for objects of class MessagePost.
*
* @param author The username of the author of this post.
* @param text The text of this post.
*/
public MessagePost(String author, String text)
{
super(author);
message = text;
}
/**
* Return the text of this post.
*
* @return The post's message text.
*/
public String getText()
{
return message;
}
/**
* Display the details of this post.
*
* (Currently: Print to the text terminal. This is simulating display
* in a web browser for now.)
*/
public void display()
{
super.display();
System.out.println(message);
}
}
StartNetwork.java
public class StartNetwork{
/**
* @param args
*/
public static void main( String[] args )
{
MessagePost message = new MessagePost("White Rabbit", "Oh dear, oh dear, I shall be late!");
PhotoPost photo = new PhotoPost("Alice Wonderland", "RabbitHole.jpg" ,"Down the rabbit hole :)");
message.addComment( "Your watch is exactly two days slow." );
photo.like();
NewsFeed news = new NewsFeed();
news.addPost( message );
news.addPost( photo );
news.show();
}
}
PhotoPost.java
public class PhotoPost extends Post{
private String filename; // the name of the image file
private String caption; // a one line image caption
/**
* Constructor for objects of class PhotoPost.
*
* @param author The username of the author of this post.
* @param filename The filename of the image in this post.
* @param caption A caption for the image.
*/
public PhotoPost(String author, String filename, String caption)
{
super(author);
this.filename = filename;
this.caption = caption;
}
/**
* Return the file name of the image in this post.
*
* @return The post's image file name.
*/
public String getImageFile()
{
return filename;
}
/**
* Return the caption of the image of this post.
*
* @return The image's caption.
*/
public String getCaption()
{
return caption;
}
/**
* Display the details of this post.
*
* (Currently: Print to the text terminal. This is simulating display
* in a web browser for now.)
*/
public void display()
{
super.display();
System.out.println(" [" + filename + "]");
System.out.println(" " + caption);
}
}
NewsFeed.java
public class NewsFeed{
private ArrayList<Post> posts;
/**
* Construct an empty news feed.
*/
public NewsFeed()
{
posts = new ArrayList<Post>();
}
/**
* Add a post to the news feed.
*
* @param post The post to be added.
*/
public void addPost(Post post)
{
posts.add(post);
}
/**
* Show the news feed. Currently: print the news feed details
* to the terminal. (To do: replace this later with display
* in web browser.)
*/
public void show()
{
// display all posts
for(Post post : posts) {
post.display();
System.out.println(); // empty line between posts
}
}
}
重构后的代码应该具有一个带有以下内容的类图:
带字段用户名和时间戳发布
带字段喜欢和评论的CommentedPost(箭头指向Post,即继承自Post)
带字段eventType的EventPost(指向Post的箭头)
带字段消息的消息发布(指向CommentedPost的箭头)
带字段文件名和标题的PhotoPost(指向CommentedPost的箭头)
最佳答案
帖子包含喜欢和评论。您应该将这些字段移到CommentedPost。
我不确定eventType是什么字段,但是EventPost没有这样的字段。您应该创建它。
根据您的描述,MessagePost应该扩展CommentedPost。它不是;相反,它扩展了Post。您应该对此进行更改,以使其扩展CommentedPost。
根据您的描述,PhotoPost应该扩展CommentedPost。它不是;相反,它扩展了Post。您应该对此进行更改,以使其扩展CommentedPost。